Растровые изображения ActionScript быстрее, чем векторы? - PullRequest
2 голосов
/ 11 апреля 2011

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

Я уже конвертирую все объекты в bitmapData, как только онистать статичным.У меня вопрос, будет ли преобразование кругов в bitmapData, как только они нарисованы, повысить производительность?Другими словами, является ли анимация, скажем, 200 растровых изображений (с прозрачностью) быстрее, чем 200 векторных кругов?

Есть ли недостатки этого метода?(Я думаю, что проблемы с непрозрачностью могут быть?)

Если бы они были более сложными формами, чем круги, ответ был бы другим?

Какие-либо другие советы по улучшению производительности?много!

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

Здесь вы можете рассмотреть несколько подходов:

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

  2. Ставка против векторного рендерера путем перемещения растровых изображений. Простой способ сделать это (предполагая, что вы рисуете фигуры с помощью AS3) - нарисовать фигуры в Bitmap объектах, а затем переместить их. Возможно, вас не устраивает неровность результата. Включение сглаживания растровых изображений поможет (но потребует некоторой производительности).
    Примечание: cacheAsBitmap, вероятно, не будет делать то, что вы хотите здесь, потому что кэшированные растровые изображения перерисовываются при изменении размера объекта (не уверен насчет прозрачности).

  3. Ставка на аппаратное ускорение с использованием cacheAsBitmapMatrix . Это доступно только в AIR, поэтому оно может не работать для вас. CABM похож на cacheAsBitmap, но он не перерисовывает содержимое при его масштабировании. Кроме того, во многих случаях растровое изображение передается аппаратному обеспечению и, таким образом, может быть перераспределено на графическом процессоре. Я считаю, что есть платформы, где это не работает. Обычно это очень быстро, особенно на мобильных устройствах.

  4. Ставка на обработку растрового изображения AS3 путем помещения данных в BitmapData размером с этап. Но учтите, что даже если вы сделаете это, вам все равно нужно решить, следует ли рисовать фигуры в вашем большом растровом изображении в каждом кадре (например, в варианте 1) или перетаскивать их в отдельные растровые изображения и разбивать их (преобразовывать) в большие растровые изображения в каждом кадре (например вариант 2).

Я не думаю, что есть какой-либо способ узнать, какой вариант лучше без экспериментов. Я почти уверен, что вариант 3 будет лучшим, если вы используете AIR и если HW ускорение работает на вашей платформе, но это может быть не так. Мой инстинкт инстинкта заключается в том, что вариант 4 не будет ужасно полезным. Блиттинг может быть очень быстрым, когда вы рисуете много статических растровых изображений на нетрансформированной сцене, но в этом случае вам нужно либо генерировать, либо преобразовывать контент в каждом кадре, поэтому я предполагаю, что преимущество блинтинга не будет происходить там, где ваш Узкое место есть. Я думаю, что вариант 2 будет быстрее, чем 1, но вы, возможно, не будете довольны визуальными эффектами.

1 голос
/ 12 апреля 2011

Возможно, вы захотите взглянуть на Blitting, если вы ищете производительность. Это техника, которая широко использовалась в 2D играх; в Actionscript это реализовано с помощью метода BitmapData.copyPixels ().

Во многих случаях это значительно быстрее отображения списка; Google термин «Blitting в AS3», и вы найдете много полезных данных. 8bitrocket.com также имеет несколько хороших обучающих программ.

0 голосов
/ 11 апреля 2011

Существует ряд причин, по которым у вас могут возникнуть проблемы с производительностью.Похоже, вы используете событие Event.ENTER_FRAME, которое генерирует скорости анимации в зависимости от частоты кадров.Посмотрите на анимацию по таймеру, используя класс Timer вместе с TimerEvent.TIMER.Использование одного Timer объекта для организации вашей анимации может помочь вам добиться требуемой производительности.

Вы также можете попробовать вызвать updateAfterEvent() для объекта события в вашем обработчике событий.Я не уверен, может ли событие Enter_Frame вызывать updateAfterEvent(), но может TIMER событие.

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

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

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