Использование процессора Flash (as3) неуклонно растет до 80+%, выполняя простой цикл заполнения

В последнее время я возился со вспышкой и столкнулся с этой проблемой. Я заметил, что когда я выполняю любое заполнение каждого кадра, использование моего процессора будет медленно и неуклонно расти, пока не достигнет 85-90%. Это происходит при использовании flashPlayerDebugger.exe (из flex sdk), а также при просмотре swf в браузере. Использование памяти также растет медленно, но никогда не выходит из-под контроля.

Вот простой флеш-код для воспроизведения:

   
 import flash.display.Sprite;
 import flash.events.Event;

 public class test extends Sprite 
 {
  public function test():void 
  {
   stage.addEventListener(Event.ENTER_FRAME, everyFrame);
  }

  private function everyFrame(e:Event):void
  {
   this.graphics.beginFill(0x000000);
   this.graphics.drawRect(100, 100, 100, 100);
   this.graphics.endFill();
  }
 }


Кажется, работает с другими формами заливки (например, drawRect, drawCircle и т. д.), а также с beginBitmapFill.

Кажется, я не могу найти ни одного случая, когда у других была такая же проблема (после поиска на форумах adobe dev, actionscript.org, а также на этом сайте, среди прочего), поэтому я не знаю, то ли это что-то на моей стороне, то ли если дело во флеше.

Я использую последнюю версию flash (в настоящее время 10.1.102.64), но я также пробовал более старую версию flashPlayerDebugger.exe (10.1.53.64) и получил ту же проблему. У меня виндовс 7.

Просто проверяю, не сталкивался ли кто-нибудь еще с этим, или это что-то из-за того, как я делаю цикл заливки/кадра. Любая помощь будет принята с благодарностью.


person Eric Cornelson    schedule 23.12.2010    source источник


Ответы (1)


Обратите внимание, что вы не очищаете свою графику каждый раз, когда рисуете, а постоянно добавляете в спрайт новые заполненные фигуры, которые все будут перерисовываться. Добавлять

this.graphics.clear();

перед каждым действием рисования, и ваша производительность должна быть намного лучше.

Кроме того: вы всегда должны ограничивать себя этими циклами ENTER_FRAME - в большинстве случаев будет менее затратное решение, такое как MOUSE_MOVE или таймеры.

person weltraumpirat    schedule 23.12.2010
comment
Согласен, что проблема с graphics.clear(), однако в событии ENTER_FRAME нет ничего существенно дорогостоящего. Нет необходимости избегать использования события ENTER_FRAME. Вам просто нужно убедиться, что код, выполняемый в обработчике события, работает хорошо. - person JeremyFromEarth; 24.12.2010
comment
Однако вы согласны с тем, что вызов, скажем, метода, который обновляет большой элемент управления деревом, реагирующий на положение мыши на MOUSE_MOVE, будет намного менее затратным, чем вызов его на ENTER_FRAME, даже если результат будет выглядеть почти таким же? - person weltraumpirat; 24.12.2010
comment
ENTER_FRAME стоит так же, как MOUSE_MOVE, с той лишь разницей, что ENTER_FRAME происходит все время, а MOUSE_MOVE — некоторое время. Максимальное использование ЦП на квант времени будет таким же, но общее использование ЦП для ENTER_FRAME будет больше. Поэтому ваше приложение не будет работать медленнее, но может потреблять больше энергии (батареи). - person Allan; 24.12.2010
comment
Спасибо, что объяснили это. :) - person weltraumpirat; 24.12.2010
comment
Спасибо за ответ! Я не понимал, что рисунки были составлены таким образом. - person Eric Cornelson; 28.12.2010