3

伪代码:

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

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

调用 glDrawArrays 后,我想:

  • 释放我的顶点数组(“ delete vertices;”)
  • 也许修改一些顶点

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

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

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

4

1 回答 1

6

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

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

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

于 2011-05-01T11:49:20.687 回答