【问题标题】:AS3: Faster to use EventListeners or ArrayLoops?AS3:使用 EventListeners 或 ArrayLoops 更快?
【发布时间】:2009-11-10 19:09:36
【问题描述】:

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

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

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

或者性能差异可以忽略不计?任一解决方案的扩展性是否优于其他解决方案?

【问题讨论】:

  • 如果您确实沿着事件侦听器路径走下去,那么也许结帐opensource.hobnox.com。它是由一些真正的 Flash 大师(Andre Michelle、Joa Ebert)设计的自定义事件系统。我自己去看看:)

标签: actionscript-3 performance scalability addeventlistener


【解决方案1】:

我希望无论哪种方式,性能都可以忽略不计。一旦你得到很多对象,你可能会看到不同(循环是赢家)。根据我的经验,Adobe 在优化 actionscript 事件侦听器路径方面做了很多工作。

【讨论】:

    【解决方案2】:

    这是一个棘手的问题,纯粹主义者会说要使用数组循环方法,因为使用这种方法可以从 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();
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      我的印象是事件侦听器需要更多资源,因此在需要性能时最好使用数组。出于这个原因,它也会更好地扩展。如果您使用的是 Flash 10,请使用 Vector,我相信它提供比数组更好的性能(和类型安全)。

      【讨论】:

      • 输入“安全”还是“限制”?
      • 唯一的限制是当你需要创建一个泛型数据结构时,这仅仅是因为 AS3 不支持泛型:(
      【解决方案4】:

      使用 EventListeners! 只需确保正确管理它们即可。完成后删除它们,使用弱引用。

      你不会从做这样的事情中获得太多的性能。通常更好的性能来自于较大的勾选项,例如不使用过滤器、降低帧速率等。因此在我的书中为了半毫秒而惩罚你的代码清晰度和 OO 是不值得的。

      有一些非常棒的指南可以教您如何在 AS3 中进行优化。我找到的最好的是Grant Skinner's; AS3 Resource Management。我刚刚找到了quicker seven step version。不过,我绝对会建议所有从事 AS3 的人都应该阅读 Grant Skinner 的幻灯片。

      当然,不要只相信我的话(或其他任何人回答您的问题),您可以自己进行测试并使用分析器实际查看发生了什么。请参阅 Lee Brimlow 的最新视频教程,了解如何执行此操作。值得一看!在这里查看:GotoAndLearn - ActionScript 3 Performance Testing

      【讨论】:

      • 我不会说不使用事件监听器会牺牲清晰度和面向对象。我编写游戏的方式与普通的互动项目完全不同。我倾向于有一个游戏循环,因为我更新了世界,它将循环遍历实体并更新它们(也许使用四叉树进行优化)。根据我的观察(XNA 框架、一些 C++ 代码示例),这种方式似乎是游戏设计的事实标准。
      • 你说的是真的,除了我通常会遵守该语言的最佳实践。在 AS3 中,我通常会尝试遵循 Adob​​e 的做法。
      猜你喜欢
      • 2011-01-31
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多