2011-06-12 227 views
5

我不能完全理解爲什麼這個代碼對於iOS上的GPU速度很慢,這段代碼在Windows上工作良好,沒有任何問題。在iOS上glBufferSubData表現糟糕?

基本上我正在做的是我有一個大的動態頂點緩衝區(GL_STREAM_DRAW),我嘗試只更新它的一部分,在一個單一的框架不應該重疊的部分,所以他們不應該導致沖刷和CPU不應該等待GPU完成,但顯然並非如此,即使在繪製10至20個三角形的時候,我也能在iPhone 4上獲得大約10 fps的速度......但是,我得到了超過400 FPS的速度我的電腦有相同的代碼...

正如你可以看到在跟蹤中,我重複使用相同的緩衝區,但我確保更新的部分不重疊...我該怎麼做提高表演?

 
Index Trace 
695 glBindBuffer(GL_ARRAY_BUFFER, 1u) 
696 glBufferSubData(GL_ARRAY_BUFFER, 144l, 144l, 0x0453d090) 
697 glBlendFunc(GL_SRC_ALPHA, GL_ZERO) 
698 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
699 glActiveTexture(GL_TEXTURE0) 
700 glBindTexture(GL_TEXTURE_2D, 12u) 
701 glUseProgram(12ul) 
702 glUniform4fv(uniform_000000001cd24950_12_0, 1, {0.0500000f, 0.0000000f, 0.0000000f, 0.0000000f}) 
703 glUniform4fv(uniform_000000001cd24950_12_1, 1, {0.0000000f, 0.0333333f, 0.0000000f, 0.0000000f}) 
704 glUniform4fv(uniform_000000001cd24950_12_2, 1, {0.0000000f, 0.0000000f, -0.0010010f, 0.0000000f}) 
705 glUniform4fv(uniform_000000001cd24950_12_3, 1, {-0.0000000f, 0.6333333f, -0.0010010f, 1.0000000f}) 
706 glDrawArrays(GL_TRIANGLES, 6, 6) 
707 glBindBuffer(GL_ARRAY_BUFFER, 1u) 
708 glBufferSubData(GL_ARRAY_BUFFER, 288l, 144l, 0x0453d120) 
+0

如果您是新手,請不要忘記提供有關accpet和up-vote功能的信息。 – 2011-06-26 23:49:07

回答

5

我猜iOS的司機只是不夠聰明,看到更新的範圍(以glBufferSubData)不與當前處理的那些重疊。我甚至不確定您的PC驅動程序是否足夠聰明(可能是您的PC的整體性能隱藏)。這取決於驅動程序如何進行同步,以及它是如何優化的。

解決此問題的一個解決方案可能是ARB_map_buffer_range擴展,它可以給驅動程序提供明確的提示。但我不確定這是否在ES中受支持。否則,你不會將你的緩衝區分成多個小的緩衝區。

+1

是的,這是我最終想到的......很遺憾,OpenGL如何處理OpenGL中的頂點緩衝區一直是一件痛苦的事情,OpenGL如何不能像DirectX那樣好用。我發現在iPhone上工作的解決方案是恢復爲純頂點數組(無VBO),以滿足我的動態頂點緩衝區需求。 – 2011-06-14 23:29:38