Производительность рендеринга для Flash-игр


11

Я читал на SO о рендеринге встроенной флэш-памяти по сравнению со сборкой собственного BitmapDataбуфера кадров, и некоторые ответы были немного противоречивыми, поэтому мне было интересно:

  1. Как правило, рекомендуется использовать собственный маршрут буфера растровых изображений или лучше оставить рендеринг на флеш-движок?
  2. Если вы используете векторные анимации MovieClipв отличие от спрайтов, это изменит ответ на вышеприведенный?
  3. Если да, то лучше ли использовать спрайт-анимацию?

(Я нацеливаюсь на Flash 10, если это что-то меняет)

Ответы:


14

1. Нет общей передовой практики.

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

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

Итак, в заключение, все сводится к тому, какую игру вы строите.

2. Использование MovieClips вместо растровых спрайт-листов

Полагаю, вы имели в виду «растровые спрайт-листы», а не класс AS3 Sprite ?

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

  1. Создайте экземпляр мувиклипа и stop()его.
  2. Создайте new BitmapDataобъект с той же шириной и высотой, что и мувиклип.
  3. Используйте метод draw () , чтобы отобразить мувиклип в BitmapData.
  4. Сохраните объект BitmapData в массиве или векторе.
  5. Перейдите к следующему кадру мувиклипа и повторите шаги 2–4, делайте это, пока не достигнете последнего кадра мувиклипа. Также неплохо обновить две переменные с максимальной шириной и максимальной высотой ваших кадров MovieClip (поскольку они могут меняться от кадра к кадру).
  6. Теперь вы можете объединить все сохраненные объекты BitmapData в лист Sprite (используйте BitmapData.copyPixels () )

3. Спрайт-анимация

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


Когда (если?) Flash начинает использовать аппаратное ускорение для своего рендеринга, рендеринг copyPixel, вероятно, будет медленнее, чем собственный рендерер.
Барт ван Хейкелом

6

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

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

Использование встроенных Flash-механизмов анимации лучше всего подходит для векторных игр, поскольку вы можете легко создавать свои ресурсы библиотеки в виде MovieClips, которые затем можно создавать в ActionScript по требованию. Вы используете временную шкалу, предоставленную для видеоклипов, для обработки анимации и соответственно перемещаете местоположение спрайта. Все битвы на! игры типа Adventure Quest Worlds используют этот метод. Это выглядит красиво тоже.

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


3

Несмотря на то, что принято считать, что блиттинг быстрее, я не видел никаких тестов, подтверждающих это. Некоторые разработчики предпочитают блиттинг, потому что он позволяет им рассматривать Flash как обычную виртуальную машину и самостоятельно контролировать рендеринг. Однако, если вам нравится встроенный список отображения (что я и делаю), Flash может легко перемещать, масштабировать, поворачивать и применять приятные эффекты к сотням экранных объектов DisplayObject (например, MovieClips, Sprites, Bitmaps) с высокой частотой кадров, поэтому если они достаточно малы по размерам, например, менее 200x200 пикселей каждый. Вы можете использовать MovieClips без использования векторов. Большинство игр будут использовать растровые ресурсы в зависимости от используемой системы. Но иногда полезно размещать и анимировать растровые ресурсы на временной шкале, особенно если вы работаете с Flash-специалистом, а не с пиксельным художником. Установив качество сцены на LOW, вы получите гораздо лучшую производительность за счет более уродливых преобразований. Flash не будет отображать объекты, находящиеся за пределами экрана, поэтому они не замедляют работу.

Там, где Flash может замедляться, это перемещение и преобразование очень больших растровых изображений - например, если у вас очень большой уровень прокрутки или много слоев параллакса. Гибридный подход к использованию MovieClips для игровых объектов при одновременном стирании фона из внеэкранного буфера может быть более быстрым и позволит вам иметь бесконечно большие уровни, в то же время обеспечивая простоту использования стандартных спрайтов и MovieClips.


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

Вы можете использовать MovieClips без использования векторов. Большинство игр будут использовать растровые ресурсы в зависимости от используемой системы. Но иногда полезно размещать и анимировать растровые ресурсы на временной шкале, особенно если вы работаете с Flash-специалистом, а не с пиксельным художником.
Иан

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

Некоторые тесты рендеринга и обновления: 8bitrocket.com/2007/12/23/…
Max Dohme
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.