2013-10-27 4 views
0

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

мое текущее решение заключается в следующем:

Сначала я загрузить все изображения в памяти с ImageDecodingPolicy.ON_LOAD, чтобы избежать какого-либо процессора и отставание во время загрузки и декодирования изображений.

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

Наконец, я скомпоную все изображения в объект BitmapData и выцветаю новое сложенное изображение по сравнению с предыдущим.

bitmapData.draw(compositionBufferSprite,null,null,null,rect,false); 

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

Я попытался работать непосредственно с пиксельными данными изображений и т. Д., Но производительность и время, затраченное на работу, были точно такими же, как с использованием draw(). Я также попытался использовать drawWithQuality() с StageQuality.LOW, и не было никакой разницы. В то время мой вывод заключался в том, что Air уже оптимизировал всю эту растровую работу, и это действительно неважно, если я draw() или сочиню напрямую с BitmapData.

Я думал о создании ANE (собственное расширение), но я не знаю, если это позволит повысить производительность. Пока кажется, что ANE существуют только для доступа к родным API, не разделяющим рабочую нагрузку.

Есть ли у вас какие-либо идеи о том, как я мог бы улучшить это?

+0

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

+0

Ну, например, одним из преимуществ, если вы составляете изображение за пределами списка отображения, является то, что существует много прозрачных вычислений пикселей, которые происходят только один раз, а не каждый кадр. Это также влияет на производительность при выцветании изображений внутри и вне, особенно на мобильных устройствах. Я не уверен, что Stage3D предоставит вам какие-либо преимущества при вычислении композитного изображения, но если вы сможете предоставить некоторые доказательства об этом в ответ, я постараюсь это сделать точно. – Pier

+0

хорошо, тогда вы можете просто установить cacheAsBitmap как true. поэтому наша основная цель - переход. Я не уверен, какие устройства являются вашей целью, но я предполагаю, что у всех есть gpu. бесшовный переход, все о рендере.с stage3D вы будете использовать gpu. и gpu имеет только одну задачу - «рендеринг». cpu является общим не только для рендеринга. вы можете дать ему возможность использовать скрипинг, его легко увидеть результат ... еще одна вещь, которую вы должны установить, чтобы ваш renderMode был прямым для использования stage3D для рендеринга gpu. –

ответ

1

Даже если разница в производительности может быть незначительной на данном этапе, вы должны попробовать процесс, называемый blitting.

По сути вы объединить все различные рамки вашей PNG в единый (растровый) спрайта листа, а затем перенести данные растрового изображения вокруг изменить кадров по телефону bitmapData.scroll(x, y)

author of this blog удалось добиться значительного увеличения производительности и снижение потребления памяти по сравнению с обычными мувиклипами.

Here is a link to the greensock library which describes the process in further detail.

+0

Я думаю, что я уже пробовал это, не зная, что это называется blitting. Я попытался «bitmapData.copyPixels()» от каждого PNG до окончательного скомпонованного изображения, и никаких улучшений производительности над «bitmapData.draw()» не было. Я попробую еще раз и отправлю свой код, возможно, я сделал что-то не так. – Pier

Смежные вопросы