我正在研究一款受《我的世界》启发的图形引擎,即将在实际游戏中实现.在几何压力测试下,我的引擎达到了60 FPS.我仅将LWJGL用于图形帮助.有一次,更新本地内存上的VBO数据有很大的延迟,但是我通过多线程,精简和同步通用块剔除器/构造器解决了这一问题.
在剔除后将VBO数据缓冲到视频存储器的过程中,我偶尔会遇到小障碍(20-30毫秒),这可能会导致屏幕冻结一段时间.我认为发生延迟的原因是因为每隔两帧我就通过glBufferData(以静态绘制模式)将大量几何数据发送到VBO(3-5mb).我已经实现了块状视锥剔除,块状视锥剔除,空气阻挡剔除和定向环境剔除.
这给我留下了两个问题:
>是否可以使用比glBufferData更快的另一种数据缓冲方法? (也许是一种将第二个缓冲区作为准备的多线程方法,它将把挂钩移动到第二个线程)?
>如果没有,我将如何使用指示多维数据集角的浮点矩阵(易于操作)从本地内存(可能是视频内存)实现直接遮挡剔除?请注意,反门户与我的框架不兼容.
或者,用“普通”英语:如何在不进一步减小数据大小的情况下使用glBufferData加快将数据缓冲到vram的速度?
更新:将运行自定义遮挡剔除路线.我相当确定我的数据缓冲时间会大大增加添加被阻塞的块所花费的时间,并且甚至有可能由于同步更新而被延迟,因为剔除更新程序会锁定这些数据.如果有人对从缓冲区中剔除遮挡提出建议,那就太好了.
更新2:一旦添加了隐藏脸部剔除(两个接触的脸部=没有渲染),问题就被同时解决了.我现在不需要额外的性能提升,仅此一项就使我的缓冲区大小减小了90%,帧速率提高了400%.感谢您的回答RTS.
解决方法:
是的,有两种方法.
>使用glBufferSubData
>将缓冲区使用率设置为动态或流
>使用glMapBuffers
>使用较小的顶点图元(浮点型而不是双精度型,或者短型而不是int精度)
>确保数据对齐
>交织您的VBO,因此您只需要做一次缓冲区更新
>使用VAO(顶点数组对象)
>使用双重缓冲,以便在需要使用帧渲染时将数据提前上载到VBO,以避免资源冲突.
>使用连接的图元来避免重复的顶点(GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等)