2012-03-19 112 views
4

所以我用C++製作遊戲。我正在路上岔路口。使用openGL渲染/動畫2d的最佳方式?

我現在打算我會如何處理動畫和渲染優化。我使用即時模式進行渲染,我被告知速度很慢。我去尋找替代品,然後有很多不同的方法,它取決於你如何處理動畫,所以我想我會問什麼是一個很好的最佳方式來做到這一點。

對於動畫,我考慮使用存儲在存儲器中的圖像的序列,而只用一個50個圖像序列進行測試時,存儲器躍升至喜歡200 MB,當它之前爲30。 (沒有泄漏,它保持在200,但如果我有很大的水平,看起來我會用完內存)。精靈表會在這種情況下幫助嗎?

我被告知使用地圖集或精靈表的原因是因爲綁定不同的紋理是一個昂貴的操作,所以這個工作的唯一方法是將所有我將用於1級的紋理放入例如一個巨大的紋理,所以我只綁定一次。這可能是動態的嗎?使用

將一個巨大的PNG比裝載50 PNG的更好的內存明智?

與任何優化渲染或有關這些動畫技術的缺點的一些信息任何幫助將非常感激!

回答

4

有人告訴我是非常緩慢的

我建議忽略這一點。除非你要使用精靈數量(數萬個),否則瓶頸將從紋理讀取數據,這受限於顯卡的內存傳輸速率。換句話說,如果您有1280x1024視口,並且繪製了覆蓋整個視口的1280x1024紋理(並且每個紋理貼圖映射到屏幕像素),那麼您的FPS將會下降,並且VBO不會有幫助。立即模式比VBO更容易用於2D。所以繼續使用直接模式,直到你決定使用大量的精靈。

我想過使用存儲在內存中

你需要,你可以進入單紋理塞進儘可能多的精靈圖像序列。切換紋理會產生很大的減速,所以最好的辦法是使用巨大的紋理(4096x4096或更大--16384x16384會很好),並加載所有可以進入的精靈。這可以使用glSubTexImage2D完成。存儲每個框架單獨的紋理會產生巨大的放緩。請注意,您不必將精靈存儲在合併爲單個紋理的磁盤上。加載時可以將它們粘合在一起。

使用一個巨大的PNG會比加載50個PNG更好的記憶方式嗎?存儲在磁盤上

PNG圖像文件格式。它與OpenGL無關。一旦你加載紋理它不再是一個「PNG」 - 它完全解壓縮。因此,如何將圖像數據存儲在磁盤上幾乎無關緊要。它會影響圖像加載速度,但紋理性能/內存使用與圖像存儲格式無關。如果你的內存不足,那麼你必須做關於它的一些事情 - 實現遊戲資產流,或調整關卡的精靈/紋理「預算」。

+1

謝謝你的幫助!很高興知道我不必將我的渲染技術轉到VBO。關於PNG部分,這很好理解!但是我實際上只是指加載1個更好的圖片比加載50個更小的圖片並將它們保存在內存中更好,但我猜兩者都會在內存中佔用相同的空間量? – 2012-03-21 03:17:34

4

使用VBO的,而不是直接的方式:http://www.opengl.org/wiki/Vertex_Buffer_Object

雪碧牀單有兩個好處,首先,當你發現,你只需要一個紋理綁定。就內存而言,工作表只會給你內存連續的優點(無碎片),但實際的內存量不會少。加載一個大.png的速度肯定比加載速度快50個小。有一件事你應該知道的是,你可以在將圖像上傳到openGL紋理後釋放圖像的實際內存。否則,你有它在RAM和GPU內存,這沒有多大意義。

你可以做的另一件事是使用不同的動畫技術,如關鍵幀或骨骼動畫(也2D一種有效的方法)來移動精靈左右而不是保存每個州一個額外的圖像/精靈。這肯定會減少GPU和RAM的內存使用量!

希望有幫助!

+0

謝謝你的解釋!這真的有點亮。 – 2012-03-21 03:18:00