среда, 11 января 2012 г.

Несколько слов по поводу оптимизации ActionScript

В Интернете большое количество материалов, касающихся оптимизации как таковой, так и ActionScript в частности. Предлагается огромное количество способов записи арифметических выражений, циклов и прочего. Но заметно, что многие способы не тестируются или тестируются слишком поверхностно. Если говорить честно, то один и тот же способ при запуске несколько раз может показать различные результаты. Поэтому заявлять, что префиксный способ работает быстрее постфиксного, потому что один раз запустили, и первый способ показал прирост производительности на 1,1% не совсем корректно.
Что касается приложений по выводу графики, например, при срабатывании события ENTER_FRAME, то существуют, как минимум, две оценки - одна - время выполнения функции - обработчика события, а другая - периодичность вызовов данного обработчика. Не смотря на обилие источников информации об оптимизации, ни в одном из них вторая оценка не рассматривается. Казалось, бы это очевидно, что вызов данного обработчика происходит каждые (1000/framerate) мс. Но на самом деле, это далеко не так. В случае, когда обработчик выполняется дольше, чем время между вызовами, то частота вызовов снижается. Для вычисления обеих оценок можно выбрать такой способ - в начале обработчика засечь время, прошедшее со времени последнего запуска, потом в конце обработчика вычислить время выполнения функции и начать отсчет до следующего запуска.


...
_last_frame_timestamp = getTimer();
addEventListener(Event.ENTER_FRAME, frameHandler);
...
private var _time_bet_sum:Number = 0;
private function frameHandler(event:Event):void {
  var time:Number = getTimer() - _last_frame_timestamp; 
  _time_bet_sum += time;
...
  _time_ex_time += getTimer() - _last_frame_timestamp - time;
  _last_frame_timestamp = getTimer();
}
...

От себя могу заметить, что основные приемы оптимизации, которые работают на 100% (то есть существенно влияют на производительность):
- Сокращение количества вызовов функций (как раз это - проблема всех 3D-движков, встретившихся мне с исходниками).
- Не создавать (по возможности) новые объекты на основе ранее существовавших объектов.
- Использовать локальные переменные для сокращения времени доступа к отдельным членам объектов, которые используют get/set функции (например, свойство length) или сами являются объектами (вместо object.front.first.x использовать var k:Vector3D=object.front.first, и k.x) при неоднократном использовании в коде.

Комментариев нет:

Отправить комментарий