我有一个(基本的)体素引擎运行和一个水系统看起来(我认为基本上是有效的)像这样:https://www.youtube.com/watch?v=Q_TdeGIOOts(不是我的游戏)。
水值存储在3d浮子数组中,每隔0.05s它通过检查下方和邻近的体素(y-1,x-1,x + 1,z-1,z + 1)来计算水流量并添加价值。
这个系统可以很好地(70 + fps)处理少量的水,但是当我开始计算8+块的水时,它会变得太多。
(我禁用了所有渲染或网格创建来检查这是否是瓶颈,它不是。它纯粹是流量计算)。
我不是一个非常有经验的程序员,所以我不知道从哪里开始优化,除了像我已经做的那样在协程中进行计算。
在这篇文章中:https://gamedev.stackexchange.com/questions/55414/how-to-define-areas-filled-with-water(靠近底部)Boreal建议在计算着色器中运行它。这是我的方式吗?我怎么会这样做呢?
非常感谢任何帮助。
答案 0 :(得分:0)
如果您真的在计算基于体素的模拟,那么随着尺寸的增加,您将在几何上扩展计算次数,因此您将在较大的体积上快速耗尽处理能力。
计算着色器非常适合快速进行大规模并行计算,尽管它是一种非常不同的编程范例,需要一些人习惯。计算着色器将查看缓冲区的内容(即,我们平民的'纹理')并快速完成任务 - 在您的情况下,缓冲区可能是缓冲区/纹理,其像素值代表水细胞。如果你想做一些非常简单的事情,比如增加或减少它们,计算着色器使用GPU的并行处理能力来快速完成。
困难的部分是GPU optimized for parallel processing。这意味着您无法编写像“texelA.value + = texelB.value”这样的代码 - 如果您不需要额外的工作,缓冲区的每个片段都会在不了解其他片段中发生的事情的情况下进行处理。要引用其他纹素你需要以某种方式再次读取纹理 - 一些技术使用偏移多次读取一个纹理(this GL example这样做可以实现模糊,其他则通过重复处理纹理,将结果放入临时纹理来实现然后重新处理。
在10,000英尺的水平:是的,计算着色器是解决此类问题的好工具,因为它涉及大量的自相似计算。但是,蝙蝠并不容易。如果您之前没有完成传统的着色器编程,您可能需要首先考虑它以适应GPU的工作方式。即使是非常基本的工具(if-then-else或循环)在GPU编程中具有非常不同的性能影响和用途,也需要一些时间来了解差异。在撰写本文时(2013年1月10日),它看起来像Nvidia and Udacity are offering an intro to compute shader course,这可能是一个很好的方法来加快速度。
FWIW您还需要非常现代的计算着色器硬件,这可能会限制您的受众。