PDA

Просмотр полной версии : Задержка отрисовки


pavel___zzz
21.09.2011, 19:34
Здравствуйте

Проблема такая: в одной функции сначала рисуем (иконку ожидания), потом долгие вычисления. При этом фактически отрисовка происходит после выполнения вычислений. Как с этим бороться?

На примере (круг нарисуется через секунду после вызова этого кода):

graphics.beginFill(0x00ff00);
graphics.drawCircle(0, 0, 100);
graphics.endFill();

var t:Number = (new Date()).getTime();
var a:Number = 0;
while ((new Date()).time-t < 1000) {a++; }


P.S.
Пробовал рисовать, а вычисления делать по ENTER_FRAME, EXIT_FRAME, FRAME_CONSTRUCTED, не помогло...
Конечно можно вычисления начинать по таймеру, но должен же быть штатный способ... Или нет?

silin
21.09.2011, 20:53
нету штатного способа заставить плеер перерисовывать экран когда попало, т.е. все строго: в каждом кадре сначала код - потом ренедеринг графики
есть некоторые события, для которых предусмотрена 'немедленная' перерисовка, но подключать их к такому раскладу в качестве 'костылей' ничего кроме путаницы не даст, имхо
но можно просто разнести эти вещи (показ иконки, вычисления, изменение иконки,..) по кадрам:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.getTimer;

public class Main extends Sprite
{
private var queue:Array;

public function Main():void
{
// очередь действий, которые надо разнести по кадрам
queue = [showIcon, calculation, hideIcon];
addEventListener(Event.ENTER_FRAME, enterFrame);
}

private function enterFrame(e:Event):void
{
// если есть очередь, то выполняем, если пусто - отписываемся от события
queue.length ? queue.shift()() : removeEventListener(Event.ENTER_FRAME, enterFrame);
}

private function showIcon():void
{
graphics.clear();
graphics.beginFill(0x00ff00);
graphics.drawCircle(0, 0, 100);
graphics.endFill();
}

private function hideIcon():void
{
graphics.clear();
}

private function calculation():void
{
var t:Number = getTimer();
var a:int;
while (getTimer() - t < 2000) a++;
}
}
}