gpt4 book ai didi

c# - 在线程之间同步 VBO 的最佳方式

转载 作者:行者123 更新时间:2023-11-30 17:34:48 25 4
gpt4 key购买 nike

所以我有一个类似 minecraft 的 block 系统,这意味着它是一个渲染数据 block 。当玩家四处移动并进入另一个 block 时,超出范围的 block 将在加载新 block 的同时被卸载,这使得它非常苛刻,因为渲染数据必须首先在另一个线程中计算才能显示。

假设数据已经从磁盘加载,它看起来像这样

主/渲染线程渲染数据生成线程

   |         Request Chunk            |
| -------------------------------> |
| |
| | Generating render data (FloatBuffer)
| |
| .
| .
| .
| Get Ready Chunks |
| <------------------------------- |
| |
| Upload Data |
| |
| Render |
| |

“请求 block ”和“准备好 block ”不同步,因此渲染线程真正独立工作。

问题在于一次上传大量 block 会导致帧丢失,但无法可靠地计算我还剩下多少时间来上传。如果我每帧只上传一个,我会错过很多速度,尽管它工作正常(这就是它目前的实现方式)。

因为我只使用一个 GL 上下文,所以我现在只能在主线程中创建 VBO。

有什么方法可以更有效地解决这个问题,比如在另一个线程中创建 VBO,然后将它们传递给主线程?

最佳答案

老实说,您限制每帧上传数量的方法可能是可行的方法;即使是我开发过的商业游戏也会这样做,以避免流式传输出现故障。在其他线程中完成所有可能的工作,然后在渲染线程中仅提交本身。

加快速度的一个有用方法可能是考虑减少每个 block 实际必须上传的数据量的方法。例如,在我自己的体素渲染器中, block 大小是 64x64x64,这意味着我实际上只需要每个组件 8 位来表示位置(还有一些备用位)。而且我可以通过在像素着色器中从导数计算法线来避免提交法线。等等。

关于c# - 在线程之间同步 VBO 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41936074/

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