Каковы основные показатели производительности в AS3 помимо векторов рендеринга? - PullRequest
59 голосов
/ 05 декабря 2011

В ActionScript 3 использование векторной графики является гарантированным способом нанести огромный ущерб производительности вашего проекта.

Использование единого Bitmap для всей графики с использованием .copyPixels() через его объект BitmapData вместо всей векторной графики приведет к невероятному повышению производительности и важно для таких людей, как я, разрабатывающих игры во Flash.

Помимо этого, я не совсем уверен, каковы следующие основные вещи, на которые я должен ориентироваться и пытаться оптимизировать. Я использую много встроенных тригонометрических функций, но они, кажется, не так сильно на это влияют. Я знаю, что есть некоторые библиотеки, которые оптимизируют математику с помощью методов аппроксимации и тому подобного, но пока я не нашел в этом необходимости.

Есть ли еще какие-нибудь известные точки, на которые я должен обратить внимание? Я больше говорю о встроенных вещах, к которым я должен быть осторожен (например, избегая рендеринга векторов), а не о том, как улучшить свой собственный стиль кодирования.

1 Ответ

127 голосов
/ 05 декабря 2011

Документы, которые я нашел полезными:

Некоторые основные моменты:

Выберите подходящие экранные объекты

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

Используйте getSize() для эталонного кода

getSize() возвращает размер в памяти указанного объекта.

Выберите подходящие типы примитивов для сохранения памяти

Все примитивытипы, кроме String используют 4 - 8 байтов в памяти. Number , представляющее 64-разрядное значение, выделяется 8 байтов виртуальной машиной ActionScript (AVM), если ему не присвоено значение.Поведение отличается для типа String.Оцените код и определите наиболее эффективный объект для задачи.

Повторное использование объектов

Оптимизация памяти за счет повторного использования объектов и избегания их повторного создания при любой возможности.

Использование пула объектов

Повторное использование объектов уменьшает необходимость создания экземпляров объектов, что может быть дорогостоящим.Это также снижает вероятность запуска сборщика мусора, что может замедлить работу приложения.

Свободная память

Чтобы убедиться, что объектis сборщик мусора , удалите все ссылки на объект.Распределение памяти, а не удаление объекта, запускает сборку мусора.Постарайтесь ограничить количество проходов сборки мусора, максимально используя объекты.Кроме того, когда это возможно, установите ссылки на null, чтобы сборщик мусора тратил меньше времени на поиск объектов.Думайте о сборке мусора как о страховке и всегда управляйте временем жизни объекта, когда это возможно.

Установка нулевой ссылки на экранный объект не гарантирует, что объект заморожен.Объект продолжает потреблять циклы ЦП, пока не будет собран мусор.

Класс BitmapData включает в себя метод dispose(), хотя метод dispose удаляет пиксели из памяти,для полного освобождения ссылки по-прежнему необходимо установить значение NULL.

Использование растровых изображений

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

Избегайте фильтров,включая фильтры, обработанные с помощью Pixel Bender

Когда фильтр применяется к экранному объекту, среда выполнения создает две битовые карты в памяти.Использование созданных извне растровых изображений помогает среде выполнения снизить нагрузку на процессор или графический процессор.

Использовать mipmapping для масштабирования больших изображений

Использовать mipmapping экономно.Хотя это улучшает качество уменьшенных растровых изображений, оно влияет на пропускную способность, память и скорость.

Использовать Text Engine для текста только для чтения, TextField для ввода текста

Для текста только для чтения лучше всего использовать Flash Text Engine , который предлагает низкое использование памяти и лучший рендеринг.Для ввода текста объекты TextField являются лучшим выбором, потому что меньше кода ActionScriptтребуется для создания типичных поведений, таких как обработка ввода и перенос слов.

Использование обратных вызовов вместо событий

