我正在製作一個項目,該項目以幀速率連續繪製圓圈,並在舞臺上爲它們製作動畫,並且遇到性能問題。動作腳本比位圖更快嗎?
我已經將所有對象轉換爲靜態的bitmapData。我的問題是,一旦他們繪製增加性能將圓形轉換爲bitmapData?換句話說,是動畫說,200位圖(透明度)比200矢量圓更快?
這種技術有什麼缺點嗎? (我想可能是不透明的問題?)
如果他們比圓形更復雜的形狀會答案不同?
提高性能的任何其他提示?
非常感謝!
我正在製作一個項目,該項目以幀速率連續繪製圓圈,並在舞臺上爲它們製作動畫,並且遇到性能問題。動作腳本比位圖更快嗎?
我已經將所有對象轉換爲靜態的bitmapData。我的問題是,一旦他們繪製增加性能將圓形轉換爲bitmapData?換句話說,是動畫說,200位圖(透明度)比200矢量圓更快?
這種技術有什麼缺點嗎? (我想可能是不透明的問題?)
如果他們比圓形更復雜的形狀會答案不同?
提高性能的任何其他提示?
非常感謝!
有可能會考慮在這裏的幾個方法:在矢量渲染
賭注通過繪製你的線條和圓圈每一幀。他們每次都會重新渲染,但這就是Flash進行了大量優化的原因,所以這可能比替代方案更快。 (請注意,在繪製不同尺寸的對象的每個幀可能比圖紙它們各自成Sprite
和改變其大小更快。)針對載體渲染
賭注通過前後移動位圖。一個簡單的方法來做到這一點(假設你用AS3繪製形狀)將繪製形狀到Bitmap
對象,然後移動這些對象。你可能不滿意結果的不協調。啓用位圖平滑將有助於(但會降低性能)。
注意:cacheAsBitmap
可能不會做你想要的,因爲緩存的位圖會在對象更改大小(不確定透明度)時被重繪。
投注硬件加速使用cacheAsBitmapMatrix。這僅在AIR中可用,因此它可能不適用於您。 CABM與cacheAsBitmap類似,但不會在重新調整內容時重新繪製內容。此外,在許多情況下,位圖被交給硬件,因此可以在GPU上重新縮放。我相信有些平臺雖然不起作用。這通常非常快,特別是在移動設備上。
在AS3位圖處理的投注通過blitting到一個舞臺大小的BitmapData的東西。但是請注意,即使你這樣做,你仍然需要決定是否將圖形繪製到每個幀的大位圖中(如選項1),或者將它們繪製到各個位圖中,然後將這些(轉換後)的圖像轉換爲每個幀中的大位圖(如選項2)。
我不認爲有什麼辦法可以知道哪個選項最好沒有做實驗。我幾乎可以肯定,如果您使用AIR,並且硬件加速功能在您的平臺上運行,那麼選項3將是最好的選擇,但這可能並非如此。我的直覺是,選項4不會非常有幫助。當您將大量靜態位圖繪製到未轉換的舞臺上時,Blitting速度會非常快,但在這種情況下,您需要生成或變換每個幀的內容,所以我的猜測是blitting的好處不會發生在您的位置瓶頸是。我最好的猜測是選項2會比1快,但你可能不滿意視覺效果。
偉大的答案@fenomas。非常感謝。我正在編譯到一個exe文件,所以我想我可以使用AIR並讓用戶安裝這個東西。你知道在閃存測試環境中是否啓用硬件加速嗎?我認爲應該使用GPU還是CPU加速? – cronoklee 2011-04-12 11:04:18
我並沒有完全掌握細節,但「CPU」應該禁用硬件加速(我總是使用「自動」,我認爲這是推薦的設置。)雖然這樣說,但經過一點谷歌搜索,我真的不是肯定臺式機上HWA的情況。我所說的關於在GPU上縮放的位圖可能取決於某些難以測試的神祕事物。 (如果GPU完全不受影響,我認爲我們可能希望選項3的表現類似於2 ..?)除表面之外還有其他類型的HWA(由HW處理的位圖),這是一個非常神祕的主題。 – fenomas 2011-04-12 13:41:18
非常感謝。我正在用不同的設置進行一些測試。如果我得出任何結論,我可能會報告或寫一篇關於它的博客文章。感謝您的幫助fenomas :) – cronoklee 2011-04-12 14:04:31
有幾個原因可能會遇到性能問題。聽起來你正在使用Event.ENTER_FRAME
事件,這會產生受幀頻影響的動畫速度。使用Timer
類和TimerEvent.TIMER
一起查看基於計時器的動畫。使用一個Timer
對象編排您的動畫可能會幫助您實現所需的性能。
您還可以嘗試在事件處理程序中的事件對象上調用updateAfterEvent()
。我不確定Enter_Frame事件是否可以調用updateAfterEvent()
,但TIMER
事件可以。
如果矢量圓圈本身在舞臺周圍動畫時不會改變形狀,顏色,線條寬度等,那麼該過程應該非常有效。訣竅是確保每次在舞臺上改變位置時不會渲染它們,但只有在其圖形的一個或多個屬性發生更改時纔會重繪。
如果我不得不選擇一件事,我會說你是矢量重繪自己在每個屏幕更新。
如果您正在尋找性能,您可能需要查看Blitting。這是一種過去在2D遊戲中大量使用的技術;在Actionscript中,它通過BitmapData.copyPixels()方法實現。
在很多情況下,顯示錶現速度明顯加快;谷歌術語「在AS3 Blitting」,你會發現很多有價值的數據。 8bitrocket.com也有一些很好的教程。
歡呼@ lunchmeat317 - 我一直在尋找這個好的。事情是我只是使用不同的彩色圓圈,它們必須改變大小並略微移動。 blitting仍然是最好的方法? – cronoklee 2011-04-11 22:23:16
這真的取決於你獲得的表現以及你將在舞臺上展示哪些類型的物體。不過,一般來說,我會說是。有一個網站有一個我要鏈接的blit測試,但是我找不到它。如果我這樣做,我會讓你知道的。 – 2011-04-11 22:47:06
我在答案中擴展了一下,但我對這裏的blitting持謹慎態度,因爲必須繪製或轉換每幀的東西。blitting的好處是可以消除開銷,但是我相信這裏的開銷比繪製或轉換形狀的開銷要小。 – fenomas 2011-04-12 10:14:02
如果您只需要您在那裏描述的內容,則可以將DisplayObject的屬性'cacheAsBitmap'設置爲true。 – 2011-04-11 18:56:30
啊是的!我忘了cacheAsBitmap!多年來沒有用過它。它有很多幫助,但仍然存在一些複雜形狀的問題。硬件加速怎麼樣?這會有幫助嗎? – cronoklee 2011-04-11 19:05:00
我不知道,但你真的不應該太擔心。你能告訴我們你到底想要做什麼嗎? – 2011-04-11 21:12:58