這可能已經問了個遍,但我無法找到任何所以這裏又來了有用...幾何吞吐調節OpenGL性能
在我的應用程序需要呈現一個相當大的網格(一幾百萬個三角形或更多),而且我遇到一些問題,從中獲得不錯的幀率。 CPU非常空閒,所以我絕對是GPU綁定的。更改分辨率不會影響性能,因此它不受分片或光柵限制。
網格是動態的(但是在本地是靜態的),所以我不能將整個東西存儲在視頻卡中並用一次調用進行渲染。由於具體應用的原因,數據被存儲爲葉子中的體素八叉樹,這意味着我可以基本上免費獲得平截體體。頂點數據由座標,法線和顏色組成 - 不使用紋理或着色器。
我的第一種方法是從內存中渲染一切,使用一個大的VBO,其結果太慢了。我最初的想法是,我可能負擔過重巴士(每幀推算〜150 MiB),所以我實現了一個緩存方案,該方案存儲幾何圖形,最近用於在圖形卡上呈現靜態VBO中的對象,每個VBO存儲幾個100 KiB到一對MiB值的數據(每個VBO存儲更多的緩存抖動,所以這裏有一個折衷)。下面的圖片是數據外觀的一個例子,其中紅色的所有內容都來自緩存的VBO。
Example of the rendered data http://gimaker.users.sourceforge.net/0010.png
如下顯示的數字,我不使用緩存時的性能可提高壯觀。爲約1百萬個三角形全靜態目我得到以下的幀速率:
- 沒有緩存:1.95赫茲
- 使用緩存頂點數組:2.0赫茲(>網格的75%是緩存)
- 緩存使用
STATIC_DRAW
維也納組織:2.4赫茲
所以我的問題是我怎麼加快這? I .: .:
- 什麼是建議的頂點格式,以獲得體面的表現?我使用位置和法線的交錯存儲作爲
GL_FLOAT
和GL_UNSIGNED_BYTE
的顏色,使用一個填充字節獲得4字節對齊(總共28字節/頂點)。 - 對於我的所有盒子,是否對法線使用相同的緩衝區可能會有所幫助(所有盒子都是軸對齊的,這樣我就可以爲最大緩存條目分配一個普通緩衝區並將其用於它們)。
- 我如何知道管道的哪一部分是瓶頸?我沒有一個壯觀的視頻卡(帶有開源Linux驅動程序的Intel GM965),所以有可能達到了極限。典型硬件(2-3年集成顯卡,現代集成顯卡,現代獨立顯卡)可以提供多少吞吐量?
- 你將如何解決這個問題,陷阱任何其他提示等
我沒有興趣在回答提示LOD(我已經測試了這一點),特定供應商的提示或稍後使用任何從OpenGL的功能比1.5。
你的基元只包含軸對齊的盒子嗎? – Stringer 2010-07-13 10:54:08
@Stringer貝爾:是的(但不一定與世界軸線一致)。 – Staffan 2010-07-13 11:02:01
林不知道,但我想你會擊中顯卡的限制。我搜索了一下,似乎英特爾GM965的性能相當低,特別是對於遊戲。 (你的遊戲不是遊戲,但看起來很「難」)。 Nvidia列出了他們的卡片可以渲染多少個三角形 - 也許你可以用這個列表對卡片進行分類,以找出「理論」限制。 – InsertNickHere 2010-07-13 13:29:08