我正在AS3中编写游戏,例如,屏幕上有大约40个对象。让我们说它们是云。我想知道这两条路径中的哪一条对系统资源的影响较小:
a)在每个对象上放置一个eventListener并让它自行更新,或者
b)循环遍历数组并手动更新每个对象
或者性能差异是否可以忽略不计?两种解决方案都比其他解决方案更好地扩展吗?
答案 0 :(得分:1)
我希望无论哪种方式,表现都是相当可以忽略不计的。一旦你获得了很多对象,你可能会看到不同(循环是胜利者)。根据我的经验,Adobe在优化actionscript事件监听器路径方面投入了大量精力。
答案 1 :(得分:0)
我认为事件监听器需要更多资源,因此在需要性能时最好使用数组。由于这个原因,它也会更好地扩展。如果您使用的是Flash 10,那么使用Vector,我相信它提供了比数组更好的性能(并且类型为saftey)。
答案 2 :(得分:0)
使用EventListeners!请确保正确管理它们,即。完成后删除它们,使用弱引用。
你不会从这样的事情中找到很多表现。通常更好的性能来自更大的滴答项目,例如不使用过滤器,降低帧速率等。因此,在我的书中,为了半毫秒而惩罚代码清晰度和OO是不值得的。
有一些非常好的指南可以教你们在AS3中进行优化。我找到的最好的是Grant Skinner's; AS3 Resource Management。我刚刚找到quicker seven step version。我肯定会建议每个做AS3的人都应该阅读Grant Skinner幻灯片。
当然,不要只听我的话(或其他人回答你的问题),你可以自己做测试,然后使用分析器看看最新情况。请参阅Lee Brimlow的最新视频教程,了解如何执行此操作。这值得关注!请在此处查看:GotoAndLearn - ActionScript 3 Performance Testing。
答案 3 :(得分:0)
这是一个棘手的问题,纯粹主义者会说要使用数组循环方法,就像使用这种方法一样,可以从MVC中删除“视图”并仍然使系统工作(这是一个任何系统的良好测试)。但是,如果您正在处理事件,您可以通过事件冒泡和严格键入来削减一些角落。
例如,如果我们假设您创建了一个名为CloudEvent
的自定义事件,其中包含一个名为cloud
的属性,其中包含对调度CloudSprite
的引用,那么只要该事件默认为气泡,不需要为每个人添加一个事件监听器,只需要保存它们的DisplayObjectContainer
(我想象中称之为CloudContainer
)。这样事件就会冒泡,你只需添加一个监听器,而不必担心管理子项上的监听器。
public function CloudContainer()
{
super();
addEventListener(CloudEvent.CHANGE, cloudChangeHandler);
}
private function cloudChangeHandler(evt:CloudEvent):void
{
var cloud:CloudSprite = evt.cloud;
cloud.update();
}
希望这有帮助