跳至正文

3 月:文件传输、地图包!

· 12 分钟读完
Gabriel • SyedMuhammad
lead developer™

文件传输、地图包、Esc 菜单及更多!

Esc 菜单信息​

游戏中的 Esc 菜单现在显示服务器信息,如名称、描述、地图、游戏模式、已连接玩家,以及一个可以使用新方法 Client.SetEscapeMenuText() 自定义的特殊区域。

它支持使用富文本标签如 \<strong>、\<h1>、\<h2> 和 \<h3> 进行格式化!

<h1>标题 1!</>
<h2>标题 2!</>
<h3>标题 3!</>
<strong>粗体文本</>
普通文本

新包类型:地图​

引入了一种新的包类型“地图”,以完全取代所有旧的地图加载方式(以及地图包)!它现在是一个像其他包一样的包,能够包含脚本并运行 Lua 代码。

提示

现在地图资产路径配置在其 Package.toml 中,因此当加载此地图包时,它将加载其内部配置的地图资产!

到目前为止,地图包是通过在资产包内创建一个与地图同名的文件夹来配置的,与其他 .uassets 和烘焙文件混在一起,这不可持续且有若干缺点。

有了这个新系统,我们将能够进行改进,消除服务器在本地下载资产包的需要,因为所有地图包将不再包含在资产内!

由于它像其他包一样是一个包,也可以上传到资源库,所以所有现有地图都可以在新游戏屏幕中选择,即使你尚未下载它们!而且你不需要事先下载它们,因为通过新游戏启动服务器将自动下载其所有依赖项!

与其他包类型一样,地图包的 Package.toml 略有不同,它包含新属性:map_asset(此地图实际使用的资产)、spawn_points(出生点列表)和 custom_data 部分(可通过 Server.GetMapConfig() 访问的通用数据):

Package.toml
loading...

在包指南页面阅读更多。

资源库改进​

菜单中的资源库标签页经历了多项改进!

新标签页​

现在我们有多个标签页分隔每种包类型和资产包,使得在不同类别之间导航和搜索更容易。

此外,类别下拉筛选器现在仅在资产包标签页中可见。

创建本地资源​

现在可以通过 UI 创建新的本地资产包和包!

我们新增了一个按钮,打开表单以创建资源!

未来我们将扩展此功能,允许创建并上传到商店!全部通过 UI 完成!

图像加载​

现在所有资源库图像都以延迟方式加载,避免了主菜单加载时的一些初始卡顿,因为标题/团队图像现在将在屏幕上出现时按需加载,更不用说现在更快更可靠了。

返回按钮​

返回按钮从左下角移到了右上角,使其对整体 UI 使用更直观:

新文件传输系统​

我们彻底改造了文件传输系统!这个新系统更加健壮,旨在解决我们之前下载文件和加载屏幕遇到的所有问题!

子系统​

这个新系统通过将工作分为三个子系统/步骤来运作:套接字、HTTP 和 资源库资产 .zip。

每个子系统/步骤有不同的文件下载方式,针对不同场合:

HTTP​

HTTP 文件传输系统是最常规的文件发送方式。服务器启动一个 HTTP 服务器,客户端通过 HTTP 请求下载文件。它在内联网络系统之外并行工作。

这对于发送大文件非常好。但在 P2P 服务器中不起作用,因为通常主机没有在路由器中转发端口,而这对于让 HTTP 服务器公开是必需的。

当文件大于 512 KB 时使用此系统,客户端一次只向服务器请求 16 个文件(值可通过设置高级标签页配置)。

套接字​

由于 HTTP 请求每次请求文件时都需要连接到服务器(建立连接、握手、校验等),这在每次文件下载之间增加了大量时间,如果我们有数千个文件,这很糟糕。因此为了加速整个下载时间,我们还有套接字系统。

套接字子系统使用内联网络系统发送文件,它更快,因为它将所有文件数据附加到网络线路中并全部刷新到客户端。缺点是内联网络系统并非用于发送文件,因为它会瓶颈网络,并且根据连接质量,可能发生大量丢包,导致整个传输变慢。

但这对于发送大量小文件非常好,因为它将它们全部附加到线路中并以单一流发送给客户端。

此系统用于两种情况:当文件小于 512 KB 时(可通过设置高级标签页配置)或当服务器是 P2P 时。

信息

P2P 服务器使用 Steam 数据报中继服务器来处理玩家之间的连接,无需他们在路由器中转发端口。

因此,所有连接和网络传输都通过 Steam 服务器进行,其似乎有 1 MB/s 的硬编码速度限制,使得整个文件传输系统在 P2P 服务器上*“硬编码地”*变慢。

资源库资产​

最后一个子系统使用资源库直接从我们的 CDN 服务器下载所需的资产包,无需通过游戏服务器。

当服务器加载的资产包存在于资源库且版本相同时使用此方式。然后客户端可以直接从中下载资产包,而不是从游戏服务器!

已修复的问题​

除了所有重做的系统外,我们特别关注了过去存在的问题和错误,并为此添加了多个新的校验层以确保一切顺利。因此如果任何失败,或者下载文件耗时过长,玩家将被断开连接,以防止由此引起任何进一步问题。

下载速度​

在旧系统中,我们一次只下载 8 个套接字文件和 1 个 HTTP 文件。但现在我们一次下载多达 128 个套接字文件和 32 个 HTTP 文件!因此我们在连接服务器时的下载速度获得了巨大提升!

