glDeleteBuffers比glBufferData慢

时间:2012-05-26 18:55:06

标签: c++ opengl-es

我的iOS / Android游戏中存在一些性能问题,其中几个VBO必须每隔一段时间更新一次。在对我的游戏进行概要分析后,结果表明glDeleteBuffers()每次VBO更新最多需要7ms。当帧通常仅需要4毫秒来渲染时,这当然会导致打嗝。

这是我更新VBO的部分:

Chunk* chunk;
pthread_join(constructionThread, (void**)&chunk);
building = false;

if (vboID)
{
    //takes 7 milliseconds
    glDeleteBuffers(1, &vboID); 
    vboID = 0;
}
if (offset)
{
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);

    //takes about 1-2 milliseconds, which is acceptable
    glBufferData(GL_ARRAY_BUFFER, offset * 4, constructionBuffer, GL_STATIC_DRAW);
}

其中offset是一个实例变量,基本上是新VBO的大小,它是非常可变的。 vboID说不出话来,我猜;)

1 个答案:

答案 0 :(得分:6)

glGenBuffersglDeleteBuffers分别设计为仅在初始化和清理时运行。在运行时调用它们很糟糕。

glBufferData用一组新数据替换当前缓冲区数据,这会自动更改缓冲区的大小。您可以安全地删除整个glGenBuffers / glDeleteBuffers并将其移至初始化和清理。

此外,您将缓冲区创建为静态缓冲区。这告诉OpenGL你几乎永远不会改变它,所以它以一种在GPU上访问速度更快的方式存储它,但从系统的其他部分访问速度较慢。尝试将GL_STATIC_DRAW更改为GL_DYNAMIC_DRAWGL_STREAM_DRAW。更多相关信息:http://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_Usage