与许多OOP语言一样,AS3包含许多对于经验不足的用户来说可能是闻所未闻的优化技术。这些差异可以从微宏编码差异到文件结构。帮助经验较少的人:哪些技巧值得了解,这将使AS3程序员变得更加丰富。
其核心思想是:向可能了解基础知识的新程序员介绍优化方法。但不是“经验丰富的”程序员的各种技术(特别是在循环中)。
由于大多数as3程序员都会使用flash或flex,因此涉及它们的编程技巧自然也会受到欢迎。
另外,请将每个答案限制为一个提示,这样最好的答案自然会浮到顶部=)
然而: AS3是一种“编译语言”,它自己做了很多优化,所以对于新手来说,他们太努力地遵循这些技巧了。向它学习,而不是成为它的奴隶。第一步总是“完成应用程序”。
发布于 2011-07-11 17:02:47
如果你对游戏编程很认真:evolve your hierarchy,不要使用深层次结构,自学实体/组件架构(聚合/组合与继承),钻研PushButton引擎源代码。
发布于 2011-07-11 17:16:37
高级游戏编程的另一个优化是:使用位图拼接技术(setPixels、BitmapData,而不是MovieClip/Sprites),就像这里描述的:http://mikegrundvig.blogspot.com/2007/05/copypixel-is-faster-then-sprites.html。深入研究Flixel源代码。
发布于 2011-07-11 20:06:12
在创建对象时,要有远见。在可能的情况下,重用杂项对象。
更好的说法是:重用您可以的东西,但是重用misc对象很容易开始。
这为garbage collector节省了大量工作,从而影响应用程序的整体性能。这样,您还可以节省创建冗余实例时可能会损失的时间。
这些努力并不总是必要的,但是,你的应用程序活动越激烈,下面的技术就越有价值。
下面的几个技巧在矩阵,点,数组,字典,...rest,过滤器,颜色变换上说明了这个想法。
提示1:矩阵。
// DO: reusing a matrix.
private static const MATRIX:Matrix = new Matrix();
// <...>
var bmp:BitmapData = new BitmapData(width, height, true, 0);
MATRIX.identity();
MATRIX.scale(0.5, 0.5);
bmp.draw(source, MATRIX);
// DON'T
var bmp:BitmapData = new BitmapData(width, height, true, 0);
var matrix:Matrix = new Matrix();
matrix.scale(0.5, 0.5);
bmp.draw(source, matrix);提示2:要点。
// DO: reusing a point.
private static const ZERO_POINT:Point = new Point();
// <...>
var thresholdTest:BitmapData = new BitmapData(bmp.width, bmp.height, true, 0);
thresholdTest.threshold(bmp, bmp.rect, ZERO_POINT, ">", 0x10000000, 0xFFFF0000, 0xFF000000);
// DON'T
var thresholdTest:BitmapData = new BitmapData(bmp.width, bmp.height, true, 0);
thresholdTest.threshold(bmp, bmp.rect, new Point(), ">", 0x10000000, 0xFFFF0000, 0xFF000000);提示3:避免大量使用为你创建冗余实例的方法,除非它是绝对必要和方便的。或者至少在你的应用程序会话期间将这些方法的使用减少到单个调用。
localToGlobal()和globalToLocal():尝试计算是否可以自己计算坐标。否则,将在每个call.getRect()和getBounds()上创建点实例:看看是否可以以一种不需要检测复杂位移的方式来构建显示列表。否则,会在每个call....rest:Array:上创建Rectangle实例,这会在每个方法调用时创建一个数组,该数组将在方法返回时被处理。这是绝对必要的吗?也许您可以使用在方法外部创建的数组,并在每次重用它(参见下一篇技巧)?提示4:在可能的情况下,当您仅将Array或Dictionary实例用作在方法中生成某些结果的容器时,请创建它们。
// DO: reuse array that holds results
public function generateMeSomeResults(results:Array):void
{
results.length = 0;
// <...>
// fill results array with what you need
// and reuse this reference next time
}
// DON'T
public function generateMeSomeResults():Array
{
var results:Array = [];
// <...>
return results;
}提示5:不要每次想要更改someDisplayObject.filters.时,都创建新的数组和过滤器对象如果设置滤镜动画,并且滤镜在每一帧中都有更改,则这一点尤其重要。
// DO: reuse filters array and filter objects
private static const EMPTY_FILTERS:Array = [];
private static const GLOW:GlowFilter = new GlowFilter(0xFF0000, 1, 12, 12);
private static const HOVER_FILTERS:Array = [GLOW];
private function onRollOver(event:MouseEvent):void
{
// it's Ok to change constant here
// because once filters property is set,
// you are free to change filter object: it will not affect
// filters that were set before.
GLOW.color = 0xFF0000+Math.random()*0xFF00;
this.filters = HOVER_FILTERS;
}
private function onRollOut(event:MouseEvent):void
{
this.filters = EMPTY_FILTERS;
}
// DON'T
private function onRollOver(event:MouseEvent):void
{
this.filters = [new GlowFilter(0xFF0000, 1, 12, 12)];
}
private function onRollOut(event:MouseEvent):void
{
this.filters = [];
}需要注意的更重要的一点是:DisplayObject.filters是一个getter/setter方法。当您获得DisplayObject.filters值时,您实际上创建了一个不是您想要的新对象。因此,重用过滤器数组是一个好主意:您始终只有一个实例。
提示6:同样的提示5适用于ColorTransform对象。每次更改显示对象的色调时,都不需要单独的ColorTransform实例。设置DisplayObject.transform.colorTransform = someColorTransform;后,可以自由更改someColorTransform对象:它不会影响已应用的颜色变换。
与filters的情况一样,此属性是一个getter/setter。当您获得DisplayObject.transform.colorTransform值时,您实际上创建了一个不是您想要的新对象。请参阅下面的测试。
import flash.geom.ColorTransform;
var test1:ColorTransform = transform.colorTransform;
var test2:ColorTransform = transform.colorTransform;
trace(test1 == test2); // always false. this object gets created each time on access.https://stackoverflow.com/questions/6647677
复制相似问题