伪代码:
void draw()
{
Vertex* vertices = scene.GetVertexArray();
glEnableClientState(...);
glVertexPointer(..., vertices);
glDrawArrays(...);
glDisableClientState(...);
delete vertices;
}
我没有使用 VBO,因为我想支持旧的 OpenGL 实现。
调用 glDrawArrays 后,我想:
delete vertices;
") 然而,GL 可以自由地异步执行 glDrawArrays,并且在它完成之前释放或修改我的数组是不安全的。
我可以做一个 glFinish 来确保这一点,但它会减慢应用程序的速度。
那么在什么时候我可以自由地释放/修改我的顶点数组?
最佳答案
OpenGL 向您保证,一旦任何实际访问某些内存的函数返回,您就可以更改或取消分配它的内容。这些功能是:
重要的是要知道 gl{Normal,Color,TexCoord,Attrib,Vertex}Pointer 只是设置一个指针而不是创建副本。然而,数据类型的副本是通过 glDrawElements 和 glDrawArrays 调用生成的(取决于驱动程序,不会立即生成物理副本,而是针对写时复制方案调整了内存管理——以防缓冲区没有被修改或由用户程序解除分配,这样可以节省关键的带宽和 CPU 周期)。
关于opengl - glDrawArrays : when has it finished?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5848116/