Android 什么更快/更好?
我有点进退两难 我正在使用Android(与此无关),我在一些手机上注意到一件事,而在其他手机上没有注意到:剪刀阻止呼叫Android 什么更快/更好?,android,opengl-es,Android,Opengl Es,我有点进退两难 我正在使用Android(与此无关),我在一些手机上注意到一件事,而在其他手机上没有注意到:剪刀阻止呼叫glClear(GL\u COLOR\u BUFFER\u BIT)正常工作 因此,我想知道这样做是否更好: gl.glDisable(GL10.GL_SCISSOR_TEST); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glEnable(GL10.GL_SCISSOR_TEST); 或 基本上,在清除之前切换到剪切测试区更好还是禁用
glClear(GL\u COLOR\u BUFFER\u BIT)
正常工作
因此,我想知道这样做是否更好:
gl.glDisable(GL10.GL_SCISSOR_TEST);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glEnable(GL10.GL_SCISSOR_TEST);
或
基本上,在清除之前切换到剪切测试区更好还是禁用/启用更好?这是
glScissors
的规范,因为glClear
在OpenGL中被视为绘图命令。因此,你看到的行为是完全正常的(D3D的工作原理类似),但在其他手机上,有趣的是,它似乎为你工作的马车
关于选择哪种解决方案,我不知道,两者都是有效的。我想说,这是品味的问题。我更喜欢第一个,因为它更容易弄清楚发生了什么
现在,如果在OpenGL实现中,第二个解决方案比第一个快,我会选择第二个。基准
在glHood下:
让我分享一下我对桌面GPU的了解,并做一些推测(不要太认真!)。一个glClear
命令实际上会导致绘制一个全屏四元组,因为绘制三角形是GPU上的“快速路径”。这可能比DMA或固定硬件更有效,因为它是并行的(所有着色器核心清除屏幕、颜色、z和模具的部分),如果这样做,可以避免固定硬件的成本
关于glScissor
,我听说它是通过模具缓冲实现的(与通常的OpenGL模具缓冲机制相同),因此只有落入剪切区的碎片才能参与深度dest、碎片着色、混合等(这与glClear
的原因相同,避免使用专用硬件)。它也可以在现代GPU上实现为片段丢弃+动态分支
现在你可以明白为什么它是这样工作的了。只有位于剪刀区内的全屏四边形的碎片才能“着色”颜色缓冲区并将其清除 值得注意的是,当glScissor被禁用(或覆盖整个缓冲区)时,您会得到一个更快的路径-驱动程序可以简单地使缓冲区无效,并写入一个颜色值来代替。这是对平铺渲染器的一个特别大的优化,就像大多数移动渲染器一样。
gl.glScissors(0,0,800,480);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);