Actionscript:
- 
// note the high framerate for testing purposes
- 
[SWF(width = 800, height = 600, frameRate=60)]
- 
// red, yellow, blue
- 
var fills:Vector.<IGraphicsData> = Vector.<IGraphicsData>([new GraphicsSolidFill(0xFF0000), new GraphicsSolidFill(0xFFCC00), new GraphicsSolidFill(0x0033FF)]);
- 
- 
var stroke:IGraphicsData = new GraphicsStroke();
- 
- 
var cmds:Vector.<int> = new Vector.<int>();
- 
var ci:int = 0;
- 
var dat:Vector.<Number> = new Vector.<Number>();
- 
var di:int = 0;
- 
var igraph:Vector.<IGraphicsData> = new Vector.<IGraphicsData>();
- 
var ig:int = 0;
- 
var path:Vector.<GraphicsPath> = new Vector.<GraphicsPath>();
- 
var boxNum:int = 1500;
- 
var locX:Vector.<Number> = new Vector.<Number>(boxNum);
- 
var locY:Vector.<Number> = new Vector.<Number>(boxNum);
- 
var velX:Vector.<Number> = new Vector.<Number>(boxNum);
- 
var velY:Vector.<Number> = new Vector.<Number>(boxNum);
- 
var cols:int = 50;
- 
for (var i:int = 0; i<boxNum; i++){
- 
path[i] = new GraphicsPath(new Vector.<int>(), new Vector.<Number>());
- 
path[i].winding = GraphicsPathWinding.NON_ZERO;
- 
var theta:Number = i * Math.PI/180;
- 
var sin:Number = Math.cos(theta);
- 
var cos:Number = Math.sin(theta);
- 
var r:Number = Math.random()*100;
- 
var vr:Number = r * 0.05;
- 
velX[i] = vr * cos;
- 
velY[i] = vr * sin;
- 
locX[i] = 400 + r * cos;
- 
locY[i] = 300 + r * sin;
- 
}
- 
- 
// box vars
- 
var xp:Number, yp:Number, size:Number, hs:Number;
- 
// corners
- 
var x0:Number, y0:Number, x1:Number, y1:Number;
- 
- 
addEventListener(Event.ENTER_FRAME, onLoop);
- 
function onLoop(evt:Event):void {
- 
graphics.clear();
- 
ig = 0;
- 
for (i= 0; i<boxNum; i++){
- 
// inline function:
- 
locX[i] += velX[i];
- 
locY[i] += velY[i];
- 
xp = locX[i];
- 
yp = locY[i];
- 
if (xp <0 || xp> 800){
- 
velX[i] *= -1;
- 
}
- 
if (yp <0 || yp> 600){
- 
velY[i] *= -1;
- 
}
- 
size = 10 + i % 10;
- 
hs = size * 0.5;
- 
x0 = xp - hs, y0 = yp - hs;
- 
x1 = xp + hs, y1 = yp + hs;
- 
ci = 0;
- 
di = 0;
- 
cmds = path[i].commands;
- 
dat = path[i].data;
- 
// GraphicsPathCommand.MOVE_TO
- 
cmds[ci++] = 1;
- 
dat[di++] = x0 , dat[di++] = y0;
- 
// GraphicsPathCommand.LINE_TO
- 
cmds[ci++] = 2;
- 
dat[di++] = x1 , dat[di++] = y0;
- 
// GraphicsPathCommand.LINE_TO
- 
cmds[ci++] = 2;
- 
dat[di++] = x1 , dat[di++] = y1;
- 
// GraphicsPathCommand.LINE_TO
- 
cmds[ci++] = 2;
- 
dat[di++] = x0 , dat[di++] = y1;
- 
// end inline function
- 
- 
path[i].commands = cmds;
- 
path[i].data = dat;
- 
igraph[ig++] = fills[i % 3];
- 
igraph[ig++] = path[i];
- 
}
- 
// everything is drawn with one function call
- 
graphics.drawGraphicsData(igraph);
- 
}
I haven't spent much time with IGraphicsData. It's a very cool feature and I think its going to take me awhile to realize its full potential. Since I have to start somewhere I decided to write this snippet to show that it is rather fast. I also recalled reading some benchmark info for the new fp10 graphics stuff over at bytearray.org.... pretty nice info there...
This snippet is pretty optimized, there are a few areas (such as the recurring population of the cmds Vector) that could be optimized more but are left this way for SOME flexibility.