PDA

Просмотр полной версии : Timer не работает с интервалом менее 1000мс


Sway
17.05.2008, 22:57
Ситуация такая: Есть некоторое приложение на AS3 + AIR, выполняющее 2х и 3х-мерные преобразования объекта (для универа делаю).
Задача: Заставить объекты перемещаться плавно.
Проблема: таймер правильно работает только с delay ~1000 и выше. Но мне необходимо delay примерно 10.
Что происходит: delay = 10. объект перемещается рывками с периодом явно не 10мс.

вот код:
public function animate(args:Array)
{
// сборка необходимых данных
...
// таймер
timeOut = 10;
this.animationArgs['stepCount'] = 20;
this.timer = new Timer(timeOut,this.animationArgs['stepCount']);
this.timer.addEventListener(TimerEvent.TIMER, this.applyAnimation);
this.timer.start();
}

// применяет преобразования имитируя анимацию
private function applyAnimation(event:TimerEvent)
{
// запуск трансформации
if(this.animationArgs['stepVars'].length != 0)
this.animationArgs["workSpace"].startTransform(this.animationArgs['stepVars'].shift());
}

this.animationArgs['stepVars'] - массив, состоящий из массивов с данными для преобразования на каждом шаге анимации

PS: если есть другой способ сделать таймер или задержку (типа JavaScript'ового sleep), прошу подсказать.

etc
17.05.2008, 23:11
Sway, отредактируйте свой пост и оформите код тегами .

Таймер не является точным инструментом, точность зависит от нагрузки на процессор, от fps и ряда других факторов.

Sway
17.05.2008, 23:20
странность в том, что раньше похожий код работал правильно. Хотя и нагрузки на комп было немного меньше... попробую обойти вычисления. Или вычислять до вызова таймера

etc
17.05.2008, 23:25
10 мс — это сто кадров в секунду, с такой скоростью проигрывание бывает крайне редко.

Sway
17.05.2008, 23:34
я не увидел разницы ни при 10мс, ни при 100мс, ни при 500мс... Сейчас переделываю так, чтобы ничего не считалось, а сразу применялись новые координаты к точкам. Как сделаю, отпишусь.

etc
17.05.2008, 23:38
Значит у вас слишком маленький FPS установлен.

Sway
17.05.2008, 23:45
по умолчанию - 12fps установлено

etc
17.05.2008, 23:47
Соответственно, перерисовки чаще, чем 12 fps не будет.

Sway
17.05.2008, 23:58
моя задача сейчас добится хоть чего-то похожего на анимацию. и 12фпс для этого будет вполне достаточно.
Все, проблему решил! Анимация приемлемая получилась.
Решение:
- Выполнение всех вычислений до запуска анимации (таймера). Данные сохраняются в массив через array.push(data)
- При срабатывании таймаута данные извлекаются с помощью array.shift() и применяются к объектам на сцене.

BlooDHounD
18.05.2008, 00:01
event.updateAfterEvent();