Использование собственной модели событий можетбыть медленнее и потреблять больше памяти, чем при использовании традиционной функции обратного вызова.Объекты событий должны быть созданы и размещены в памяти, что создает снижение производительности.Например, при прослушивании события Event.ENTER_FRAME новый объект события создается в каждом кадре для обработчика события.Производительность может быть особенно низкой для экранных объектов из-за фаз захвата и всплытия, которые могут быть дорогими, если список отображения является сложным.

Замораживание и размораживание объектов при добавлении / удалении со сцены

Даже если экранные объекты больше не отображаются в списке отображения и ожидают сбора мусора, они все равно могут использовать код, интенсивно использующий ЦП.

КонцепцияЗамораживание также важно при загрузке удаленного контента с помощью класса Loader.

unloadAndStop() метод позволяет выгрузить SWF-файл, автоматически заморозить каждый объект в загруженном SWF-файле и принудительно вызватьсборщик мусора для запуска.

Использование событий Event.ACTIVATE и Event.DEACTIVATE для обнаружения неактивности фона

Event.ACTIVATE* 1170События * и Event.DEACTIVATE позволяют определить, когда среда выполнения получает или теряет фокус.В результате код можно оптимизировать для реагирования на изменения контекста.

События активации и деактивации позволяют реализовать механизм, аналогичный функции «Пауза и возобновление», которая иногда встречается на мобильных устройствах и нетбуках.

По возможности отключить взаимодействие с мышью

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

Использование таймеров для неанимированного контента

Таймеры предпочтительнее, чем Event.ENTER_FRAME события для неанимированного контента, который выполняется долгое время.

Таймер может вести себя аналогично Event.ENTER_FRAMEсобытие, но событие может быть отправлено без привязки к частоте кадров.Такое поведение может предложить значительную оптимизацию.Рассмотрим приложение видеоплеера в качестве примера.В этом случае вам не нужно использовать высокую частоту кадров, потому что движутся только элементы управления приложения.

Ограничение анимации

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

Использование Vector против Array

Класс Vector обеспечивает более быстрый доступ для чтения и записи, чем класс Array .

Доступ к элементам массива и итерации намного быстрее при использованииэкземпляр вектора, чем при использовании массива.

В строгом режиме компилятор может выявлять ошибки типов данных.

Проверка диапазона времени выполнения (или проверка фиксированной длины) значительно повышает надежность по сравнению с массивами.

Использование API рисования для более быстрого выполнения кода

Сокращение объема выполнения кода с использованием drawPath(), drawGraphicsData(), drawTriangles() Меньше строк кода может обеспечитьлучшая производительность выполнения ActionScript.

Использование захвата событий и всплывающих окон для минимизации обработчиков событий

Использование преимуществ всплывающих событий может помочь вамоптимизировать время выполнения кода ActionScript.Вы можете зарегистрировать обработчик событий для одного объекта вместо нескольких, чтобы повысить производительность.

Рисование пикселей с использованием setVector() метода

При рисовании пикселей можно выполнить некоторые простые оптимизации, просто используя соответствующие методы класса BitmapData.Быстрый способ рисования пикселей - использовать метод setVector().

lock() и unlock() BitmapData при использовании медленных методов, таких как setPixel() или setPixel32()

Вызов lock() и unlock() предотвращает ненужное обновление экрана.Методы, которые выполняют итерации по пикселям, такие как getPixel(), getPixel32(), setPixel() и setPixel32(),может быть медленным, особенно на мобильных устройствах.Если возможно, используйте методы, которые получают все пиксели за один вызов.Для чтения пикселей используйте метод getVector(), который быстрее, чем метод getPixels().Кроме того, не забывайте использовать API, которые полагаются на объекты Vector, когда это возможно, поскольку они могут работать быстрее.

Используйте String методы класса вместо регулярных выражений

Когда доступен метод класса String , он работает быстрее, чем эквивалентное регулярное выражение, и не требует создания другого объекта.

Для TextFields используйте apendText() вместо оператора +=

