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