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

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

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

(Я нацелен на Flash 10, если это имеет значение)

11 голосов | спросил Alconja 22 J000000Thursday10 2010, 08:00:32

3 ответа


14

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

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

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

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

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

Я предполагаю, что вы имели в виду «bitmap sprite-sheets», а не класс AS3 Sprite ?

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

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

3. Анимация на основе спрайтов

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

ответил bummzack 22 J000000Thursday10 2010, 11:51:48
6

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

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

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

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

ответил Consty 22 J000000Thursday10 2010, 09:24:45
3

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

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

ответил Iain 22 J000000Thursday10 2010, 17:45:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132