glDisable(GLU混合):对android设备没有性能影响

glDisable(GLU混合):对android设备没有性能影响,android,opengl-es-2.0,blending,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英特尔Atom/PowerVR G6430,OpenGL ES 2.0 让我感到困惑

同一组多边形的渲染时间基准测试:

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英特尔Atom/PowerVR G6430,OpenGL ES 2.0
让我感到困惑的是,在这些设备上进行基准测试并没有显示出显著的差异,这意味着,我假设禁用混合时的渲染与启用混合时的性能成本一样高:

  • 搭载ARM-A7/Qualcomm Adreno 305的三星Galaxy标签
  • 配备ARM-A57/Adreno 430的索尼Xperia Z3+
为什么呢?应该有区别,对吧?使用的片段着色器非常简单:

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的情况下,在每次加法之前都有一个分支。因此,例如,当选择glDisable(GL_混合)时,驱动程序可能会设置func和eq参数,使其在实际未禁用时表现为禁用。这取决于供应商试图优化的内容。“最坏的情况”通常是最好的优化,但通常情况下也是好的。优化一些不寻常且性能要求较低的东西很少值得付出努力


记录在案,我已经在平台上使用启用纹理渲染比禁用纹理渲染快30-50%,将1x1白色像素纹理与原始颜色混合。起初这是mindfuck,但当我想到它时,该平台已经连续优化渲染光栅地图近十年了。

你是如何衡量它的?我不是图形、GPU等方面的专家,但如果你转向“禁用混合渲染与启用混合渲染的性能代价一样高”“启用混合渲染的性能成本并不比禁用混合渲染的性能成本高”,这比(a)听起来更好(这是一个优点,不是一个问题),并且(b)对我来说建议[在那些设备上]有硬件可以“进行混合”“作为渲染的一个正常部分,使用它实际上是免费的。可能在这两种情况下,您都会看到60 fps,这是驱动程序/硬件限制。这意味着您加载gpu的力度不够大,无法看到性能上的差异。尝试渲染许多(数千?)图像以查看差异。