我在我的 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 不言自明,我猜 ;)