2014-10-17 69 views
4
大量的CPU使用率

设备:iPad2的 Sofware:OpenGL ES 2.0的C++glDrawElements iOS上

glDrawElements似乎采取了CPU的约25%。使CPU 18ms和GPU每帧10ms。

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

到目前为止:

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

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

回答

2

有几件事立刻就想起来,可能会影响你描述的速度。

其中之一,许多命令被动地发出以减少总线传输的数量。他们排队等待下一批转移。状态变化,纹理变化以及类似的命令都累积起来。在一种情况下,绘图命令可能触发较大的传输,但在另一种情况下触发更频繁的传输,或者在另一种情况下触发更频繁的传输。另一方面,您的特定模型可能会更好地组织为其中一个或另一个绘制调用。你需要看看它们有多大,是否重用索引值,以及它们是否被优化或重新排序以供渲染。 glDrawArrays可能需要传输更多的数据,但是如果模型很小,开销可能不是什么大问题。绘制频率变得很重要,因为您想要频繁排队以保持卡片繁忙并让CPU执行其他工作,您不希望它只积累在等待发送的命令缓冲区中,但需要进行平衡这些转移有成本。并且,当索引值经常被重用时,频繁索引的值可以受益于缓存效果,但线性访问的阵列在线性访问时可以受益于缓存效果,因此您需要了解数据,因为不同类型的数据受益于不同的数据方法。

即使苹果似乎也不确定使用哪种方法。

直到iOS7的OpenGL ES Programming Guide for IOS该版本及更早写道:

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

但他们的更新OpenGL ES Programming Guide for iOS适用于iOS8上提供相反:

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

它看起来像你的情况,你刚才想都画三角形带,以及发现一种方法更适合您的数据。

+0

谢谢!我想我会用抽签的频率做一些测试。我也会用我的个人资料仔细检查苹果,看看有没有看到司机正在做的事。 – myro 2014-10-20 12:55:05