代码之家  ›  专栏  ›  技术社区  ›  Andy Moore

AS3:使用EventListener或ArrayOps更快?

  •  1
  • Andy Moore  · 技术社区  · 16 年前

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

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

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

    还是性能差异可以忽略?两种解决方案的规模是否都比其他解决方案更好?

    4 回复  |  直到 16 年前
        1
  •  0
  •   enzuguri    16 年前

    这是一个棘手的问题,纯化论者会说,要使用数组循环方法,就像使用这个方法,可以从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();
    }
    

    希望这有帮助

        2
  •  1
  •   Aaron    16 年前

    不管怎样,我都希望这场演出是相当失败的。一旦你得到很多对象,你可能会看到不同之处(循环是赢家)。根据我的经验,Adobe在优化ActionScript事件侦听器路径方面做了很多工作。

        3
  •  0
  •   Allan    16 年前

    我认为事件侦听器需要更多的资源,因此在需要性能时最好使用数组。因为这个原因,它的规模也会更好。如果您使用的是flash 10,那么使用向量,我相信它比数组(和类型安全)提供更好的性能。

        4
  •  0
  •   Adam Harte    16 年前

    使用事件侦听器! 只需确保正确地管理它们,即,完成后删除它们,使用弱引用。

    做这样的事情,你不会发现有太多的表现。通常,更好的性能来自于更大的标记项,比如不使用过滤器、降低帧速率等,所以为了半毫秒而惩罚代码清晰度和OO在我的书中是不值得的。

    这里有一些非常棒的指南,将教你如何在AS3中进行优化。我找到的最好的是 Grant Skinner's; AS3 Resource Management . 我刚发现 quicker seven step version . 不过,我绝对建议每个做AS3的人都应该阅读格兰特·斯金纳的幻灯片。

    当然,不要只相信我的话(或者任何其他回答你问题的人),你可以自己做测试,并使用一个分析器来查看结果。有关如何做到这一点,请参阅Lee Brimlow的最新视频教程。值得一看!在这里查看: GotoAndLearn - ActionScript 3 Performance Testing .