//Packs position, velocity, acceleration, and color into a SIGNED(+-) integer. public function putPVAC(p2047:int, v127:int, a7:int, c3A:int, c3R:int, c3G:int, c3B:int):int { //SIZES: HEX BITS UINT INT BIN //pos: FFF 12 4095 +-2047 1111 1111 1111 //vel: FF 8 255 +-127 1111 1111 //acc: F 4 15 +-7 1111 //clr: FF 8 255 N/A 1111 1111 // aa: 3 2 3 3 11 // rr: 3 2 3 3 11 // gg: 3 2 3 3 11 // bb: 3 2 3 3 11 //pack in position: var packed:int = p2047; packed = packed << 8; //shifting to make room for VELOCITY. //pack in velocity. if (v127 < 0) { v127 = 127 + (0 - v127);} //handle negative numbers. packed = (packed | (v127 & 0xFF)) << 4; //shifting to make room for ACCELERATION. //pack in acceleration: if (a7 < 0) { a7 = 7 + (0 - a7); } //handle negative numbers. packed = (packed | (a7 & 0xF)) << 2; //shift to make room for first color component. // 42 127 212 //0 ----- 85 ----- 170 ----- 255 //pack in ARGB: if (c3A > 212) { packed = (packed | (0x3)); } else if (c3A > 127) { packed = (packed | (0x2)); } else if (c3A > 42 ) { packed = (packed | (0x1)); }; //other wise it is zero and nothing needs to be set. packed = (packed << 2); //shift to make room for SECOND color component. // 42 127 212 //0 ----- 85 ----- 170 ----- 255 //pack in ARGB: if (c3R > 212) { packed = (packed | (0x3)); } else if (c3R > 127) { packed = (packed | (0x2)); } else if (c3R > 42 ) { packed = (packed | (0x1)); }; //other wise it is zero and nothing needs to be set. packed = (packed << 2); //shift to make room for THIRD color component. (G) // 42 127 212 //0 ----- 85 ----- 170 ----- 255 //pack in ARGB: if (c3G > 212) { packed = (packed | (0x3)); } else if (c3G > 127) { packed = (packed | (0x2)); } else if (c3G > 42 ) { packed = (packed | (0x1)); }; //other wise it is zero and nothing needs to be set. packed = (packed << 2); //shift to make room for FOURTH color component. (B) // 42 127 212 //0 ----- 85 ----- 170 ----- 255 //pack in ARGB: if (c3B > 212) { packed = (packed | (0x3)); } else if (c3B > 127) { packed = (packed | (0x2)); } else if (c3B > 42 ) { packed = (packed | (0x1)); }; //other wise it is zero and nothing needs to be set. return packed; } public function getPVAC(com:int):void { var acc:int; var vel:int; var pos:int; var clr:int; var color:uint; // AA RR GG BB // 11 11 11 11 //extract color: // 0xC0 | 0x30 | 0xC | 0x3 clr = com & 0xFF; //ARGB color channels. color = ( ((clr & 0xC0)>>6) * 85) << 24 | ( ((clr & 0x30)>>4) * 85) << 16 | ( ((clr & 0xC )>>2) * 85) << 8 | ( ((clr & 0x3 )>>0) * 85) << 0; //extract acceleration. com = com >> 8; acc = com & 0xF; if (acc > 7) { acc = 7 - acc; } //extract velocity. com = com >> 4; // ==com >> 12 when looking at cumulatively. vel = com & 0xFF; if (vel > 127) { vel = 127 - vel; } //extract position: //This is only ONE line because the signed bit on the com integer affects this. pos = com >> 8; // ==com >> 20 when looking at cumulatively. trace("color==" + color); trace("pos ==" + pos); trace("vel ==" + vel); trace("acc ==" + acc); //make sure color is what you think it is: var rgb:RGB = RGB.make(color); trace("a ==" + rgb.Alpha); trace("r ==" + rgb.Red); trace("g ==" + rgb.Green); trace("b ==" + rgb.Blue); }//getPVAC
Wednesday, March 6, 2013
Particle Bit Packing Math Experiment
Was wondering if I could make a more efficient particle system by packing the position, velocity, and acceleration values of the particle into a SINGLE signed integer.
The thought was that access would be faster since it is all in the same variable.
So far... I don't see any support for this in my research. Here is my math stuff.
Note: was also packing color information.
A bit more looking, looks like you may be able to get a marginal speed increase.
But so marginal that, you would have to pack and unpack in a flawless manner to get that speed increase.
And the obfuscation would make the system too hard to work with and edit.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment