我检查了一些东西,我得到了关于C ++& amp;的性能的奇怪结果。 OpenGL& GLSL。
在第一个程序中,我使用片段着色器绘制了纹理像素,然后渲染纹理。
纹理的mag \ min为GL_NEAREST
。
在第二个程序中,我将片段着色器直接渲染到屏幕上。
为什么第二个程序更快?是不是更快地渲染纹理而不是重复相同的动作?
这就像拍摄AAA游戏的视频,然后在同一台计算机上显示,并通过视频获得更低的FPS。
片段着色器是:
uniform int mx,my;
void main(void) {
vec2 p=gl_FragCoord.xy;
p-=vec2(mx,my);
if (p.x<0.0)
p.x=-p.x;
if (p.y<0.0)
p.y=-p.y;
float dis=sqrt(p.x*p.x+p.y*p.y);
dis+=(abs(p.x)+abs(p.y))-(abs(p.x)-abs(p.y));
p.x/=dis;
p.y/=dis;
gl_FragColor=vec4(p.x,p.y,0.0,1.0);
}
答案 0 :(得分:4)
与性能问题一样,关于唯一真正确定的方法是使用分析器。
那就是说,我的猜测是,这主要是处理带宽与内存带宽的问题。要渲染纹理,处理器必须从内存的一部分读取数据,并将相同的数据写回内存的另一部分。
要从着色器直接渲染,处理器只需将输出写入内存,但不必从内存中读取数据。
因此,这是一个更快的问题:从内存中读取特定数据,或使用处理单元生成它?着色器中的数学运算非常简单(基本上是唯一复杂的部分是sqrt
) - 所以至少对于你的特定硬件,它似乎比计算结果要快一些。内存(至少让其他内存访问同时进行等)
请注意,两者(着色器与纹理)具有完全不同的特征。无论在创建它时涉及多么简单或复杂的计算,读取纹理的速度几乎都是恒定的。不是说明显的,但如果计算很简单,着色器将快速运行,但如果计算的计算变得复杂,则减速(可能很多)。在你提到的AAA游戏中,可以猜测至少有一些着色器使用了足够复杂的计算,它们几乎肯定会比纹理读取慢。在相反的极端,一个非常简单的着色器(例如,只是将片段颜色从输入传递到输出的那个)可能比从纹理读取要快得多。