glDisable(GL_BLEND):对Android设备没有性能影响

时间:2017-10-04 06:39:49

标签: android opengl-es-2.0 blending

使用以下内容对同一组多边形的渲染时间进行基准测试:

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

令我困惑的是,在这些设备上进行基准测试显示没有显着差异,这意味着,我认为,禁用混合的渲染与启用混合的性能成本相同:

  • 搭载ARM-A7 / Qualcomm Adreno 305的三星Galaxy Tab
  • Sony Xperia Z3 +与ARM-A57 / Adreno 430

为什么?应该有所不同,对吗?正在使用的片段着色器非常简单:

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:在每个经过测试的设备上,结果图像看起来与预期的一样,透明区域启用了混合,不透明黑色 - 如果禁用。整个问题仅仅是关于绩效。

1 个答案:

答案 0 :(得分:0)

即使不了解您提到的平台,我也可以根据自己的经验说,少即是多。有时代码或hw中的分支比进行冗余操作要慢。想象一下在每次添加之前的一个分支,以防一个操作数为0.因此,例如当选择glDisable(GL_BLEND)时,驱动程序可能会设置func和eq参数,以便它禁用BEHAVES AS,而实际上并非如此。这取决于供应商试图优化的内容。 “最坏情况”通常是最佳优化,但常见情况往往也很好。优化不寻常的东西和降低性能要求很少值得付出努力。

对于记录,我在平台渲染时启用纹理比禁用快30-50%,将1x1白色像素纹理与原始颜色混合。起初这是精神错误,但是当我想到它时,平台已经不断优化,用于渲染栅格地图近十年。