Производительность процессора AS3 с +100 копиями мувиклипа - PullRequest
1 голос
/ 16 августа 2010

У меня есть видеоклип с простым движением простой формы.Этот мувиклип многократно копируется для создания графического эффекта.

По мере увеличения количества копий или сложности мувиклипа загрузка ЦП возрастает.Начиная с 90 копий, когда я продолжаю наводить мышь над фильмом swf по кругу, воспроизведение останавливается (зависает).Когда движение мыши останавливается, swf снова продолжается в правильном положении, как если бы расчет продолжался, но обновление отображения не выполняется.

Теперь это четырехъядерный ПК, и мы в 2010 году ... Я могуНе верьте и не принимайте, что 100 мкс - это максимальное количество видеоклипов, которые можно воспроизвести ... Должен быть лучший способ ...

Очевидный вопрос: что можно сделать для оптимизации производительности ЦП?

Я использую AS3, flash player 9. Movieclip - это простая прямоугольная форма, которая перемещается вдоль 1 оси.

var myLinkage:Class = Class(getDefinitionByName(getQualifiedClassName(McToRepeat)));
var newMC:MovieClip = new myLinkage();
containerMC.addChild( newMC );

1 Ответ

8 голосов
/ 16 августа 2010

Возможно, swf зависает, потому что когда вы перемещаете мышь, вы запускаете события MOUSE_MOVE и т. П. Для каждого отдельного фрагмента ролика на экране.

Обычно вы можете оптимизировать рендеринг Flash, поднявшись на несколько шагов вышена MovieClip дереве наследования и создании собственного графического класса оттуда.У MovieClip есть много классных наворотов, таких как временные шкалы, слои и встроенное управление мышью.К сожалению, все они занимают память и процессорное время, и довольно часто вам не понадобятся все эти функции.К счастью, вы можете выбрать нужные вам функции и избавиться от большого количества лишнего жира, который есть у MovieClip.Дерево наследования MovieClip построено таким образом, что каждая из этих функций довольно кратко инкапсулирована в одном родительском классе.

Например, в вашем приложении вы говорите, что ваши MovieClip содержат простую форму, следующую запростой путь движения.Я также предполагаю, что они не собираются взаимодействовать с мышью или клавиатурой.Из-за этого мы можем подняться на дерево наследования MovieClip довольно далеко.Поскольку вы перемещаете только фигуру, а не анимируете ее части, вы можете заменить анимацию временной шкалы анимацией движения (я бы порекомендовал взглянуть на TweenLite от Greensock).Здесь вы можете написать свой собственный класс, который подклассы Sprite (вместо MovieClip), и, вероятно, получить приличное увеличение частоты кадров.

Если вы хотите оптимизировать дальше, вы можете пойти дальше.Вам также, вероятно, не нужны слои, так как вы используете простую форму.Следовательно, вы можете пойти дальше, чем DisplayObjectContainer.Поскольку вам не нужна интерактивность, InteractiveObject также может пойти.Итак, вы обрезали много жира, и теперь вы на DisplayObject.Поскольку с DisplayObject s может быть сложно работать, вы можете перейти на один шаг вниз к дереву, либо к Shape, либо к Bitmap, в зависимости от сложности вашей фигуры.

Еще раз,когда вы решаете, сколько вам нужно, из встроенных в классы графики Actionscript, вам, возможно, придется создать свой собственный оттуда.Поскольку вы добавляете пользовательские функции в свой экранный объект, вам нужно будет создать свой собственный класс, который наследует либо Sprite, Shape, либо Bitmap, и добавить эти функции туда.

ИЧтобы ответить на ваш вопрос о том, почему 100 MC медленны, имейте в виду, что Flash работает на виртуальной машине, и этот уровень абстракции является большой проблемой ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...