gpt4 book ai didi

java - 缓冲 VBO 数据的小延迟

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:46 26 4
gpt4 key购买 nike

我正在研究受我的世界启发的图形引擎,很快就会在实际游戏中实现。在几何压力测试下,我的引擎达到了 60+ FPS。我只使用 LWJGL 进行图形辅助。有一次我在本地内存上更新 VBO 数据时遇到了很大的延迟,但我通过多线程、流线化和同步通用 block 剔除器/构造器解决了这个问题。

在剔除后将 VBO 数据缓冲到显存期间,我偶尔会遇到一个小故障(20-30 毫秒),这会导致屏幕在这段时间内卡住。我认为发生延迟的原因是因为我每几帧通过 glBufferData(在静态绘制模式下)向 VBO(3-5mb) 发送大量几何数据。我已经实现了 block 视锥体剔除、 block 视锥体剔除、空气 block 剔除和定向环境剔除器。

这留给我两个问题:

  1. 我可以使用另一种比 glBufferData 更快的数据缓冲方法吗? (也许是一种将第二个缓冲区多线程化作为准备的方法,这会将障碍转移到第二个线程)?

  2. 如果不是,我将如何使用指示立方体角点的浮点矩阵(易于操作)从本地内存(可能是视频内存)实现直接遮挡剔除?请注意,反门户与我的框架不兼容。

或者,用“简单”的英语来说:如何在不进一步减小数据大小的情况下使用 glBufferData 加快缓冲数据到 vram 的速度?

更新:将运行自定义遮挡剔除路线。我相当确定我的数据缓冲时间因添加被遮挡 block 所花费的时间而大大增加,甚至可能因剔除更新程序获取锁而因同步而延迟。如果有人对缓冲区中的遮挡剔除有建议,那就太好了。

更新 2:一旦我添加了隐藏面剔除(两个接触面 = 都不渲染),问题就巧合地解决了。我现在不需要额外的性能提升,因为仅此一项就使我的缓冲区大小减少了 90%,帧率提高了 400%。感谢 RTS 的回答。

最佳答案

是的,有几种方法。

  1. 使用 glBufferSubData
  2. 将缓冲区使用设置为动态或流
  3. 使用 glMapBuffers
  4. 使用较小的顶点基元(float 代替 double,或 short 代替 int)
  5. 确保您的数据是一致的
  6. 交错放置您的 VBO,以便您只需执行一次缓冲区更新
  7. 使用 VAO(顶点数组对象)
  8. 使用双缓冲,以便在需要使用它进行渲染时提前一帧将数据上传到 VBO,以避免资源冲突。
  9. 使用连接图元避免重复顶点(GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN 等)

关于java - 缓冲 VBO 数据的小延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7199343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com