2010-07-13 72 views
14

這可能已經問了個遍,但我無法找到任何所以這裏又來了有用...幾何吞吐調節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_FLOATGL_UNSIGNED_BYTE的顏色,使用一個填充字節獲得4字節對齊(總共28字節/頂點)。
  • 對於我的所有盒子,是否對法線使用相同的緩衝區可能會有所幫助(所有盒子都是軸對齊的,這樣我就可以爲最大緩存條目分配一個普通緩衝區並將其用於它們)。
  • 我如何知道管道的哪一部分是瓶頸?我沒有一個壯觀的視頻卡(帶有開源Linux驅動程序的Intel GM965),所以有可能達到了極限。典型硬件(2-3年集成顯卡,現代集成顯卡,現代獨立顯卡)可以提供多少吞吐量?
  • 你將如何解決這個問題,陷阱任何其他提示等

我沒有興趣在回答提示LOD(我已經測試了這一點),特定供應商的提示或稍後使用任何從OpenGL的功能比1.5。

+0

你的基元只包含軸對齊的盒子嗎? – Stringer 2010-07-13 10:54:08

+0

@Stringer貝爾:是的(但不一定與世界軸線一致)。 – Staffan 2010-07-13 11:02:01

+1

林不知道,但我想你會擊中顯卡的限制。我搜索了一下,似乎英特爾GM965的性能相當低,特別是對於遊戲。 (你的遊戲不是遊戲,但看起來很「難」)。 Nvidia列出了他們的卡片可以渲染多少個三角形 - 也許你可以用這個列表對卡片進行分類,以找出「理論」限制。 – InsertNickHere 2010-07-13 13:29:08

回答

5

你可能不會喜歡這種反應....

我已經找到了自己的問題:英特爾GM965與開源的Linux驅動程序

雖然我目前的工作不打你的音量數據,我們已經在VBO中渲染了數百萬個頂點,並且英特爾圖形硬件/驅動程序已被證明無用。讓自己的NVidia卡(並得到了不得不使用二進制驅動程序,它只是工作),你會一切設置。即使是頂級的Quadro(如果工作正在付費)或者頂級的GTX 400系列(如果您正在付費或者只是想在工作中節省一些費用),也不一定是當代產品,但應該可以做到最好驅動程序。如果升級您的機器不是一個選項,您也可以嘗試找到具有此硬件的計算機進行測試。

+0

看起來你是對的。我在具有更好圖形的機器上進行了測試,但不是Quadro,但仍然更好,並且獲得了15赫茲的緩存,一半沒有。這比問題更不方便,因爲我只是開發人員,而不是當前的主要用戶。 – Staffan 2010-07-13 19:16:09

+0

@Staffan:這並不意味着你有最大的GMA 965給我。也許你只是在做一些糟糕的表演。坦率地說,我會考慮嘗試英特爾媒體加速器分析器(如果您的應用程序是可移植的當然)。不要忘記GMA是基於瓦片的渲染器。 – Stringer 2010-07-13 20:41:39

+0

@Stringer Bell:它看起來確實是視頻卡/驅動程序設置的限制。在對我的緩存機制進行了一些調整之後,我在GeForce 3 Ti200上獲得了大約2800萬個三角形/秒,但沒有關於它可以推出多少個三角形的官方規範,但看起來這可能相當接近極限。 – Staffan 2010-07-13 23:35:47

0

我會首先使用性能分析器(如gDEBugger),因此您可以確定是否是頂點,片段或總線限制等。很難猜測在這種特殊情況下要執行哪些優化(英特爾+開源驅動程序)。

你也試過VA模式嗎?你在用glDrawElements嗎? glDrawArrays?數據頂點緩存是否友好(前後變換)?

+0

Bell:如果Linux有開源(或免費)的話,我會使用OpenGL分析器(請參見[我的其他問題](http://stackoverflow.com/questions/3235864/open-source-opengl-profiler-對於Linux的))。開源驅動程序是英特爾開發的官方驅動程序,但我想你已經知道了。我使用glDrawArrays,因爲我無法在頂點之間共享數據(所有頂點都有不同的法線或位置)。什麼是VA模式?數據是緩存友好的AFAICT,即交錯存儲(不確定轉換如何影響)。 – Staffan 2010-07-13 11:00:18

+0

儘管我是封閉源代碼,但我嘗試過gDEBugger,但它不適用於我(給我一個間接上下文,然後導致SIGSEGV)。 – Staffan 2010-07-13 11:17:53

+0

VA模式是普通的1.1頂點數組。僅當您有索引時才使用後變換緩存(請參閱http://www.opengl.org/wiki/Post_Transform_Cache)。你使用GL_QUAD或GL_TRIANGLES來渲染你的盒子嗎? – Stringer 2010-07-13 11:23:13

0

我不知道你的「網格」,但似乎他們都是立方體。如果有可能,請將單個聯合多維數據集渲染到顯示列表並呈現該顯示列表的縮放版本。這通常會使速度提高10倍,因爲總線不會被頂點數據泵入或視頻內存耗盡。

當然,這取決於你改變數據的能力。它可能不是這樣,如果它真的不像在圖片上。

+0

它們都是長方體,是的。正如我在OP中所描述的那樣,我使用與VBO共享的緩存來避免總線過載 - 在生成上述映像時不涉及glVertex3()調用。 – Staffan 2010-07-16 15:14:45

+0

但是VBO!= Display List ...不同之處在於VBO仍然使用大陣列,即使它在視頻內存中。在大多數情況下,對於像這樣的設置,我最擔心的是在頂點數組中調用10000 x一個DL 10000的立方體。 – rioki 2010-07-18 20:25:25