ActionScript - растрировать векторную графику во время выполнения?

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

Я попытался передать векторную графику bitmapData.draw () в объект Bitmap во время выполнения и вместо этого анимировать объект растрового изображения, но это работает примерно так же хорошо (или, может быть, даже точно так же), как простое кэширование векторной графики как битовая карта.

Пользовательский интерфейс Flash Professional 5.5 теперь может преобразовывать векторную графику в ресурсы растрового изображения, но возможно ли это сделать во время выполнения? Можно ли иметь реальную подпрограмму Rasterize () для преобразования программно нарисованной векторной графики и, возможно, даже редактируемого текста в растровые изображения во время выполнения для оптимальной анимированной производительности, особенно на мобильных устройствах?


person Chunky Chunk    schedule 19.05.2011    source источник


Ответы (1)


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

Возможно, у вас есть движок, который во время загрузки вашей игры создает для вас лист спрайтов на основе кадров в MovieClip (если есть анимация). Тогда на них может ссылаться BitmapData.copyPixels().

Это просто:

  1. Создайте объект BitmapData.
  2. Нарисуйте каждый кадр временной шкалы MovieClips на BitmapData, как если бы вы делали это вручную с помощью таблицы спрайтов.
  3. Сохраните BitmapData в ассоциативном массиве для облегчения доступа в дальнейшем, например sheets["zombie1"]

Вы даже можете повернуть объект в цикле for и нарисовать повернутый объект на листе.

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

Это все на правильном пути ..?

person Marty    schedule 20.05.2011
comment
Если у вас все они хранятся в массиве, вам действительно не нужно помещать их в лист спрайтов. Вы можете просто получить к ним доступ из массива, например, animations [zombie_walk] = zombieWalkFrames - ваш массив кадров для этой анимации. Обычно я использую спрайт-листы только в том случае, если контент был создан таким образом. Если в качестве источника используются векторные фрагменты роликов, лучше всего использовать массивы и управлять ими таким образом. - person prototypical; 20.05.2011
comment
Я не пишу никаких фрейм-скриптов. это вся программно созданная векторная графика (API рисования) и Tweener для анимации. да, я вращаю и масштабирую графику - например, на экране есть квадрат. прикосновение к квадрату заставляет его парить над сценой, слегка увеличивая его масштаб и смещая его тень. Я понимаю, что добавление фильтров к векторной графике автоматически кэширует графику как растровое изображение. Предполагается, что масштабирование / поворот векторной графики (без фильтров) быстрее, чем масштабирование / поворот растровых изображений? Кроме того, я публикуюсь в AIR 2.5, но еще не пробовал AIR 2.6. - person Chunky Chunk; 20.05.2011
comment
Множественные объекты с примененными фильтрами, которые перемещаются, изменяют форму, вращаются или действительно делают что-либо, кроме статических, будут очень сильно снижать производительность - независимо от того, какой они тип объекта (растровое изображение / вектор). - person Marty; 20.05.2011
comment
Вы можете предварительно отрендерить вращение / масштабирование, если вам нужна скорость. CopyPixels - это путь, по которому вы хотите пройти в блиттинге, он быстрее, чем рисование. Как говорит Марти, нет никакого способа избежать снижения производительности, если вы выполняете масштабирование / вращение на лету. Имейте в виду, что bitmapCaching на самом деле замедляет вас, если вы масштабируете / вращаете векторы. В этом случае вам будет лучше без кэширования растровых изображений. Потому что он будет кэшировать новый масштаб / поворот каждый кадр. Также имейте в виду, что если вы хотите вращать / масштабировать растровое изображение на лету, оно будет немного неровным по сравнению с вектором. - person prototypical; 20.05.2011