伪代码:
void draw()
{
Vertex* vertices = scene.GetVertexArray();
glEnableClientState(...);
glVertexPointer(..., vertices);
glDrawArrays(...);
glDisableClientState(...);
delete vertices;
}
我不使用VBO,因为我想支持旧的OpenGL实现。
调用glDrawArrays后,我想:
- 取消分配我的顶点数组("
delete vertices;
"( - 可能修改一些顶点
然而,GL可以自由地异步执行glDrawArrays,并且在数组完成之前解除分配或修改数组是不安全的。
我可以做一个glFinish来确保这一点,但它会减慢应用程序的速度。
那么,在什么时候我可以自由地解除分配/修改我的顶点数组呢?
- 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周期(。