2009-12-10 11 views
0

我期待在我的iPhone應用程序上獲得一些額外的性能(FPS)增加。我已經在使用交錯數據,GL_SHORT和一張紋理圖集。請參閱this question瞭解我已完成的操作的詳細信息。即使在更改模型視圖矩陣時使用頂點緩衝對象是否有意義?

現在我想看看使用VBOs來提高性能。根據Apple的OpenGL ES文檔,這是一個很好的步驟。然而,它沒有解決如何(或如果)VBO受到模型視圖矩陣更改的影響。實質上,我有多次渲染到場景的同一個對象,但每次都使用稍微不同的模型視圖矩陣。對象之間的主要區別(場景中的位置除外)是紋理映射。它們都具有略微不同的紋理座標。

維也納組織將在這種情況下提供幫助嗎?我應該爲每個單獨的對象分配一個單獨的VBO嗎?

更新1

到目前爲止,它看起來像維也納組織對我的業績產生負面影響。 FPS回落至20年代中期至高點。我分配了70個維也納國際組織:35個數據和35個索引。我可以將這個數據降低到35,並且可以將這個數據全局索引排列。我使用glBufferSubData()根據需要更新紋理座標。

另一個想法是打破所有的靜態數據併爲該VBO指定GL_STATIC_DRAW。

+0

您是否在iPhone 3G或iPod touch上完成了您的前後性能評估?我不希望在較舊的設備上將幀速率更改爲VBO,但在具有硬件VBO支持的GPU上,如果GPU尚未完成讀取,則緩衝區對象的部分更新可能會導致額外的工作或驅動程序中的同步。這裏強調「部分」 - 如果您完全替換數據(即使用glBufferData),驅動程序通常可以爲您處理雙緩衝。 – Pivot 2009-12-12 09:02:17

+0

評估是在iPhone 3G上完成的。 – 2009-12-12 18:35:02

+0

有趣。我建議比較鯊魚的兩個版本,看看時間差異在哪裏。 如果數據副本有問題,另一種更新緩衝區對象的方法是通過'OES_mapbuffer'擴展名將其映射到內存中,並直接生成數據。對於支持硬件VBO的GPU進行局部更新的相同注意事項也適用,因爲您可以映射緩衝區並只更改其中的一部分,但您可以通過調用glBufferData來指示您不關心舊內容在映射它之前的空指針。 – Pivot 2009-12-12 21:40:50

回答

1

它沒有解決如何(或者)維也納組織通過更改模型視圖矩陣

模型 - 視圖受到影響轉變發生在GPU上的每一個地方讓你平局通話時間。更改模型視圖不會導致VBO發生變異。

對象之間的主要區別(場景中的位置除外)是紋理映射。它們都具有略微不同的紋理座標。

聽起來像是你應該調整紋理矩陣,除了模型視圖矩陣,八九不離十是這樣的:

glMatrixMode(GL_TEXTURE); 
// glTranslate, glRotate, etc 
glMatrixMode(GL_MODELVIEW); 
// glTranslate, glRotate, etc 

利用維也納組織通常是一個好主意,但他們真的只與幫助第三代iPhone。他們對舊iPhone的幫助不大。

我應該爲每個單獨的對象分配一個單獨的VBO嗎?

減少應用程序中的VBO數量通常更有效。每次撥打電話glDrawArraysglDrawElements時,您可以提供唯一的偏移,而不是多次撥打glBindBuffer

相關問題