3 月:Steam、数据库与蓝图!
全新的 Steam 商店页面、性能优化、数据库与蓝图集成!
Steam 商店页面
最近我们的商店页面遇到了一些问题,这迫使我们重新制作一个全新的页面。现在我们终于重新发布了它!它拥有了新的截图、视频以及更好的描述!
请立即加入愿望单!!!
整个情况的一个不利之处是,旧商店和旧游戏条目将被停用。很快每个人都将收到一个新的 Steam 密钥,用于在你的库中激活新的 nanos world!
此外,我们嵌入了一个工具,用于将你的成就和统计信息从旧游戏导出(然后导入)到新游戏。你只需在启动新游戏之前启动一次旧游戏,一切都会自动导入!
性能优化
众所周知,nanos world 的一大优点就是性能和优化。而在上个月,我们在改进框架的一些内部关键点方面取得了重大进展。
内存
首先要提到的是,我们生成的实体在内存占用方面取得了巨大的改进。
在内部,我们使用一个特殊的系统来处理通过网络发送和同步数据。我们的方法是采用一个类似于虚幻引擎复制系统的系统。但在此之前,该系统是每个生成实体内存占用的大部分原因。
考虑到这一点,我们致力于解决这个问题,更不用说这些内存占用中的大部分在所有实体中都是不必要地重复的。幸运的是,我们成功地将实体的内存占用减少了高达 90%。现在它只占用其存在所严格需要的数据!
我们做了一个小测试来比较,通过脚本生成 10,000 个角色,查看内存占用的差异:
之前:
之后:
部分实体内存占用前后对比:
| Entity | 之前的内存占用 | 之后的内存占用 | 减少量 |
|---|---|---|---|
| Cable | 5.4 KB | 1.1 KB | 80% |
| Character | 13.1 KB | 1.8 KB | 86% |
| Light | 4.8 KB | 1.0 KB | 79% |
| Melee | 7.1 KB | 1.5 KB | 79% |
| 粒子 | 4.6 KB | 1.0 KB | 78% |
| Player | 3.1 KB | 0.3 KB | 90% |
| Prop | 4.8 KB | 1.0 KB | 79% |
| StaticMesh | 4.5 KB | 1.0 KB | 78% |
| TextRender | 5.3 KB | 1.1 KB | 79% |
| Trigger | 4.0 KB | 0.8 KB | 80% |
| Vehicle | 7.9 KB | 2.0 KB | 75% |
| Weapon | 11.1 KB | 2.0 KB | 82% |
此占用是在服务器端计算的。在客户端,这些数值会稍大一些,更不用说同时加载的资产了。
这仅仅是通过改进一个单一系统实现的,我们甚至还没有开始研究主动压缩技术或减小一些不必要地大于其需求的变量大小。 🙏
网络
另一项重大优化是在我们的网络数据包方面,通过网络发送的每个数据都有一个通用的“标头”来标识某些操作。这是网络的一个恒定“成本”,我们成功将其大小减少了高达 75%,使得所有通过网络发送的数据静态地降低!
客户端
我们开始推进客户端的游戏优化。这通常比服务器端更棘手,因为它涉及处理虚幻引擎子系统。但我们成功基于所选的质量设置添加了一些优化。例如,对于血液或弹孔粒子,现在根据距离和所选的效果质量,它们将减少生成或完全不生成。
我们还调整了载具系统,使用该系统进行类似的优化。我们还有很多可以改进的地方! 😀
新类:Blueprint

一个非常被需要的类正在被引入:Blueprint!现在可以在 nanos world 中生成任何蓝图 Actor!
我们成功实现了方法:CallBlueprintEvent(),你可以在蓝图中创建任何带有任意数量参数的事件或函数,并从脚本中调用它!这扩展了许多可能性!
此外,你可以在服务器上生成它,它将遵循与任何其他 Actor 实体相同的规则,并且也会使用网络主控系统与其他玩家同步!
新类:Database

