2012-05-10 91 views
0

我正在閱讀Nehe OpenGL教程,並有一個關於顯示列表的教程。是否有任何理由使用它而不是「類和對象」方式?例如,創建類的立方體,然後只是簡單地寫cube.render(x,y,z); ?Opengl - 顯示列表與OOP

回答

3

想法是利用硬件和板載顯示列表處理。基本上,你會在圖形處理器的內存中創建顯示列表,然後通過發送一個命令來顯示整個列表,而不是在每次顯示對象時重新發送所有座標。這可以大幅降低CPU與GPU之間的帶寬需求。

實際上,它在很大程度上依賴於您正在使用的硬件和OpenGL實現。通過一些實現,顯示列表可以幫助您大幅提升性能 - 但在其他實施中,它基本上沒有任何優勢。

1

我在閱讀Nehe OpenGL教程,並且有關於顯示列表的教程。

我建議停止閱讀訥河。我從來沒有見過任何與Ne和相關的東西在stackoverflow上被提及,而我看到的教程使用了太多的特定於平臺的API。

取代NEHE,轉到OpenGL.org並檢查「書籍」部分。或者,第一版「OpenGL紅皮書」可在glprogramming.com處獲得。雖然它不包含OpenGL 4中的最新API,但通過「兼容性配置文件」,即使在最新版本的OpenGL中,所有可用的方法仍然可用。

是否有任何理由使用它來代替「類和對象」的方式?

你混淆了兩個不同的概念。顯示列表是OpenGL的方式來保存OpenGL調用序列,以便以後可以快速「召回」它們。取決於OpenGL的實現,它可能會提高應用程序的性能。顯示列表的使用與您的程序(OOP)的內部組織無關。您可以使用OOP並仍使用cube.render()中的顯示列表。或者你可以使用頂點緩衝對象或任何你想要的。或者你可以使用「非OOP」風格並仍然使用顯示列表。

1

顯示列表是在GPU級別預編譯的。 您自己的渲染功能是在CPU級別編譯的,其各個命令在運行時仍需要通過GPU。

這就像比較「存儲過程」與調用內聯SQL的自定義函數。 編譯存儲過程並在服務器端生成執行計劃,而自定義函數僅在客戶端組件中編譯。 「

+0

」顯示列表在GPU級別預編譯。「不正確,這是不能保證的。存儲顯示列表的位置以及特定實現的方式,並未在OPenGL標準中定義。請閱讀標準。 – SigTerm

+1

@SigTerm:OpenGL標準中的任何內容都不能保證在GPU或CPU上運行。但是這個答案清楚地說明了它是如何完成的*。所以,從我+1。 – ybungalobill