提示

以下基准测试是在官方服务器上连接沙盒游戏模式,仅使用 HTTP 传输,仅用于测试 HTTP 文件传输系统。由于它没有充分利用套接字优化,实际时间可能会大不相同。

文件时间提升
102:35N/A
201:1898%
400:40287%
800:24545%
1600:19715%
3200:15903%

此表显示了使用新文件传输系统同时下载的 HTTP 文件数量及其对最终连接时间(分钟)的影响。

服务器异步处理​

此外,现在游戏服务器异步处理文件传输,意味着每个文件传输请求都排队并从单独的线程处理,减少了玩家加入服务器时的卡顿和高 tick 率。

加载屏幕改进​

加载屏幕也经历了几项改进!

详细进度​

现在它显示更多关于下载进度的信息,包括:

  • 正在下载的总大小(汇总所有子系统,包括资源库)
  • 当前已下载的大小
  • 当前下载速度
  • 正在下载的文件数量
  • 当前步骤的进度(下载中、安装中……)

服务器启动进度​

从菜单启动新游戏时,现在显示更多关于本地服务器的信息,包括服务器下载资源库项目时的进度!

它准确告诉服务器初始化的每一步和进度,从菜单启动游戏时提供更好的体验。

此外,整个新游戏启动过程也通过更好的校验得到改进,以防启动新游戏时出现问题!

载具翻转复位系统​

翻转载具的复位现在更加确定,物理漏洞更少。

现在翻转载具必须使用转向输入(例如 A 或 S)来指向旋转哪一侧,而不是像以前那样仅加速。

实体网络大小​

对实体与客户端同步时通过网络发送的内部结构进行了进一步优化。通过优化向量等大型结构体和其他不必要过大的数值数据的使用,实现了大幅缩减。

我们将其大小缩减了高达 30%!

Entity之前之后减少量
Blueprint192 B136 B29.17%
Cable464 B312 B32.76%
Character392 B336 B14.29%
CharacterSimple416 B360 B13.46%
Light240 B184 B23.33%
Melee256 B184 B28.13%
Particle200 B144 B28.00%
Prop208 B152 B26.92%
StaticMesh192 B136 B29.17%
TextRender248 B192 B22.58%
Trigger240 B168 B30.00%
载具360 B288 B20.00%
Weapon416 B312 B25.00%
备注

这些是静态大小,但实体也有动态大小,如字符串和列表,会动态增加它们的整体大小!

此外,这些值代表实体序列化时发送给客户端的网络数据,而非内存占用。

修复冻结行为​

连接服务器时冻结的行为已修复!“等待”步骤已移至加载屏幕末尾,现在以异步方式处理!这将可用性提升了 1000 倍! 🥳

改进与漏洞修复​

主菜单已更新,首次出现时(游戏启动或从服务器断开连接)具有新的淡入效果,大大改善了其使用的流畅度。

还值得一提的是,我们成功修复了主菜单中遇到的几个问题和崩溃。

现在用户体验流畅多了!

设置标签页:高级​

游戏现在有一个名为“高级”的新设置标签页,玩家可以在其中调整文件传输设置以帮助调试问题。

每个设置都有特殊含义,悬停时会进行说明!

近战改进​

近战获得了社区要求的重大改进 (咳咳 Timmy 咳咳)!

多重命中​

近战现在每次“动作”可命中多个角色。这意味着一次挥砍现在可以同时砍中多个敌人!

附加静态网格体​

现在近战在考虑碰撞基元计算伤害时会利用附加的静态网格体!为命中检测的边界做出贡献!

杂项​

其他杂项改进。

蓝图参数​

此外,游戏现在支持将几种新结构体传递给蓝图函数,包括 FQuat、FMargin、FVector4、nil。

它还支持传递实体 Canvas、WebUI 和 SceneCapture,这些在蓝图中接收时会转换为材质接口。

完整列表请查看蓝图页面。

--logo 命令行​

现在服务器命令行 --logo 将 URL 下载到内存中以显示在服务器列表中,不再下载并覆盖本地的 Server.jpg 文件。修复了使用相同 .exe 启动多个服务器时的问题。

文件/文件夹大小写​

此外,现在创建 Server、Shared、Client 文件夹或 Index.lua 时如果大小写不正确(小写或全大写)将抛出警告。

这是我们在脚本编写者在 Windows 上开发包,然后在 Linux 上加载时无法工作时遇到的常见问题。我们最终发现这是因为他们创建的文件的大小写敏感性问题。因为在 Linux 上所有文件都是区分大小写的。

结语​

上个月是 nanos world “框架”整体稳定性和健壮性取得出色进展的一个月。加载屏幕、文件传输系统和菜单现在流畅多了。

这些改进和修复使游戏看起来专业多了。我们在文件传输方面遇到的难以复现、只有在大规模测试时才能目睹的问题终于解决了!

地图包是另一个巨大的改进!虽然从技术角度来说不是什么大事,但这解决了我们必须处理的几个问题,例如服务器上不必要下载大型资产的需求(很快™),或者我们之前糟糕且丑陋的旧地图包实现,它导致了很多漏洞和问题。

我一直致力于实现至少一个来自我们反馈中心的投票最多和请求最多的项目。所以请务必投票支持或建议你想要的功能!

感谢又一个月的陪伴! 🙏🙏🙏