Событие ENTER_FRAME над событием ENTER_FRAME - PullRequest
2 голосов
/ 01 сентября 2011

Допустим, у нас есть фрагмент ролика «Враг» в библиотеке Flash, и с ним связан класс «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", который снова использует событие ENTER_FRAME для того же экземпляра объекта Enemy, как показано ниже:

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
    }        
}

Это хороший подход с точки зрения оптимизации?Или вообще не стоит использовать этот подход?

Ответы [ 2 ]

6 голосов
/ 01 сентября 2011

С точки зрения производительности всегда лучше прослушивать ENTER_FRAME только в одном месте (например, в главном классе приложения), а затем вызывать пользовательские update() методы для всех объектов, которые необходимо обновить. Например, это очень распространенный подход для игр.

Одна из причин, почему это значительно превосходит с точки зрения производительности, заключается в том, что не нужно создавать новые экземпляры Event. Если у вас 100 слушателей (что не редкость при использовании описанного вами подхода), это означает, что 100 новых экземпляров класса Event в каждом кадре и создание экземпляров классов являются одними из самых тяжелых вещей, которые вы можете сделать во Flash.

Вам редко требуется объект Event в обработчиках ENTER_FRAME, поэтому вместо этого стоит использовать метод update (). Если можете, попробуйте также централизовать другие события в приложениях, критичных к производительности, таких как игры.

1 голос
/ 01 сентября 2011

Как говорит Ричард, при создании игр гораздо эффективнее использовать метод одиночного обновления (Game Loop). Не только с точки зрения производительности, но и потому, что вы получаете гораздо больше контроля, используя одно обновление. Как это:

public function update(deltaTime : Number) : void
{
    var gameObject : IGameObject;

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

    ...

}
...