OpenGL ES – DrawCalls计数 – 瓶颈?

我是OpenGL ES的新手(到目前为止,我主要使用DX11)。 现在我的场景,我有大约100个来电。 我可以使用实例化,但只有大约一半的对象可以实例化,所以绘制调用次数大约为50 – 60帧。 每个对象是最大的。 700个三角形(我使用低聚模型)

什么是某种限制每个场景drawcalls(针对性能设备的iPhone 4)? 到目前为止,我通过Windows上的ATI GLES运行我的代码,但是我的CPU和GPU有很多function。

还是有办法,如何find我的应用程序的瓶颈? 我知道gDebugger是用于OpenGL的,但是ES版本的performance有时很奇怪(在我的代码中没有很多警告,所以我怀疑它们来自ATI层代码)。

自己画电话并不总是瓶颈,这是他们之间发生的事情。 通常,当您发出绘图调用时,会评估命令缓冲区(状态更改,数据上载等),并且改变许多状态的开销实际上被推迟到此时。 例如,如果您连续发出相同的平局呼叫,那么第二轮平局会显着降低成本,因为没有状态变化。 正因为如此,很难明确地说“保持你的平局数低于X”。

这个故事在Direct3D中传统上是不同的,在这之前的Windows Vista绘图调用将用户模式调用到内核模式上下文切换。 在D3D有一个用户模式的前端(Windows Vista +)之前,除了延迟状态设置的开销之外,每个绘图调用都会导致昂贵的上下文切换。 当人们优化以最大限度地减less平局,这可能是为什么。

最大限度地减less状态变化,这通常也会减less绘制调用的副作用。 您将需要开发一个批处理器,对几何进行sorting,以最大限度地减less状态变化 – 通常纹理是最重要的状态变化,以最小化。

如果在gDEBugger中看到很多错误,则可能需要在OpenGLdebugging环境中运行Windows软件并启用debugging输出。 这是一个OpenGL 4.x时代的function,但是如果你的驱动程序支持OpenGL ES扩展,它几乎肯定也有ARB_debug_output。 debugging输出会在您使用未alignment的数据结构时提醒您,这对于性能testing非常有用。 看到这个答案的更多细节。

对于ES,我不认为“700三角形”是“低聚”。 试着看看你是否可以让你的poly计数更低。 然后让聚数低于那个。 我的意思是真的把它弄坏了

无论如何,你需要运行一些实验。 我也一直在testing这个,但还没有。 在某一点上, 像素着色器可能会限制你的帧速率。 移动设备没有很高的填充率,如果你使用alpha混合或试图使用bloom效果,那将是你的限制。 即使在iPad 4上,我也无法使用bloom,仅仅是因为它太多地降低了帧速率(即使只有相对较小的几何体)。

所以无论如何,在一个实际的设备上运行分析器。 实例化你的模型,并确保你在发布模式下编译并观察Xcode中的帧速率。 你会通过testingfind限制。