【问题标题】:ENTER_FRAME event over ENTER_FRAME eventENTER_FRAME 事件超过 ENTER_FRAME 事件
【发布时间】:2011-08-31 20:55:49
【问题描述】:

假设我们在 Flash 库中有一个动画剪辑“Enemy”,并且与它相关联的类“Enemy.as”监听 ENTER_FRAME 事件,如下所示,

public function Enemy():void
{
    //constructor of this "Enemy.as" class
    addEventListener(Event.ENTER_FRAME, move);
}

private function move(evt:Event):void
{
    x += 5;
}

现在我的问题是,如果这个“Enemy.as”在其他类中被实例化,说“Main.as”再次在同一个实例化的 Enemy 对象上使用 ENTER_FRAME 事件,如下所示,

public function Main():void
{
    //constructor of this "Main.as" class
    enemy1 = new Enemy();
    enemy1.addEventListener(Event.ENTER_FRAME, checkCollision);
}

private function checkCollision(evt:Event):void
{
    if(enemy1.x == mainObj.x)
    {
        //do something
    }        
}

这是优化方面的好方法吗?或者根本不应该使用这种方法?

【问题讨论】:

    标签: actionscript-3 events event-handling


    【解决方案1】:

    从性能的角度来看,最好只在单个位置(例如,在您的主应用程序类中)侦听 ENTER_FRAME,然后在所有需要更新的对象上调用自定义 update() 方法。例如,对于游戏来说,这是一种非常常见的方法。

    从性能的角度来看,这非常优越的一个原因是不需要创建新的 Event 实例。如果您有 100 个侦听器(这在使用您概述的方法时并不少见),这意味着每帧有 100 个 Event 类的新实例,而实例化类是您在 Flash 中可以做的最繁重的事情之一。

    您实际上很少需要在 ENTER_FRAME 处理程序中使用 Event 对象,因此使用 update() 方法更有意义。如果可以,请尝试在游戏等性能关键应用程序中集中其他事件。

    【讨论】:

      【解决方案2】:

      正如 Richard 所说,在创建游戏时使用单一更新(游戏循环)方法效率更高。不仅从性能的角度来看,还因为您使用单个更新获得了更多的控制权。像这样:

      public function update(deltaTime : Number) : void
      {
          var gameObject : IGameObject;
      
          for(var i : int = 0 ; i < _gameObjects.length ; i++)
          {
              gameObject = _gameObjects[i];
              gameObject.update(deltaTime);
          }
      
          ...
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 2010-11-09
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        相关资源
        最近更新 更多