2017-10-04 97 views
1

标杆呈现相同的多边形集合随着时间的:glDisable(GL_BLEND):在Android设备上没有性能影响

A) glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

B) glDisable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_ZERO); 

表明,随着混合渲染被启用确实是在稍微慢一点:

  • 桌面时,OpenGL 2.0
  • 联想P90Pro的Intel Atom/PowerVR的G6430,OpenGL ES 2.0的

和我的困惑,标杆这些设备上显示没有显著差异,这意味着,我认为,与混合禁用渲染是被启用的性能,成本与混合:

  • 三星Galaxy与ARM-A7标签/高通的Adreno 305板载
  • 索尼XPERIA Z3 +与ARM-A57/430的Adreno

这是为什么?这应该是一个区别,对吧?使用片段着色器是非常简单的:

precision highp float; 
uniform sampler2D tex; 
varying vec4 v_fragmentColor; 
varying vec2 v_texCoord; 

void main() { 
    gl_FragColor = v_fragmentColor * texture2D(tex, v_texCoord); 
} 

很抱歉,如果情况定义太普通了,这是相当难以产生适合于融入SO问题最小工作样本。我希望在这里有一些我知道的遗漏。

ps:在每个测试设备上,生成的图像看起来与预期的一样,透明区域的混合被启用,不透明的黑色 - 如果禁用。整个问题只是关于表现。

+0

你是如何测量它的? –

+0

我不是图形,GPU等方面的专家,但是如果您将“_rendering with blending disabled”设置为“性能成本高于混合正在启用_”,则“_rendering与启用的混合是**不再具有**性能 - (比**(a)**更好)(这是一个加号,而不是问题),**(b)**对我来说表明[在这些设备上]有硬件可用于“做混合“作为渲染的正常部分,因此使用它是有效的。 – TripeHound

+0

也许在这两种情况下,你会看到60 fps,这是驱动程序/硬件限制。这意味着你不会加载你的GPU足够难以看到性能的差异。尝试渲染许多(数千?)图像以查看差异。 – Dave

回答

0

即使没有你提到的平台的知识,我可以通过自己的经验说,少一些并不总是更多。有时在代码或hw中分支比进行冗余操作要慢。想象一下,如果一个操作数为0,则在每次添加之前设置一个分支。因此,例如,当选择glDisable(GL_BLEND)时,驱动程序可能会设置func和eq参数,以便它在禁用时保持不变。这取决于供应商试图优化的内容。 “最糟糕的情况”往往是最好的优化,但常见的情况往往也是好的。优化某些不寻常的和较少的性能要求很少值得付出努力。

为了记录,我一直在平台渲染速度比禁用时快30-50%,将1x1白色像素纹理与原始颜色混合。这是最初的mindfuck,但当我想到这个平台已经不断优化为渲染栅格地图近十年。