2013-10-27 76 views
0

我需要創建一個由多個PNG組成的具有透明度的圖像。我的解決方案在桌面上完美運行,但我想知道是否可以提高移動設備(iOS)的性能。提高多個PNG合成的性能

我當前的解決方案如下:

首先我所有的圖像加載到存儲器以ImageDecodingPolicy.ON_LOAD,以避免任何的CPU和在加載和解碼的圖像滯後。

第二我加載所需的圖像到Sprite這是永遠不會添加到顯示列表。

最後,我將所有圖像合成爲一個BitmapData對象,並將新的合成圖像淡入前一個圖像。

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

我需要構成整個圖像(而不必在舞臺上的所有的PNG無任何組合物),因爲我需要從先前圖像到新的一個儘可能無縫的過渡。

我試着直接使用圖像的像素數據等,但性能和花費在工作上的時間與使用draw()完全相同。我也嘗試使用drawWithQuality()StageQuality.LOW,並沒有任何區別。我當時的結論是,Air已經優化了所有的位圖工作,如果我是draw()或者直接從BitmapData構成,那真的沒有關係。

我想過創建一個ANE(原生擴展),但我不知道如果這將允許更高的性能。到目前爲止,似乎ANE僅用於訪問本地API而不共享工作負載。

你有什麼想法可以改善嗎?

+0

所以你想說沒有任何組成你可以看到在桌面上的區別? ......我不確定這與剛剛創建像comboBufferSprite這樣的精靈並添加到舞臺上時沒有任何區別......因此,您只需在直接內存塊中創建所有圖像。你能否提供有關這一轉變的更多細節?也許你應該使用stage3D來使用gpu –

+0

好吧,例如,如果你在顯示列表之外組成圖像,其中一個好處是有許多透明像素計算只能發生一次而不是每一幀。這也會影響性能,尤其是在移動設備中進行圖像淡入淡出時的性能。我不確定Stage3D會在計算合成圖像時提供任何好處,但如果您可以在答案中提供一些有關此證據的證據,我肯定會嘗試。 – Pier

+0

那麼你可以將cacheAsBitmap設置爲true。所以我們的主要目的是過渡應該是無縫的。我不確定哪些設備是您的目標,但我認爲所有設備都有gpu。無縫過渡,全部關於渲染。與stage3D你會使用GPU。而gpu只有一個任務是「渲染」。 CPU是通用的,不僅僅用於渲染。你可以給它一個使用starling它容易看到的結果......你還有一件事你必須設置你的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。我試圖將每個PNG中的「bitmapData.copyPixels()'添加到最終的合成圖像,並且沒有性能改進超過了'bitmapData.draw()'。我會再次嘗試併發布我的代碼,也許我做錯了什麼。 – Pier