C# 游戏如何使数百万的草、岩石和树木生锈

C# 游戏如何使数百万的草、岩石和树木生锈,c#,unity3d,shader,procedural-generation,geometry-instancing,C#,Unity3d,Shader,Procedural Generation,Geometry Instancing,Rust的地图上有数以百万计的草、岩石和树木,其面积达8公里 在运行时,草是否在玩家周围动态放置?如果是这样,是在GPU上完成的还是使用着色器 在我的游戏中,我们使用顶点颜色和光线投射来放置植被,并存储在运行时使用间接GPU实例化初始化的变换数据 然而,我无法想象这会与像树这样的东西很好地匹配。场景中是否始终有数千个网格碰撞器处于活动状态? 我想他们可能会在场景中存储所有的网格碰撞器,游戏对象可以被标记,如果你用工具击中它,它会向它添加一个“树”组件 我是否正朝着一个正确的方向前进,采用了“先生

Rust的地图上有数以百万计的草、岩石和树木,其面积达8公里

在运行时,草是否在玩家周围动态放置?如果是这样,是在GPU上完成的还是使用着色器

在我的游戏中,我们使用顶点颜色和光线投射来放置植被,并存储在运行时使用间接GPU实例化初始化的变换数据

然而,我无法想象这会与像树这样的东西很好地匹配。场景中是否始终有数千个网格碰撞器处于活动状态? 我想他们可能会在场景中存储所有的网格碰撞器,游戏对象可以被标记,如果你用工具击中它,它会向它添加一个“树”组件

我是否正朝着一个正确的方向前进,采用了“先生成所有内容,然后在运行时执行”的方法

我已经对此进行了测试,它确实起了作用,产生了2400万个实例(raycast需要20分钟),然后用这些实例初始化GPU

这很酷,尽管它导致我的Unity编辑器在一段时间后崩溃(内存泄漏?)

可能在运行前存储实例,然后在启动Deciscated服务器时执行所有光线投射并放置所有树、岩石和其他交互对象


但我担心,如果我尝试存储10000个游戏对象(用于交互,如可砍树、可挖掘岩石等),性能会下降。

你可以在代码中亲自看到这一点:

游戏将实例加载到内存中,或者也可以流式传输实例,但是你永远不会让预制件在GO中同时实例化,因为需要剔除/块来保持性能(并且不会使程序崩溃)

这里有很多技巧,比如降低抽签次数、广告牌、剔除、对象池、分块等等

如果您对这样的系统感兴趣,建议您查看ECS for unity,因为它提供了一种更轻松的数据实例化方式:

通过这种方式,你可以拥有数千个实例化对象,而游戏对象的大小和性能只是游戏对象的一小部分


我也不想深入研究生成对象,因为这不是主要问题,但使用光线投射生成贴图的速度非常慢,正如您现在所知,您应该研究噪声生成以创建生物群落并快速生成实例,此外,地图确实需要为对象设置一个位置,您只需添加用户需要加载的数据。另一种选择是,将作为可视对象的对象任意放置在可视距离周围,这样它们只存在于内存中,如果有人跑过一个普通草堆,他们将永远不会在意它是否在下次跑过它时被移动。

他们可以使用的一种技术是。您还需要将所有内容都设置为静态和烘焙遮挡剔除。服务器不需要同时加载所有碰撞器吗?例如,当一名玩家在地图的一端射击(假设射击是服务器授权的),而另一名玩家在地图的另一端射击时,服务器必须检查一名玩家是否击中岩石或树木?