我正在开发一个以OpenGL作为基础渲染器的渲染引擎。 渲染器在开始时以150 fps开始,在30秒左右后,fps增加到500。 我已经分别定时引擎的每个部分,唯一增加速度的部分是drawMesh函数,它绑定[静态] VBO并调用glDrawArrays。
我还评论了glPush和glGet函数的行为与结果相同。
每次运行引擎时都会发生这种情况,即使相机未移动并仍然呈现完全相同的场景。
有没有人知道如何发生这种情况?
答案 0 :(得分:1)
问题
问题产生于VBO在创建后被映射到缓冲区。模型类只执行一次更新其边界;如果粒子用所需数据更新缓冲区。
因为看起来视频卡(或至少在我的情况下有 Geforce GTS 450 )在取消映射VBO后不会直接将数据复制回到视频卡中,特别是在使用时用于映射缓冲区的GL_READ_WRITE_ARB标志。在将数据复制回VRAM之前,它会将数据保存在外部RAM中几秒钟。
解决方案
通过使用GL_READ_ONLY_ARB标志映射应该只读取数据的数据,缓冲区将几乎直接复制回VRAM。但是在我的情况下,一旦为此目的创建VBO,在网格对话期间计算边界并且根本不访问数据会更有效。
答案 1 :(得分:0)