使用以下内容对同一组多边形的渲染时间进行基准测试:
A) glEnable( GL_BLEND );
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );
B) glDisable( GL_BLEND );
glBlendFunc( GL_ONE, GL_ZERO );
表示启用混合的渲染在:
上确实稍慢令我困惑的是,在这些设备上进行基准测试显示没有显着差异,这意味着,我认为,禁用混合的渲染与启用混合的性能成本相同:
为什么?应该有所不同,对吗?正在使用的片段着色器非常简单:
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)
即使不了解您提到的平台,我也可以根据自己的经验说,少即是多。有时代码或hw中的分支比进行冗余操作要慢。想象一下在每次添加之前的一个分支,以防一个操作数为0.因此,例如当选择glDisable(GL_BLEND)时,驱动程序可能会设置func和eq参数,以便它禁用BEHAVES AS,而实际上并非如此。这取决于供应商试图优化的内容。 “最坏情况”通常是最佳优化,但常见情况往往也很好。优化不寻常的东西和降低性能要求很少值得付出努力。
对于记录,我在平台渲染时启用纹理比禁用快30-50%,将1x1白色像素纹理与原始颜色混合。起初这是精神错误,但是当我想到它时,平台已经不断优化,用于渲染栅格地图近十年。