0

Rust 在其地图上拥有数以百万计的草、岩石和树木实例,这些实例长达 8 公里。

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

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

但是,我无法想象这会与树木之类的东西很好地扩展。场景中是否真的有成千上万个网格对撞机始终处于活动状态?我想也许他们可能会将所有这些网格碰撞器存储在场景中,并且可以标记游戏对象,如果你用工具击中它,它会向它添加一个“树”组件。

我是否采用“预先生成所有内容,在运行时实例化”的方法朝着正确的方向前进?

我已经对此进行了测试,它确实有效,产生了 2400 万个实例(需要 20 分钟进行光线投射),然后用这些实例初始化 GPU。

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

也许您在运行前存储实例,然后当您启动分离服务器时,您会进行所有光线投射并放置所有树木、岩石和其他交互式对象。

但我担心,如果我尝试存储 10000 个游戏对象(用于交互,诸如可砍伐的树木、可开采的岩石之类的东西),性能会下降。

4

1 回答 1

1

您实际上可以在代码中看到这一点:https ://github.com/Facepunch/Rust.World/blob/master/Assets/Scripts/WorldExample.cs

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

有很多技巧,降低您的绘制调用、广告牌、剔除、对象池、分块,仅举几例。

如果您对此类系统感兴趣,建议您研究 ECS 的统一性,因为它提供了一种更轻松的数据实例化方式:https ://docs.unity3d.com/Packages/com.unity.entities@0.17/manual/索引.html

这样一来,您就可以拥有数千个实例化对象,而游戏对象的大小和性能只是其中的一小部分。

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

于 2021-05-29T04:10:16.127 回答