glDeleteBuffers slower than glBufferData
glDeleteBuffers slower than glBufferData
我的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不言自明,我想;)
glGenBuffers
和glDeleteBuffers
分别设计为仅在初始化和清理时运行。在运行时调用它们是不好的。
glBufferData
将当前缓冲区数据替换为一组新数据,这会自动更改缓冲区的大小。您可以安全地删除整个glGenBuffers
/glDeleteBuffers
的东西,并将其移动到初始化和清理中。
此外,您正在创建缓冲区作为静态缓冲区。这告诉OpenGL,你几乎永远不会改变它,所以它以一种在GPU上访问更快但从系统其余部分访问更慢的方式存储它。尝试将GL_STATIC_DRAW
更改为 GL_DYNAMIC_DRAW
或 GL_STREAM_DRAW
。更多关于这方面的信息:http://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_Usage
相关文章:
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- D-lang being faster than C++?
- MATLAB faster than LAPACK?
- "How to use long long data-type rather than pointers data-type to modify other variables ?"
- 如何实现随机访问迭代器的"less than operator"?
- 如何在 C++ 类中重载 'less than' 运算符以比较常量?
- 为什么我收到错误:"there is more than one default constructor"?
- std::tuple faster than std::array?
- 有没有办法通过'greater/lesser than'而不是"="来定义'int'?
- glBufferData 失败,并显示: "Array object is not active."
- 确实调用glbufferdata创建/发布缓冲区
- "compares less than 0"是什么意思?
- 在OpenGL中使用glbufferdata
- OpenSSL 错误"data greater than mod len"
- 特征:如何将"greater than"的结果(在ArrayXf上)转换为特征向量
- Is calloc better than malloc?
- "less than" 与GCC 4与6的ifstream比较
- 在 C 族中,在一个循环中,为什么"less than or equal to"比"less than"符号更受欢迎?
- Is ++(a = b); faster than a = b + 1;?
- glDeleteBuffers slower than glBufferData