如果我已将Event.ENTER_FRAME侦听器添加到不同的组件,如何设置或知道在每个enterFrame上触发这些事件的顺序?
不是将enterFrame侦听器添加到单个元素,更好的做法是让一个元素侦听enterFrame事件,并且有一个元素数组需要在enterFrames上更新,从而可以轻松组织和更改这些元素的触发顺序事件
答案 0 :(得分:3)
您可以优先处理事件侦听器,从而命令执行它们。使用addEventListener()的第四个属性,这是一个表示优先级的整数。添加了高优先级整数的事件侦听器将在优先级较低的事件之前执行。有关详细信息,请参阅addEventListener() reference。
但你也是对的,创建自己的更新管理器通常更好。这是因为事件侦听器需要实例化一个Event(或其子类),这会极大地影响性能(实例化是Flash运行时中最繁重的任务之一。)这对于ENTER_FRAME事件尤其不幸,因为您将通常不会使用事件对象。
创建一个管理器类,应用程序的其他部分可以从中订阅更新回调。每当注册回调时,在调用所有回调的管理器类中添加一个 ENTER_FRAME(或TimerEvent.TIMER)事件侦听器。删除最后一个回调时,也删除事件侦听器。
关于事件和性能的主题,您可能有兴趣知道对于冒泡的事件(发生在显示列表中的大多数交互事件),会为事件在此期间传递的每个调度程序创建一个新的事件对象。冒泡!在不需要时删除事件监听器总是一个好主意。
答案 1 :(得分:1)
您无法保证事件侦听器的执行顺序。
...更好的做法是拥有一个侦听enterFrame事件的元素,并且有一个需要在enterFrames上更新的元素数组......
这实际上取决于用例。在某些情况下,例如粒子系统,可能是的。如果您有许多构成逻辑集的对象,那么在单个 manager 类型类中执行大部分集合逻辑通常是有意义的。这可能包括一组特定的更新循环。这可以为您节省相当多的开销。
然后,如果你所做的只是:
function managerUpdate(event:Event):void
{
for(var thing:Object in set)
{
thing.update();
}
}
然后你根本没有节省那么多开销。当然,在上述情况下,您可以控制集合的顺序。你也可以逐帧剔除它。
还要考虑是否有计算或其他算法可以从集合实例的更新中提升到管理器中并通过参数传递。
如果没有关于您的具体用例的更多信息,我无法更具体。
答案 2 :(得分:0)
它可能基于您订阅事件的顺序,因为它被添加到可能在触发事件时循环的集合中,但我不相信这一点,因为文档不保证这一点。
而不是事件的顺序很重要,我会创建自己的委托集合,并有一个订阅者来迭代你自己的集合,调用每个委托,等待它返回,然后调用下一个。这样您就可以确定事件的顺序。我只是想对这些事情保持谨慎。