我应该在每次抽奖时删除顶点缓冲区对象吗?

时间:2013-11-20 23:51:39

标签: opengl haskell openglraw

我有一些Haskell / OpenGLRaw代码可以做这样的事情:

verticesPtr <- newArray ...
glVertexPointer 3 gl_DOUBLE 0 verticesPtr

buffersPtr <- malloc
glGenBuffers 1 buffersPtr
buffer <- peek buffersPtr

glBindBuffer gl_ARRAY_BUFFER buffer
glBufferData gl_ARRAY_BUFFER 4 verticesPtr gl_STREAM_DRAW

glDrawArrays gl_LINE_STRIP 0 4
glDeleteBuffers 1 buffersPtr

我对此代码有两个问题:

  1. 我是在draw回调中呼叫的。这是否完全否定了将顶点数据存储在服务器中的用处?
  2. 如果我将此代码放在draw之外,我应该将gl_STREAM_DRAW命令更改为更静态的内容吗?

1 个答案:

答案 0 :(得分:2)

  1. 是的,通过以这种方式使用它们,您正在抛弃缓冲区对象的大部分好处。很可能它仍然会比glBegin / glEnd更快,因为驱动程序会同时意识到所有数据,而不是增量,但不能保证它会更快,甚至可能是由于创建和销毁缓冲区对象的开销,缓冲区大小较慢。

  2. 是的,如glBufferData API docs中所述,您应该避免STREAM_DRAW,除非缓冲区每个或每个帧都在变化。我个人的经验法则是:

    • 偶尔更改一次 - &gt; STATIC
    • 经常更改,但不会经常更改 - &gt; DYNAMIC
    • 更改频率超过保持不变 - &gt; STREAM