glDrawArrays:什么时候结束?

时间:2011-05-01 11:37:32

标签: opengl memory-management vertex-array

伪代码:

void draw()
{
    Vertex* vertices = scene.GetVertexArray();
    glEnableClientState(...);
    glVertexPointer(..., vertices);
    glDrawArrays(...);
    glDisableClientState(...);
    delete vertices;
}

我不使用VBO,因为我想支持较旧的OpenGL实现。

在调用glDrawArrays之后,我想:

  • deallocate 我的顶点数组(“delete vertices;”)
  • 或许修改一些顶点

但是,GL可以自由地异步执行glDrawArrays,并且在完成之前释放或修改我的数组是不安全的。

我可以做一个glFinish来确保,但它会减慢应用程序。

那么在什么时候我可以自由地释放/修改我的顶点数组?

1 个答案:

答案 0 :(得分:6)

OpenGL保证,一旦实际访问某些内存的任何函数返回,您就可以更改或取消分配它的内容。这些功能是:

  • glDrawArrays(返回后,内存gl {Normal,Color,TexCoord,Attrib,Vertex}指针设置为可以处理)
  • glDrawElements(返回后,内存gl {Normal,Color,TexCoord,Attrib,Vertex}指针设置为,可以处理元素数组)
  • glTexImage(内存数据指向)
  • glTexSubImage(内存数据指向)
  • glBufferData(内存数据指向)
  • glBufferSubData(内存数据指向)

重要的是要知道gl {Normal,Color,TexCoord,Attrib,Vertex}指针只是设置指针而不创建副本。但是,glDrawElements和glDrawArrays调用会产生一系列数据的副本(取决于驱动程序,不会立即生成物理副本,而是针对写入时复制方案调整内存管理 - 以防缓冲区未被修改)或者由用户程序解除分配,这可以节省关键的带宽和CPU周期。)