我的 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);
}
其中offset是一个实例变量,基本上是新VBO的大小,它是可变的。我想,vboID 不言自明;)
glGenBuffers
and glDeleteBuffers
分别设计为仅在初始化和清理时运行。在运行时调用它们是不好的。
glBufferData
用一组新数据替换当前缓冲区数据,这会自动更改缓冲区的大小。您可以安全地删除整个glGenBuffers
/glDeleteBuffers
并将其移至初始化和清理中。
此外,您正在将缓冲区创建为静态缓冲区。这告诉 OpenGL 您几乎永远不会更改它,因此它以一种在 GPU 上访问速度更快但从系统其他部分访问速度较慢的方式存储它。尝试改变GL_STATIC_DRAW
to GL_DYNAMIC_DRAW
or GL_STREAM_DRAW
。更多相关内容请点击这里:http://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_Usage
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)