我的iOS/Android游戏存在性能问题,该游戏中的VBO必须不时更新。对游戏进行性能分析后,发现每次VBO更新glDeleteBuffers()最多需要7毫秒。当帧通常仅花费4 ms进行渲染时,这当然会导致打ic。

这是我更新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可以说明一切;)

最佳答案

glGenBuffersglDeleteBuffers分别设计为仅在初始化和清除时运行。在运行时调用它们是不好的。
glBufferData用新的数据集替换当前的缓冲区数据,这将自动更改缓冲区的大小。您可以安全地删除整个glGenBuffers/glDeleteBuffers并将其移至初始化和清理中。

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

关于c++ - glDeleteBuffers比glBufferData慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10768929/

10-09 05:36