Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么常量int数组比普通数组慢这么多?_Performance_Opengl_Constants_Glsl - Fatal编程技术网

Performance 为什么常量int数组比普通数组慢这么多?

Performance 为什么常量int数组比普通数组慢这么多?,performance,opengl,constants,glsl,Performance,Opengl,Constants,Glsl,我有一个用glsl编写的OpenGL着色器。我在标题顶部有一个全局定义的数组,如下所示: const int permutations[256] = int[256]( 64 , 34 , 36 , 137 , 120 , 122 , 246 , 46 , 79 , 10 , 37 , 181, ... ); 当我启动程序时,速度非常慢,这意味着当使用着色器显示一个简单的茶壶时,我每秒只有1帧 然而,一旦我从上面的声明中删除“const”,一切都会正常工作,

我有一个用glsl编写的OpenGL着色器。我在标题顶部有一个全局定义的数组,如下所示:

const int permutations[256] = int[256](
    64 ,  34 ,  36 , 137 , 120 , 122 , 246 ,  46 ,  79 ,  10 ,  37 , 181,
    ...
    );
当我启动程序时,速度非常慢,这意味着当使用着色器显示一个简单的茶壶时,我每秒只有1帧

然而,一旦我从上面的声明中删除“const”,一切都会正常工作,我又回到了交互式帧速率

所以,“问题”实际上已经解决了。。。但我想知道,为什么会这样?根据我的经验,使用常量通常会使程序更快,这是非常违反直觉的


更新 实际上,我尝试先使用统一的数组,而不是const int数组,在其他地方使用完全相同的代码。但是,在这种情况下,编译着色器会因以下情况而崩溃:

Internal error: assembly compile error for fragment shader at offset
34609:
-- error message -- line 651, column 22:  error: invalid local parameter number

真奇怪。很可能你有司机问题。我已经在windows下的Nvidia 540M上运行了包含着色器的代码,并让它循环运行。在那个循环中,我调用了着色器程序一次,并测量了时间(我还使用变换反馈检查了着色器是否正常工作)。大多数循环在2-3毫秒内结束,一些峰值为25毫秒。然而,移除
const
标识符对性能没有影响。这些都是很小的测量值,但从您的描述来看,
const
的性能影响应该可以在这里观察到

#version 150
const int permutations[256] = int[256](
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
...
246, 247, 248, 249, 250, 251, 252, 253, 254, 255
);

flat out int num1[32];

void main(){
    for(int i = 0; i < 32; i++){
        num1[i] = (permutations[2*i]+permutations[2*i+1])*(permutations[2*i+2]+permutations[2*i+3]);
    }
}
#版本150
常量int置换[256]=int[256](
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
...
246, 247, 248, 249, 250, 251, 252, 253, 254, 255
);
平展整数m1[32];
void main(){
对于(int i=0;i<32;i++){
num1[i]=(置换[2*i]+置换[2*i+1])*(置换[2*i+2]+置换[2*i+3]);
}
}

如果您不介意的话,我可以尝试在我的硬件上运行您的程序,但它必须为windows编译,并且请包含所有动态库。

我想知道的是,您到底为什么要在着色器源中放入这么长的数组。这听起来像是阵列统一的工作。@DatenWalf:这是有争议的。如果它是const,那么它就是const,将其放入外部缓冲区没有意义(如果性能更好,GL应该在内部将其作为统一数组处理)。简:您的问题可能是IHV和特定于驾驶员的。您在不同的硬件(最好是不同的供应商)上试用过吗?听起来有点像驱动程序切换到软件仿真,因为const int数组不能那么大。只是一个猜测,但是1fps真的很慢。也许当它不是常量时,它会使用类似于统一数组的东西,如果它是常量,它会尝试将它放入一些本地寄存器中,在这些寄存器中,它就是不合适的。请参阅有关我为什么不使用统一数组的更新。。。事实上,司机似乎真的有点车。我在linux上使用的nvidia卡带有官方驱动程序,但我无法在另一张(英特尔)卡上测试,因为缺少一些扩展。如果阵列统一速度慢或无法使用,请尝试1D纹理(将值缩放到[0..1],然后再传递给着色器)。这可能毕竟是驱动程序问题。不管怎样,我现在已经完成了这个项目,它已经不再重要了。我只是想知道为什么会发生这样的事情。但是谢谢你的帮助!