Лучшая производительность AS3 для игр с боковой прокруткой (отставание прокрутки)

Есть ли кто-нибудь, кто может указать мне в каком-либо направлении, что вызывает отставание в очень простом движке боковой прокрутки?

Пример здесь: http://grtest.hu/sidescroll/sidescroll.html Источник: http://grtest.hu/sidescroll/sidescroll.zip

Это проблема буфера кадров или что-то еще? я действительно не понимаю... это так просто. Или я должен использовать игровые движки, такие как Box2D, FlashPunk?

Код:

import flash.events.Event

bg.addEventListener(Event.ENTER_FRAME,moveBG)
function moveBG(e:Event){
    e.currentTarget.y <= -500 ? e.currentTarget.y = 0 : e.currentTarget.y -=3
}

person Platanus79    schedule 06.12.2013    source источник
comment
попробуйте использовать cacheAsBitmap = true для вашего клипа bg. Таким образом, flash не нужно пересчитывать векторный клип для каждого кадра (bg.cacheAsBitmap = true). для всех невращающихся/масштабируемых объектов лучше установить cacheAsBitmap как true. И лучше, если у вас будет прямой доступ к bg вместо e.currentTarget.   -  person Benjamin BOUFFIER    schedule 06.12.2013
comment
Спасибо за совет Бино! В игре каждый движущийся объект кэшируется как растровое изображение. ;)   -  person Platanus79    schedule 06.12.2013
comment
Поскольку fps не всегда стабилен, иногда лучше перемещать объекты в зависимости от прошедшего времени, а не перемещать их в каждом кадре на фиксированные значения, если хотите, я могу показать вам небольшую функцию для этого.   -  person Benjamin BOUFFIER    schedule 06.12.2013
comment
Может помочь изучить использование дельта-времени, чтобы вы не полагались на постоянную частоту кадров. Это в основном то, что эти двигатели делают.   -  person imcg    schedule 06.12.2013


Ответы (1)


вот простой пример кода для получения времени кадра и перемещения вашего bg с его помощью:

var lastTime  :Number = 0;      // keep the last frame time
var moveSpeed :Number = 3 * 60; // 3 pixels by frame at 60 fps

bg.addEventListener( Event.ENTER_FRAME, onEnterFrame );
bg.cacheAsBitmap = true;

function onEnterFrame( e:Event )
{
    var now         :Number = getTimer() / 1000;    // get time in seconds
    var frameTime   :Number = now - lastTime;       // calculate frame time using the last time and the actual time
    lastTime = now;                                 // saving the last time

    bg.y -= moveSpeed * frameTime;
    if( bg.y <= -500 )  bg.y = 0;
}
person Benjamin BOUFFIER    schedule 06.12.2013
comment
Спасибо вам обоим, Бино и imcg! Я реализовал ваш подход в коде, жаль, что проблема все еще существует. Как вы можете видеть здесь: grtest.hu/sidescroll/sidescroll.html , рендеринг не гладкий (постоянный), по крайней мере, для меня. - person Platanus79; 06.12.2013