首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一C# Voxel有限水优化

统一C# Voxel有限水优化
EN

Stack Overflow用户
提问于 2014-01-11 08:56:03
回答 1查看 2.2K关注 0票数 1

我有一个(基本的)体素引擎运行和一个水系统看起来(我认为基本上是工作的)像这样:TdeGIOOts (不是我的游戏)。

水的值存储在一个三维浮子阵列中,每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建议在计算着色器中运行它。对我来说是这样吗?我要怎么做这样的事?

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-11 19:09:32

如果你真的在计算一个基于体素的模拟,那么随着你的尺寸的增加,你会在几何上扩展计算的数量,所以你很快就会在更大的体积上耗尽处理能力。

计算机着色器非常适合快速进行大规模并行计算,尽管它是一个非常不同的编程范式,需要一些人才能适应。计算机着色器将查看缓冲区的内容(即,对我们平民来说是“纹理”)并对其进行快速处理--在您的例子中,缓冲区可能是一个缓冲区/纹理,其像素值代表水单元。如果你想做一些简单的事情,比如向上或向下增加它们,计算机着色器使用GPU的并行处理能力来快速完成。

最难的部分是GPU是为并行处理优化。这意味着您无法编写像"texelA.value += texelB.value“这样的代码--如果没有额外的工作,缓冲区的每个片段都会被处理,而对其他片段中发生的事情一无所知。要引用其他纹理,您需要以某种方式再次读取纹理--有些技术使用偏移多次读取一个纹理(这个GL示例这样做是为了实现模糊,另一些方法是通过反复处理纹理,将结果放入临时纹理,然后再对其进行再处理。

在10,000英尺的高度:是的,计算机着色器是解决这种问题的一个很好的工具,因为它需要大量的自相似计算。但是,这不是一件容易的事。如果您以前没有做过传统的着色器编程,您可能需要先看一下,以适应GPU的工作方式。即使是非常基本的工具(如果-然后-否则或循环)有非常不同的性能含义和在GPU编程中的使用,它需要一些时间来使您的头脑在不同的地方。在本文撰写之时(1/10/13),它看起来像Nvidia和Udacity提供了计算着色课程的介绍。,这可能是提高速度的好方法。

FWIW你还需要相当现代的硬件计算着色器,这可能会限制你的观众。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21060421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档