glDeleteBuffers slower than glBufferData

glDeleteBuffers slower than glBufferData

本文关键字:glBufferData than slower glDeleteBuffers      更新时间:2023-10-16

我的iOS/Android游戏中遇到了一些性能问题,每隔一段时间必须更新几个VBO。分析完我的游戏后,事实证明glDeleteBuffers() 每次 VBO 更新最多需要 7 毫秒。当帧通常只需要 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);
}

其中偏移量是一个实例变量,基本上是新 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