2011-04-11 73 views
2

我正在製作一個項目,該項目以幀速率連續繪製圓圈,並在舞臺上爲它們製作動畫,並且遇到性能問題。動作腳本比位圖更快嗎?

我已經將所有對象轉換爲靜態的bitmapData。我的問題是,一旦他們繪製增加性能將圓形轉換爲bitmapData?換句話說,是動畫說,200位圖(透明度)比200矢量圓更快?

這種技術有什麼缺點嗎? (我想可能是不透明的問題?)

如果他們比圓形更復雜的形狀會答案不同?

提高性能的任何其他提示?

非常感謝!

+0

如果您只需要您在那裏描述的內容,則可以將DisplayObject的屬性'cacheAsBitmap'設置爲true。 – 2011-04-11 18:56:30

+0

啊是的!我忘了cacheAsBitmap!多年來沒有用過它。它有很多幫助,但仍然存在一些複雜形狀的問題。硬件加速怎麼樣?這會有幫助嗎? – cronoklee 2011-04-11 19:05:00

+0

我不知道,但你真的不應該太擔心。你能告訴我們你到底想要做什麼嗎? – 2011-04-11 21:12:58

回答

2

有可能會考慮在這裏的幾個方法:在矢量渲染

  1. 賭注通過繪製你的線條和圓圈每一幀。他們每次都會重新渲染,但這就是Flash進行了大量優化的原因,所以這可能比替代方案更快。 (請注意,在繪製不同尺寸的對象的每個幀可能比圖紙它們各自成Sprite和改變其大小更快。)針對載體渲染

  2. 賭注通過前後移動位圖。一個簡單的方法來做到這一點(假設你用AS3繪製形狀)將繪製形狀到Bitmap對象,然後移動這些對象。你可能不滿意結果的不協調。啓用位圖平滑將有助於(但會降低性能)。
    注意:cacheAsBitmap可能不會做你想要的,因爲緩存的位圖會在對象更改大小(不確定透明度)時被重繪。

  3. 投注硬件加速使用cacheAsBitmapMatrix。這僅在AIR中可用,因此它可能不適用於您。 CABM與cacheAsBitmap類似,但不會在重新調整內容時重新繪製內容。此外,在許多情況下,位圖被交給硬件,因此可以在GPU上重新縮放。我相信有些平臺雖然不起作用。這通常非常快,特別是在移動設備上。

  4. 在AS3位圖處理的投注通過blitting到一個舞臺大小的BitmapData的東西。但是請注意,即使你這樣做,你仍然需要決定是否將圖形繪製到每個幀的大位圖中(如選項1),或者將它們繪製到各個位圖中,然後將這些(轉換後)的圖像轉換爲每個幀中的大位圖(如選項2)。

我不認爲有什麼辦法可以知道哪個選項最好沒有做實驗。我幾乎可以肯定,如果您使用AIR,並且硬件加速功能在您的平臺上運行,那麼選項3將是最好的選擇,但這可能並非如此。我的直覺是,選項4不會非常有幫助。當您將大量靜態位圖繪製到未轉換的舞臺上時,Blitting速度會非常快,但在這種情況下,您需要生成或變換每個幀的內容,所以我的猜測是blitting的好處不會發生在您的位置瓶頸是。我最好的猜測是選項2會比1快,但你可能不滿意視覺效果。

+0

偉大的答案@fenomas。非常感謝。我正在編譯到一個exe文件,所以我想我可以使用AIR並讓用戶安裝這個東西。你知道在閃存測試環境中是否啓用硬件加速嗎?我認爲應該使用GPU還是CPU加速? – cronoklee 2011-04-12 11:04:18

+0

我並沒有完全掌握細節,但「CPU」應該禁用硬件加速(我總是使用「自動」,我認爲這是推薦的設置。)雖然這樣說,但經過一點谷歌搜索,我真的不是肯定臺式機上HWA的情況。我所說的關於在GPU上縮放的位圖可能取決於某些難以測試的神祕事物。 (如果GPU完全不受影響,我認爲我們可能希望選項3的表現類似於2 ..?)除表面之外還有其他類型的HWA(由HW處理的位圖),這是一個非常神祕的主題。 – fenomas 2011-04-12 13:41:18

+0

非常感謝。我正在用不同的設置進行一些測試。如果我得出任何結論,我可能會報告或寫一篇關於它的博客文章。感謝您的幫助fenomas :) – cronoklee 2011-04-12 14:04:31

-1

有幾個原因可能會遇到性能問題。聽起來你正在使用Event.ENTER_FRAME事件,這會產生受幀頻影響的動畫速度。使用Timer類和TimerEvent.TIMER一起查看基於計時器的動畫。使用一個Timer對象編排您的動畫可能會幫助您實現所需的性能。

您還可以嘗試在事件處理程序中的事件對象上調用updateAfterEvent()。我不確定Enter_Frame事件是否可以調用updateAfterEvent(),但TIMER事件可以。

如果矢量圓圈本身在舞臺周圍動畫時不會改變形狀,顏色,線條寬度等,那麼該過程應該非常有效。訣竅是確保每次在舞臺上改變位置時不會渲染它們,但只有在其圖形的一個或多個屬性發生更改時纔會重繪。

如果我不得不選擇一件事,我會說你是矢量重繪自己在每個屏幕更新。

+0

謝謝@elekwent。你認爲哪個過程更有效? bitmapData進程?圓只在大小位置和不透明度方面發生變化 – cronoklee 2011-04-11 18:25:59

+0

我指的是在舞臺周圍的移動向量是有效的,只要向量的圖形不會在每一幀中重繪。 – elekwent 2011-04-11 19:02:37

+0

再次感謝@elekwent。實際上,我使用補間類爲圈子設置動畫,據我所知,他們不會重新繪製每一幀,而只是四處移動。我可以嘗試以較低的幀速率進行動畫製作,但喜歡使運動保持平滑柔滑。 – cronoklee 2011-04-11 19:39:46

1

如果您正在尋找性能,您可能需要查看Blitting。這是一種過去在2D遊戲中大量使用的技術;在Actionscript中,它通過BitmapData.copyPixels()方法實現。

在很多情況下,顯示錶現速度明顯加快;谷歌術語「在AS3 Blitting」,你會發現很多有價值的數據。 8bitrocket.com也有一些很好的教程。

+0

歡呼@ lunchmeat317 - 我一直在尋找這個好的。事情是我只是使用不同的彩色圓圈,它們必須改變大小並略微移動。 blitting仍然是最好的方法? – cronoklee 2011-04-11 22:23:16

+0

這真的取決於你獲得的表現以及你將在舞臺上展示哪些類型的物體。不過,一般來說,我會說是。有一個網站有一個我要鏈接的blit測試,但是我找不到它。如果我這樣做,我會讓你知道的。 – 2011-04-11 22:47:06

+0

我在答案中擴展了一下,但我對這裏的blitting持謹慎態度,因爲必須繪製或轉換每幀的東西。blitting的好處是可以消除開銷,但是我相信這裏的開銷比繪製或轉換形狀的開銷要小。 – fenomas 2011-04-12 10:14:02