Starling 性能优化方案
如上图所示,如果您想在Starling中创建这样的场景,您可以创建3个Sprite容器:一个用来包含远处的山脉,一个包含地面,一个包含植被。山脉的排序肯定在最底部(索引是0),植被的排序是在最顶部(排序是2)。每一个Sprite会包含有实际内容的图片。

?
在渲染的时候,Starling会先渲染最左侧的"Mountain 1",并向右继续渲染,直到到达 “Tree 2”。现在,如果所有的对象都有不同的状态,那么就会造成6次绘制调用。如果您从每一个单独的图像来加载每一个对象的纹理,就会发生这样的情况。
在这里,每个图像都使用相同的图集(用所有节点具有相同的颜色来表示)。这样的后果就是您应该总是让您的所有纹理使用同一个纹理图集。
然后,有时候,并非所有的纹理都能融合到一个单一的图集上。一个纹理图集的限制是2048*2048像素(这是一些移动设备硬件的限制),所以您早晚都会碰到这种所需纹理为空的情况。但是这也没什么问题---只要您用一种聪明的方式来安排您的纹理。

如上图所示,这两个例子都是使用了两个纹理图集(同样,每一个纹理图集用一个颜色表示)。但是左侧的显示列表,将强迫每个对象发生状态改变,而右侧的版本则可以只需要两次批处理就能绘制所有的对象。
var quadBatch:QuadBatch = new QuadBatch();var image:Image = new Image(texture);quadBatch.addImage(image); for (var i:int=0; i<100; ++i){ image.x += 10; quadBatch.addImage(image);}您是不是已经注意到了?如果您愿意,您可以重复添加相同的图像!此外,它不会引发任何事件调度。然而事务都有两面性,这样做也有一些缺点:
您添加的所有的对象必须具备相同的状态(比如:使用同一个纹理图集)。您添加到QuadBatch的第一个图像决定了它的状态。您不能再改变状态,除非完全重置这个QuadBatch。您只能添加Image, Quad, 或 QuadBatch类的实例.这是一条单行道:您只能添加对象。删除一个对象的唯一途径是重置当前批次。由于这些原因,它仅适用于一些特定的场景(比如位图字体类,就直接使用了四边形批次)。在这些情况下,它肯定是最快的选择。您将找不到一个更有效的方式来呈现Starling对象。
// 坏方案:for (var i:int=0; i<numChildren; ++i){ var child:DisplayObject = getChildAt(i); if (child.x > wall.width) child.removeFromParent();} // 好方案:var wallWidth:Number = wall.width;for (var i:int=0; i<numChildren; ++i){ var child:DisplayObject = getChildAt(i); if (child.x > wallWidth) child.removeFromParent();}// 好方案:for (var i:int=0; i<container.numChildren; ++i) containter.getChildAt(i).touchable = false; // 更好的方案:container.touchable = false;
// 慢的:for each (var item:Object in array) { ... } // 快的:for (var i:int=0; i<array.length; ++i) { ... } // 更快的:var length:int = array.length;for (var i:int=0; i<length; ++i) { ... }避免创建对象
避免产生大量的临时对象。它们占用内存,并且需要由垃圾收集器进行清理,这可能会导致运行时的"卡壳"。
// 坏的:for (var i:int=0; i<10; ++i){ var point:Point = new Point(i, 2*i); doSomethingWith(point);} // 好的:var point:Point = new Point();for (var i:int=0; i<10; ++i){ point.setTo(i, 2*i); doSomethingWith(point);}访问数组或向量数组元素
当您从一个数组或一个向量数组中引用一个对象的时候,要小心:当对象索引是一个计算结果的时候,请转换为int类型。出于某种原因,这样可以让AS3计算更快。
// 坏的:var element:Object = array[10*x]; // 好的:var element:Object = array[int(10*x)];???