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
C++ Glgenvertexarray的速度非常慢_C++_Opengl_Vao - Fatal编程技术网

C++ Glgenvertexarray的速度非常慢

C++ Glgenvertexarray的速度非常慢,c++,opengl,vao,C++,Opengl,Vao,我目前正在用opengl编写一个游戏,在运行时必须创建顶点数组 问题是,每次程序调用“glgenvertexarray”,而不是在初始化时,调用都会使其冻结(10到100毫秒) 为了解决这个问题,我让游戏在初始化时创建空的VAO,并在初始化后填充它们,但是现在当这些空的VAO第一次绑定时,同样的奇怪冻结发生了 这是在游戏中创建VAO的错误方法吗 或者,这个问题仅仅出现在我的机器上(ndivia geforce940mx) 我在循环中使用的创建vao的简单代码(称为~1次/帧): “这是在游戏中创

我目前正在用opengl编写一个游戏,在运行时必须创建顶点数组

问题是,每次程序调用“glgenvertexarray”,而不是在初始化时,调用都会使其冻结(10到100毫秒)

为了解决这个问题,我让游戏在初始化时创建空的VAO,并在初始化后填充它们,但是现在当这些空的VAO第一次绑定时,同样的奇怪冻结发生了

这是在游戏中创建VAO的错误方法吗

或者,这个问题仅仅出现在我的机器上(ndivia geforce940mx)

我在循环中使用的创建vao的简单代码(称为~1次/帧):


“这是在游戏中创建VAO的错误方法吗?”我们可以看看您的代码吗?您在CPU上看到GL命令的延迟并不意味着该GL命令实际上触发了延迟。GPU工作异步,英伟达驱动程序在独立的线程上在CPU上异步工作。更有可能是GL代码的其余部分触发了某种同步。“必须在运行时创建顶点数组”--我打赌它们都具有相同的格式(属性集、实例等)。如果是这样,那么每个格式应该只有一个VAO,并交换缓冲区或缓冲区中的数据,可能会将所有这些网格打包到一个缓冲区中。在更新/渲染循环中很少有好的理由创建VAO
printf
可能比您的示例中的任何其他内容都要花费更长的时间,并且由于缺乏真实的示例,您在这里找到的任何答案或评论都只是猜测。我没有说清楚。我正在创建一个Minecraft克隆,并在第二个线程中管理地形生成和网格创建。然而,我必须创建vao并在主线程中填充VBO,这似乎不需要太长时间,因为最大的部分是在另一个线程中完成的。问题是:它确实需要很长时间,因为glgenvertexarray需要十分之一毫秒。因此,我通过在一帧中创建多个网格(它只是冻结一次10ms而不是10次10ms)部分解决了这个问题,因为奇怪的是,只有第一次调用需要时间,其他调用奇怪的是瞬间
float cl = Timer::clock();

int vao_id;
glGenVertexArrays(1, &vao_id);

cl = Timer::clock()-cl;
printf("%f\n", cl);
// this weirdly gives 10 - 100 ms