对于某些游戏模式(如角色扮演)来说,极其基础的东西就是数据库。在此之前,我们提供了一个 MySQL 模块作为第三方 Lua 库使用,但由于其与服务器集成的复杂性,以及无法进行异步查询,我们深入研究了一个更健壮的解决方案。
为此,我们推出了新类:Database。一个用于连接数据库的一体化解决方案,开箱即用地支持 MySQL、PostgreSQL 和 SQLite!更不用说异步和线程安全的查询了!
查看其页面以获取完整的文档和示例!
载具轮胎打滑痕迹
我们为载具做的一个小而酷的补充是,在打滑时添加轮胎痕迹:
此外,还添加了一个很棒的细节:车轮会被鲜血涂抹!
它是 100% 动态且程序化的!
沙盒改进
我们在沙盒游戏模式方面获得了多项改进!第一个是沙盒“API”:我们列出了它导出的所有函数和事件,以便你可以集成自己的实体/工具或使用其功能。
我们还对菜单、类别和标签进行了模块化,你可以从外部包中添加自己的!
在 GitHub 页面查看沙盒 API:https://github.com/nanos-world/nanos-world-sandbox。
最后,我们改进了物理枪工具,现在你可以使用鼠标控制它,并且还具有“吸附到网格”的移动功能!
沙盒中还进行了其他几项调整和漏洞修复。
新的粒子方法
我们扩展了粒子的可能性!现在可以在其上设置材质参数,还可以使用任何纹理、WebUI 和画布作为参数!
例如,你可以生成一个画布,在其上绘制并用作材质粒子参数!
以下视频展示了使用 WebUI https://nanos-world.com 作为材质参数放入粒子中!在运行时渲染!
显著改进
音乐并发
我们终于成功修复了音乐问题,该问题导致当生成太多声音时,类型为音乐的声音会停止。
客户端道具
道具现在也可以在客户端生成!这允许在客户端生成“非网络化”的动态网格体,旨在用作视觉效果和非游戏功能。
我们已经更新了沙盒的可破坏实体,使其使用客户端碎片!
关卡静态网格体

现在,地图中的所有 StaticMeshActor 都会在客户端自动加载为 StaticMesh 实体!可以在客户端对它们进行绘制、破坏、移动以及任何其他操作!
异步纹理加载
我们改进了客户端加载系统,现在纹理(例如 .jpg)是异步加载的,并且纹理以延迟方式应用。该系统目前在 SetMaterialTextureParameter() 下实现用于测试,很快我们也可以在其他方法中使用它。
异步文件加载
除上述之外,我们还扩展了异步实现到 File 类中,现在它有了 :ReadAsync() 方法!
新的光照方法
我们添加了一堆缺失的光照设置器和获取器方法,以及使用 SetVisibility() 切换其开/关的能力。
Assets.toml 更改
Asset.toml 获得了一个新类别:unreal,我们必须在其中指定一个新设置 unreal_version(此资产包编译所用的虚幻引擎版本),这将是一个重要的功能,以防止旧资产版本导致游戏崩溃。
它还获得了新的 blueprints 类别,用于列出蓝图 😉。
载具碰撞
我们调整并改进了我们的碰撞配置,现在载具在与其他物体(包括网络化角色、道具和其他载具)碰撞时交互更好。
之前其他网络化角色在与载具碰撞时会失去同步(它们开始飞行,当物体撞到载具车轮时会发生奇怪的事情),而且两辆载具之间的碰撞极其僵硬,这也已被修复,现在将更加自然。
太阳改进

默认太阳光和阴影已得到改进,特别是在日出/日落期间,我们曾有一些伪影和阴影消失的问题,现在它应该更平滑、更漂亮(并且希望更高效)。
结语
感谢又一个月的支持!蓝图和数据库类取得了令人难以置信的进展,并且最终再次整理了我们的 Steam 页面!
我们的方向是继续推进性能和内存优化,并为 nanos world 带来重要的新功能!
我们还面临一些重要挑战,即为实体引入基于距离的剔除和维度系统,这对于创建特殊环境至关重要。
我们还想实现一些重要的类,例如自定义角色(例如用于动物)和其他类型的载具(空中、海上)。
最后,我们对虚幻引擎 5 的发布(昨天 4 月 5 日)感到非常兴奋,因为它带来了 nanos world 中重要问题的几个解决方案(例如运行时重定向,它承诺解决几个动画兼容性问题)以及大量可使用的新功能!我们很快™就会有好消息带给你!
下个月见! 🥳