Использование метода appendText() обеспечивает повышение производительности.

Оператор квадратной скобки [] может снизить производительность - сохранить ссылку в локальной переменной

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

Сократите число вызовов функций путем перемещения встроенного кода

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

Перемещение встроенного вызова функции приводит к увеличению кода в четыре раза.

Избегайте размещения содержимоговне сцены

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

Избегайте использования alpha свойство

Когда экранный объект использует смешивание alpha , среда выполнения должна объединить значения цвета каждого сложенного экранного объекта и цвет фона, чтобы определить окончательный цвет.Таким образом, альфа-смешение может быть более ресурсоемким, чем рисование непрозрачного цвета.Это дополнительное вычисление может снизить производительность на медленных устройствах.

Использовать минимально возможную частоту кадров

Более высокая частота кадров увеличивает количество циклов ЦП и энергии отбатареи ниже, чем скорость.

Основы выполнения кода во время выполнения elastic-racetrack

Использование кэширования растрового изображения для сложного вектораcontent

Эта функция кэширует векторный объект, внутренне отображает его как растровое изображение и использует его для визуализации.Кэширование растровых изображений улучшает рендеринг, если кэшированный контент не поворачивается, не масштабируется или не изменяется в каждом кадре.При любом преобразовании, кроме преобразования по осям X и Y, рендеринг не улучшается.

Задать свойство cacheAsBitmapMatrix при использовании кэшированных растровых изображений в мобильных приложениях AIR

cacheAsBitmapMatrix в мобильном профиле AIR вы можете применить любое двумерное преобразование к объекту без регенерации кэшированного растрового изображения.Вы также можете изменить альфа-свойство, не восстанавливая кэшированное растровое изображение.

Используйте класс BitmapData для создания пользовательского поведения кэширования растрового изображения

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

Изолировать такие события, как Event.ENTER_FRAME в одном обработчике

Этот метод экономит ресурсы процессора.

Используйте функцию кэширования растрового изображения и свойство opaqueBackground для улучшения производительности рендеринга текста

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

Альфа-прозрачность накладывает дополнительное бремя на время выполнения, когда рисование прозрачных растровых изображений. Вы можете использовать opaqueBackground свойство, чтобы обойти это, указав цвет в качестве фона.

Включить аппаратное графическое ускорение графического процессора

Чтобы использовать ускорение графического процессора для Flash-содержимого с помощью AIR для для мобильных платформ Adobe рекомендует использовать renderMode = "direct" (то есть Stage3D), а не renderMode = "gpu". Adobe официально поддерживает и рекомендует следующие Stage3D платформы: Старлинг (2D) и Away3D (3D) .

Избегайте использования wmode = прозрачный или wmode = непрозрачный в HTML-коде параметры. Эти режимы могут привести к снижению производительности. Они могут также приводят к небольшой потере аудио-видео синхронизации в обоих программно-аппаратный рендеринг. Кроме того, многие платформы не поддержка рендеринга графического процессора, когда эти режимы действуют, значительно ухудшение производительности.

Пользу с использованием асинхронных версий операций

Код приложения в текущем потоке выполнения продолжает выполняться.

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

Плавные формы для улучшения рендеринга

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

Кэшируйте ресурсы локально после загрузки, а не загружайте их из сети каждый раз, когда они необходимы

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

Используйте класс StageVideo, чтобы воспользоваться аппаратным ускорением

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

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

Аудиоформат AAC обеспечивает лучшее качество и меньший размер файла, чем формат mp3 при эквивалентной скорости передачи данных

Подобно декодированию видео, для декодирования аудио требуются высокие циклы ЦП и можно оптимизировать, используя доступное оборудование на устройстве.

Формат AAC предлагает лучшее качество и меньший размер файла, чем формат mp3 с эквивалентным битрейтом.

Свернуть код в конструкторах

интерпретируются такие функции инициализации, как конструкторы , все остальное JIT.

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