微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rust 游戏如何放置数以百万计的草、岩石和树木

如何解决Rust 游戏如何放置数以百万计的草、岩石和树木

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

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

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

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

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

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

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

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

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

解决方法

您实际上可以在代码中亲眼看到这一点: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/index.html

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。