glBufferSubData在iOS上表现糟糕吗?

时间:2011-06-12 20:19:26

标签: ios performance opengl-es gpu vbo

我无法理解为什么这段代码在iOS上的GPU速度慢,这段代码在Windows上运行良好而没有任何问题。

基本上我正在做的是我有一个大的动态顶点缓冲区(GL_STREAM_DRAW),我尝试只更新它的一部分,单个帧中的部分不应该重叠,因此它们不应该导致刷新和CPU不应该等待GPU完成,但显然不是这样的情况我在iPhone 4上得到的速度大约是10 fps,即使只绘制了10到20个三角形...而我的速度超过400 FPS具有相同代码的PC ......

正如您在跟踪中看到的那样,我正在重复使用相同的缓冲区,但我确保更新的部分不会重叠...我该怎么做才能提高性能?

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)

1 个答案:

答案 0 :(得分:5)

我猜iOS驱动程序不够聪明,看到更新的范围(glBufferSubData)与当前处理的范围不重叠。我甚至不确定你的PC驱动程序是否足够智能(可能是你的PC的整体性能隐藏了)。它取决于驱动程序如何同步以及是否优化它。

处理此问题的一个解决方案可能是ARB_map_buffer_range扩展,它可以为驱动程序提供明确的提示。但我不确定ES是否支持这一点。否则你就不会把你的缓冲区分成多个小缓冲区。