AS3:更快地使用事件监听器或数组循环?

时间:2009-11-10 19:09:36

标签: actionscript-3 performance scalability addeventlistener

我正在AS3中编写游戏,例如,屏幕上有大约40个对象。让我们说它们是云。我想知道这两条路径中的哪一条对系统资源的影响较小:

a)在每个对象上放置一个eventListener并让它自行更新,或者

b)循环遍历数组并手动更新每个对象

或者性能差异是否可以忽略不计?两种解决方案都比其他解决方案更好地扩展吗?

4 个答案:

答案 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();
}

希望这有帮助