我正在开发一个受我的世界启发的图形引擎,很快就会在实际游戏中实现。在几何压力测试下,我的引擎速度高达 60+ FPS。我只使用 LWJGL 来提供图形辅助。在某一时刻,我在更新本地内存上的 VBO 数据时遇到了很大的延迟,但我通过多线程、流线化和同步通用块剔除器/构造器解决了这个问题。
在剔除后将 VBO 数据缓冲到视频内存的过程中,我偶尔会遇到一个小故障(20-30 毫秒),这可能会导致屏幕在这段时间内冻结。我认为延迟发生的原因是因为我每隔几帧通过 glBufferData(在静态绘制模式下)向 VBO(3-5mb)发送大量几何数据。我已经实现了块截锥体剔除、块截锥体剔除、空气块剔除和定向环境剔除器。
这给我留下了两个问题:
我可以使用另一种比 glBufferData 快的数据缓冲方法吗?(也许是一种将第二个缓冲区多线程作为准备的方法,这会将障碍转移到第二个线程)?
如果不是,我将如何使用指示立方体角的浮点矩阵(易于操作)从本地内存(可能是视频内存)实现直接遮挡剔除?请注意,反门户与我的框架不兼容。
或者,用“简单”的英语:如何在不进一步减少数据大小的情况下使用 glBufferData 加速将数据缓冲到 vram?
更新:将运行自定义遮挡剔除路线。我相当肯定我的数据缓冲时间大大增加了添加遮挡块所需的时间,甚至可能由于剔除更新程序获取锁而被同步延迟。如果有人有关于从缓冲区中进行遮挡剔除的建议,那就太好了。
更新 2:一旦我添加了隐藏面剔除(两个接触面 = 都不渲染),问题就巧合地解决了。我现在不需要额外的性能提升,因为仅此一项就使我的缓冲区大小降低了 90%,帧速率提高了 400%。感谢RTS的回答。