繁体   English   中英

glDrawElements在iOS上大量使用cpu

[英]glDrawElements massive cpu usage on iOS

硬件:iPad2软件:OpenGL ES 2.0 C ++

glDrawElements似乎占用了大约25%的cpu。 使CPU 18ms和GPU每帧10ms。

当我不使用索引缓冲区并使用glDrawArrays时,它会加速并且glDrawArrays大麦会显示在探查器上。 其他一切都是一样的,glDrawArrays有更多的顶点因为我必须在没有索引缓冲区的情况下复制VBO中的顶点。

至今:

  • 这两种方法之间的状态变化几乎相同
  • 顶点结构是两个浮点数(8个字节)。
  • indexbuffer是16bit(尝试32位)
  • 两个缓冲区的GL_SATIC_DRAW
  • 缓冲区在加载后不会改变
  • 相同的VBO和indexbuffer每帧渲染多次,具有不同的偏移和大小
  • 没有opengl错误

所以看起来它正在做某种类型的软件回退。 但我无法弄清楚会导致OpenGL回退的原因。

有一些事情会立即浮现在脑海中,这可能会影响您描述的速度。

例如,许多命令被动地发出以减少总线传输的数量。 它们排队等待下一批转移。 状态更改,纹理更改和类似命令都会累积。 绘制命令可能在一种情况下触发更大的转移而在另一种情况下不触发,或者您在一种情况下触发更频繁的转移。 另一方面,您的特定模型可能会更好地组织一个或另一个绘制调用。 您需要查看它们的大小,是否重用索引值,以及它们是否经过优化或重新排序以进行渲染。 glDrawArrays可能需要传输更多数据,但如果您的模型很小,则开销可能不会太大。 绘制频率变得很重要,因为你想经常排队,以保持卡忙,让你的CPU做其他工作,你不希望它只是累积在等待发送的命令缓冲区,但它需要平衡,因为这些转移需要付出代价。 最重要的是,经常索引的值可以在频繁重用时从缓存效果中受益,但线性访问的数组在线性访问时可以从缓存效果中受益,因此您需要知道您的数据,因为不同类型的数据受益于不同的方法。

甚至Apple似乎也不确定使用哪种方法。

直到iOS7,该版本和之前的IOS OpenGL ES编程指南写道:

为了获得最佳性能,您的模型应使用glDrawArrays作为单个无索引三角形条提交,并尽可能少复制顶点。 如果模型需要复制许多顶点(...),则可以使用单独的索引缓冲区并调用glDrawElements来获得更好的性能。 ...为获得最佳效果,请使用索引和未编制索引的三角形条测试模型,并使用速度最快的三角形条。

但他们更新的适用于iOS8的OpenGL ES编程指南提供了相反的结果:

为获得最佳性能,您的模型应作为单个索引三角形条提交。 要避免在顶点缓冲区中多次指定同一顶点的数据,请使用单独的索引缓冲区并使用glDrawElements函数绘制三角形条带

看起来在你的情况下你刚刚尝试了两种方法,并发现一种方法更适合你的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM