Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么更快/更好?_Android_Opengl Es - Fatal编程技术网

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); 或 基本上,在清除之前切换到剪切测试区更好还是禁用

我有点进退两难

我正在使用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);


基本上,在清除之前切换到剪切测试区更好还是禁用/启用更好?

这是
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);