2009-07-15 173 views
1

我目前正在研究一款小型iPhone遊戲,並且正在移植我已經開始爲Mac開發iPhone的3D引擎。這一切都很順利,Mac引擎的所有功能現在都在iPhone上。引擎並沒有完成,但現在至少我有了基本的資源管理,場景圖和一個可輕鬆製作和移動物體的構造。OpenGL渲染狀態管理

我現在擁有的屏幕截圖:http://emle.nl/forumpics/site/planes_grid.png。這架小飛機是我幾年前製作的一款測試物體,當時我正在製作一款遊戲。這與我現在正在開發的遊戲無關,但當然,3D引擎及其設施也是如此。

現在,我已經談到材料的主題,描述哪些紋理,燈光等屬於可渲染對象。這意味着每個對象都有很多OpenGL的clientstate和glEnable/glDisable調用。你會建議如何最小化這些狀態變化? 目前我按材質排序,因爲具有相同材質的物體根本不需要任何更改。我創建了一個名爲RenderState的類,用於緩存當前的OpenGL狀態,並且僅應用選擇不同材質時不同的成員。這是一個可行的解決方案嗎?或者當引擎成熟並且需要緩存越來越多的狀態時,它會變得無法控制嗎?

回答

3

如果OpenGL ES中的狀態數量與標準版本一樣高,那麼在某些時候將難以管理。另外,如果你真的想最大限度地減少狀態變化,你可能需要某種狀態排序的概念,這樣具有相似狀態的drawable就會被渲染在一起,而不需要在它們之間需要很多glEnable/glDisable。然而,即使在個人電腦硬件上也可能難以管理(想象如何分類數千個可繪製的狀態)並且盲目地改變狀態可能實際上更便宜,這取決於OpenGL的實現。

爲了比較,這裏是由OpenSceneGraph的所採取的辦法:

基本上,在場景圖中的每個節點都有自己的stateset存儲材料的性能,狀態等的好處是,statesets可以通過共享多個節點。通過這種方式,渲染後端可以根據其狀態集指針(而不是狀態集的內容)對可繪製對象進行排序,並將具有相同狀態集的節點渲染到一起。這提供了一個很好的折衷,因爲後端不需要管理單個opengl狀態,但如果場景圖是相應生成的,則可以實現接近最小的狀態改變。

我建議,在你的情況下,你應該在堅持解決方案之前做很多測試。無論你做什麼,我都確定你需要對OpenGL狀態進行某種抽象。

5

一點建議。只需編寫你遊戲所需的代碼即可。不要花時間寫一個通用的渲染引擎,因爲它很可能不需要它。如果你結束編寫另一個遊戲,然後將有用的比特提取到一個引擎中。這將會更快。

+0

你有一個點。然而,至少有一個稍微普遍和優化的圖形引擎會讓我快速加快我的幾個想法。我認爲,渲染性問題仍然有效,因爲遊戲特定的引擎也必須執行一些渲染管理。 – Emiel 2009-07-20 14:01:20