跳至正文

6 月:刻、网络代码与追踪!

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

刻、网络代码与追踪!

欢迎阅读我们上个月最新更新的汇总!

刻​

刻是游戏跳动的心脏,我们在这里处理输入、网络回调、脚本事件以及其他一切。

我们在客户端和服务器端都大幅改进了刻循环和计时器系统:

服务器端​

我们完全重构了核心刻循环,实现了更精确的计时算法。这种新算法消除了过去影响内部计时器甚至 Timer 类的微小但累积的计时误差。

因此,我们将 Config.toml 中的配置从 tick_rate 改为 max_tick_rate,现在以 赫兹 (Hz) 为单位,而非毫秒。默认值现在是 30 Hz(即每帧 33.33ms),与客户端匹配以实现更好的同步。

我们还改进了高刻持续时间的日志,显示更好的诊断信息,如下所示:

WARNING Server Tick time extremely high! Server may be very overloaded or stuck.
Tick Duration: 117.90ms (8/s). Average: 39.07ms (25/s). Configured: 33.33ms (30/s).

客户端​

以前,所有 nanos world 处理都在物理模拟之后进行。这包括网络、快照、插值、Lua 事件处理、CEF 绘制、3D 调试绘制等。

它确实能工作……但我们意识到它可以好得多。

我们现在重新排序并确定了内部刻的优先级,使低延迟任务(如网络同步和输入)在帧中尽快发生,而需要帧被完全读取的任务在有数据可供使用时才执行。

这确保在帧准备好时执行正确的逻辑,修复了使用“旧”帧数据工作的问题。

结果?感知流畅度和响应性急剧提升。以下是使用物理枪的前后对比:

沙盒物理枪之前,文本和粒子位置有大量抖动和不同步
沙盒物理枪之后,不再有抖动和残影

仅仅通过调整算法的处理顺序就实现了这一巨大改进。

计时器​

计时器之前依赖于帧之间的增量时间。随着时间推移,这导致了轻微的误差,非常细微,但足以累积。

我们现在使用基于真实时钟的算法来以更高精度追踪经过的时间。

在比较计时器和 Lua clock 方法时非常明显,它们几乎完全同步。

备注

计时器和 Tick 事件仍然继承配置帧时间的误差范围(例如 33ms)。

我们还修复了间隔计时器中的一个长期漏洞,它没有补偿执行开销。现在,设置为每 1 秒触发的计时器将准确每 1 秒触发,无论什么情况,连续调用没有延迟。

网络代码改进​

此外,得益于 Tick 改进和其他内部低级网络改进,我们的网络延迟显著降低了!与地球另一边的人一起游玩的品质感大幅提升!

我们甚至降低了调试绘制颜色的阈值,以更准确地检测延迟。在这里你可以注意到现在接收的数据包更加均匀分布:

之前接收的网络快照数据包:过大的修正(大箭头)和延迟(黄色)
现在接收的网络快照数据包:均匀分布,大多为绿色且小
提示

箭头越大,本地插值与接收到的网络真实位置之间的“误差”就越大。

黄色箭头表示数据包接收耗时超过 2 帧(66ms)。这个阈值从旧的 450ms 降低了,即使如此我们现在几乎看不到黄色了!

阅读更多关于网络调试以及每种颜色/箭头含义的信息:

🧑‍💻 主控概念core-concepts/scripting/authority-concepts

追踪​

内部追踪处理方面的一些重大改进。

追踪可见性​

我们的追踪函数使用虚幻的 TraceByObjectTypes,它不关心碰撞追踪通道。这对 nanos world 实体和出于游戏目的创建的自定义地图来说工作正常。

但我们发现一些用户制作的地图(或 FAB 地图)中有对象(如 WorldStatic)设置为忽略可见性通道上的碰撞,但查询碰撞仍然启用。这些对象仍然被我们的追踪检测到,即使它们不应该被检测到,破坏了游戏玩法的某些方面,例如沙盒的物理枪或生成菜单无法正常工作。

为了修复此问题,我们在 TraceMode 枚举中新增了 TraceMode.TraceOnlyVisibility。

这种新的追踪模式确保追踪仅返回匹配传入对象类型且具有可见性通道阻挡的对象,使其成为我们沙盒常用追踪的必备功能,并修复了我们在自定义 FAB 地图上遇到的所有问题。

撞击点​

应社区要求,我们还在追踪返回值中新增了信息:ImpactPoint,这是追踪与撞击对象碰撞的接触点!

资产包自动重载​

开发环境中的一个常见问题是开发者可以在服务器仍在运行时修改资产文件,使所有预计算的哈希在技术上无效,导致客户端本地文件不匹配,在某些情况下使用过时哈希向服务器请求更新文件,导致下载错误并阻止他们连接,直到完全重启服务器。

我们正在引入新的资产包自动重载系统!这个新系统实时检测资产文件夹内的文件更改,并排队自动重载受影响的资产包。它重新计算所有哈希(就像服务器启动时一样),允许在服务器保持在线时更新资产包。

备注

这不是热下载系统。已连接的玩家仍然需要重新连接才能下载更新的文件。

此系统旨在消除开发过程中的许多问题,如不一致的哈希、无声的不同步或神秘的崩溃。

资产包重载期间,新玩家连接将被暂时阻止,直到完全就绪。

加载屏幕数据​

我们修订了 LoadingScreen JavaScript 对象的结构。现在,server 和 player 信息整齐分离:

index.js
var LoadingScreen = {
server: {
ip,
port,
name,
description,
},
player: {
nanos_id,
nanos_username,
steam_id,
}
}
备注

旧格式现已弃用,使用时会显示警告。

新系统统计信息​

我们新增了一个小而实用的调试功能:系统统计信息。启用时它与帧时序面板一起出现,显示实时 RAM 和 VRAM 使用情况。

你可以在调试设置中启用它!

我们打算将来扩展此统计信息以显示更多信息。

更新日志 Markdown​

我们新增了一个游戏内 Markdown 解析器,可将 Markdown 转换为虚幻富文本。这意味着更新日志现在格式正确,并在菜单中精美显示:

游戏菜单更新日志控件显示标题和粗体文本

不再有纯文本或奇怪的断裂标签!

修复河流​

这快成传统了:时不时地,我们的河流(或一般的水)会完全出问题。 😅

很长一段时间以来,一个视觉漏洞导致河流看起来完全破碎,除非你手动保存设置。这影响了每张地图上的每条河流,直到现在我们都没能找到可靠的修复方法。

但我们成功实现了一个变通方案来缓解这个问题!所以河流可以再次正常流动,没有故障性的渲染缝隙。

UI 响应性​

我们修复了几个在非 16:9 宽高比(如 4:3 或 16:10)下损坏的 UI 屏幕。资源库、设置、查找服务器、新游戏等现在都已修复!

现在一切应该在常见屏幕格式下正确缩放:

资源库屏幕在 4:3 下正常显示

资源库屏幕在 16:9 下正常显示

其他改进​

文件传输改造​

我们再次对文件传输系统进行了多项改进!我们大幅改造了内部系统以改进并行下载,修复了下载每个文件时发生的所有卡顿/停顿。

我们还提高了整个系统的健壮性,以防止崩溃并提高下载的稳定性!

Lua 内部栈​

我们对 Lua 实现进行了结构性改进,以确保 API 调用现在更像原生 Lua 函数调用。现在 API 调用期间会保留 Lua 栈,而以前它总是被清空。虽然以前这没有导致重大问题,但它阻止了钩子等工具在 API 调用时访问正确的栈信息。

相关问题#932

Lua 内部内存​

我们增强了 Lua 的内部内存管理,解决了垃圾回收器在卸载后未能正确清理环境和一些用户数据的问题,导致潜在的内存泄漏。

所有实体和环境现在都正确地从内存中清除,解决了以前导致文件和数据库保持打开甚至崩溃的问题。

防火墙警报​

Windows 防火墙弹窗

我们改进了 Steam 安装过程,在安装 nanos world 时自动将所有可执行文件添加到防火墙。打开特殊 WebUI 页面或启动服务器时不再有请求权限的弹窗!

致命错误​

我们修复了大量 Failed to send Message 致命错误,这些错误由于一个内部漏洞困扰了我们很长时间。它们发生在客户端和服务器,淹没了我们的日志和崩溃报告器。

结语​

这又是一个打磨和核心改进的月份,我一直完全专注于让 nanos world 及其所有内部系统尽可能稳定,目标是达到几乎没有崩溃或慢性问题的状态。在深入开发重大新功能并能够不受干扰地专注于它们之前,这个基础至关重要。

这些改进对于为游戏构建坚实的基础至关重要:流畅的游戏玩法、一致的行为和更少的漏洞。这种可靠性是赢得玩家和开发者信任、继续在上面工作和创作精彩内容的关键!

更多 GitHub 问题已解决,在我认为这轮整理完成之前还有几个计划处理。我们新的内部崩溃处理实现已被证明非常有效,它为我解决一些罕见错误和崩溃提供了宝贵的见解。如果你遇到崩溃并知道如何复现,请告诉我们!这大大加快了修复它们的时间!

幕后已经有很多令人兴奋的事情正在开发中,我一直在获得大力支持,这将使我能够很快带来惊人的更新。

感谢大家这个月的测试和打磨!另外,感谢所有向我的 Ko-fi 捐款的人,你们的支持意义重大,帮助这一切继续下去!下个月见!! 😄

Ko-fiKo-fi

5 月:大整理

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

大整理!大量修复和改进!

欢迎阅读我们上个月最新更新的汇总!

新的本地事件行为​

我们正在为一些事件引入新的行为。现在由客户端触发的操作(例如更改视图模式)执行某种事件(例如 ViewModeChange)时,其事件将立即在首先触发它的客户端上被调用。

这意味着如果你正在控制一个角色并按下 V(切换 ViewMode),或者按下 Shift(奔跑),你将立即在客户端上收到相应的 ViewModeChange 或 StanceModeChange 事件,之后才会在服务器上调用并与所有玩家(包括你)同步。

所有已实现此新行为的事件如下:

提示

将来会添加更多事件。

相关问题#779。

缆绳系统重做​

新缆绳约束与道具配合工作

nanos world 中的缆绳曾一度处于粗糙状态:物理效果奇怪,臭名昭著的“病毒错误”正在蔓延,它们的行为不像真正的绳索,视觉表示与实际应用的约束不匹配。

但现在,经过深度重构和大量底层改进,我们自豪地说:缆绳终于再次棒极了!它们现在的行为完全符合你对现实缆绳或绳索的期望! 🎉

我们还围绕它们引入了其他几项改进。一些亮点:

  • 为 Cable:SetCableSettings() 添加了对新参数的支持:enable_stiffness。
  • 改进了错误日志记录,现在显示实体名称和 ID,使调试更容易。
  • 拾取可拾取物现在会自动分离任何附加的缆绳,尝试将缆绳附加到非模拟物体将抛出错误(因为虚幻引擎不喜欢这样)。
  • 调整载具或武器的大小将不再破坏缆绳物理。

相关问题#975、问题#992 和问题#993。

AI 改进​

MoveTo​

Pawn:MoveTo() 系统进行了大量改进,以确保更高的一致性和可靠性,尤其是在事件处理方面。

之前,我们遇到了一个问题:单次 MoveTo 调用会触发多个 MoveComplete (Pawn) 事件,以及不同步和移动数据在会话之间无法正确持久化的问题。

现在,每个 MoveTo 调用都与一个唯一 ID 关联,这在内部有助于跟踪移动是否已完成,防止重复的 MoveComplete 调用。

我们还修复了如果在移动过程中玩家重新连接,MoveTo 不会恢复的情况。

此外,我们修复了 MoveTo 值现在正确同步到客户端的问题,允许你通过服务器和客户端的脚本访问移动数据,并添加了一系列调试和详细日志以帮助调试你的 AI 实现。

相关问题#714。

AI 载具避让​

NPC 反应并远离载具

我们改进了 AI 角色与载具的交互方式!

由于我们的布娃娃系统的工作方式,我们必须禁用载具和角色之间的碰撞,以防止载具在撞到角色时突然停止,这样当载具与角色重叠时,布娃娃模式被激活,载具在物理模拟期间只撞击布娃娃网格体。

然而,这有时会导致角色穿透载具。

为了缓解这个问题,我们实现了一个新系统,当载具靠近时自动将角色推开。如果载具高速移动,布娃娃会按预期触发,产生更自然和真实的反应!

备注

请注意,仍然可能遇到角色穿透载具的情况,但现在已大大缓解。

相关问题#672。

道具抓取​

更平滑的软道具抓取物理模拟

我们正在对道具的抓取方式进行一些实验性更改,之前我们使用“硬约束”,在角色抓取道具时不惜一切代价移动道具,使得被抓取的道具物理在某些情况下变得疯狂和闪烁。

因此我们决定改为使用“软约束”,这将使它们在被抓取时物理上更准确,甚至如果你没有正确抓取或距离太远,可能会失去它。

我们正在测试这种新方法,看它是否效果良好。我们还在抓取的最大距离和位置上做了几项改进,使其更加真实。

相关问题#711。

观战回来了!​

我们的观战模式(Player:Spectate())已被搁置了一段时间,一些开始出现问题:例如相机附着不正确(在第三人称时它附着在脚上),在第一人称时武器显得僵硬无响应,没有准星或血屏同步。

我们现在已经修复了所有这些问题,并在观战时实现了准星和血屏效果的正确同步!

还有更多工作要做,但这是让观战模式完全重回正轨的初步第一步!

相关问题#978。

游泳移动​

游泳方向受相机影响

我们为游泳机制添加了一个小而酷的改进:现在你的相机角度将影响角色的游泳方向,允许你根据所看的方向向上或向下游(除了现有模式之外)!

更好的浮筒​

一个重大变化是浮筒的计算:这些是不可见的球体,用于模拟浮力并使物体在水中漂浮。我们改进了浮筒的生成和附着方式,在各种实体尺寸和重量下实现了更好的漂浮行为。

相关问题#958。

AI 游泳​

NPC 在水面游泳

现在 NPC 将始终游向水面,而不是像以前那样无休止地潜入海底。

相关问题#891。

其他水体修复和改进​

我们还修复了一些漏洞:

  • 之前在水下抓取道具会使道具物理变得疯狂,我们已经修复了这个问题,道具在水下时将被更正确地抓取。
  • 我们修复了手榴弹完全没有浮力的问题,现在将正确漂浮。

文件传输​

我们的文件传输系统随着时间的推移经历了许多改进和 overhaul,我们进一步改进了它!

现在,每个文件下载后,客户端将校验其完整性以确保在传输过程中没有损坏,有助于防止不一致。如果有任何文件下载失败,日志现在将列出哪些文件失败或仍在等待,有助于调试。

我们还重构了部分服务器端逻辑,试图消除一个罕见的漏洞,即在游戏过程中文件数据包可能被发送给漏洞的玩家,导致致命漏洞日志。

相关问题#947 和问题#946。

包加载/重载​

我们对包重载系统进行了重大改进。之前,在快速连续触发多个 package load/reload/unload 操作的极端情况下,你可能会看到控制台错误,如 "Package not found to HotUnload",甚至包加载和卸载方式不一致。

为了解决这个问题,我们实现了一个排队系统,确保所有加载/重载/卸载请求按顺序(并以独特方式——例如在 load/reload 之后调用 unload 将从加载列表中移除包)处理。

它防止任何包被顺序处理多次,特别是在文件传输仍在进行时。这解决了在运行时包重载期间发生的几个错误和问题。

我们还修复了一个常见的客户端问题,即执行 package reload all 时找不到“默认地图”包。

相关问题#968。

布娃娃同步​

布娃娃位置和旋转正在联网

自从最近的虚幻引擎更新以来,布娃娃同步变得过于僵硬,导致奇怪的移动。因此我们对其进行了调整,使其在向其他玩家联网时同步更平滑、更自然。

此外,我们改进了旋转同步,显著减少了布娃娃站起来时可能发生的那些生硬的“急转”旋转(从其他玩家视角看)。

备注

布娃娃同步始终是一项技术挑战,向其他玩家同步永远不会像本地发生时那样自然,但在处理布娃娃时我们尝试实现尽可能最好的网络同步。

其他改进​

角色坠落​

角色原地坠落

那个臭名昭著的问题,即角色会随机原地坠落,困扰了我们多年,我们终于找到了罪魁祸首并修复了它!

相关问题#809。

道具网络主控​

爆炸影响非网络主控道具(标记为白色)

我们改进了道具的网络主控处理方式。之前,如果不是网络主控向道具射击或投掷手榴弹,它根本不会反应,只有主控才能影响它。

现在,系统正确地将网络主控转移给造成伤害的玩家(如射击或投掷手榴弹),使道具在受损时按预期飞走。

武器射速​

我们改进了不同帧率下的武器射速,修复了不一致的射击速率。

我们通过用上一帧所花费的时间来补偿射击之间的冷却时间来实现这一点,之前没有考虑到这一点。

提示

请注意,在极低 FPS 的情况下,武器仍将受到 FPS 的限制。我们始终建议将武器射速值设置为至少 0.05,这将确保即使是在 20 fps 的人也能正常射击。

相关问题#730。

日志覆盖​

我们修复了一个问题,即当日志从单独的异步线程写入时,异步日志覆盖了控制台和日志文件中的其他日志条目。

现在,所有日志都正确地同步并按顺序追加,确保它们不会重叠。

启用的新插件​

我们启用了两个新插件:CommonUI 和 ModelViewViewModel 供 UGC 使用。

结语​

本月主要是修复长期存在的问题、改进现有系统并进行一些良好的老式整理。

我们的 GitHub Issues 已经被搁置了相当长一段时间,很多报告都积灰了,并且长时间未得到解决。所以这个月我决定清理它:我浏览了几乎每一个问题,关闭过时的问题并处理仍然相关的问题。

我很自豪地说,这个月我成功处理了 40 多个问题!大多数相关的都得到了适当的修复,少数被移到了反馈板,因为它们更多是关于缺失的功能而不是实际的漏洞。我的计划中还有更多问题即将处理,我的目标是达到零未解决问题!

通过这次清理,我们正式通过了 1,000 个已关闭问题的里程碑(其中大部分已正确修复)! 🎉 我们甚至还没有计算在 Discord 上随意报告的许多漏洞。

GitHub 问题计数达到 1000 个已关闭问题

还有很多我想改进的地方。游戏的一些技术部分尚未达到我希望的质量水平,我们正在进行许多内部结构和组织变革,将继续进一步改进 nanos world!

啊,如果你发现任何漏洞,请在我们的 GitHub Issues 上发表,如果你有改进建议或希望看到的新脚本功能,请把它们放在我们的反馈板上!

非常感谢大家的全力支持!幕后还有大量工作正在进行,我们尚未宣布。所以请继续关注,因为更多令人兴奋的东西即将到来!

Ko-fiKo-fi

4 月:性能与优化!

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

性能与优化!

欢迎阅读我们上个月最新更新的汇总!

脚本改进​

以下是本月的脚本改进!

AI 避障方法​

Epic 的 RVO 视频示例

这是社区的要求,我们新增了一个方法来控制角色的 RVO(互惠速度障碍)。

这是一个 AI 系统,通过基于周围其他 NPC(或 RVO 角色)进行额外计算来确定 NPC 的速度和方向,使它们在移动时避免相互碰撞。

我们默认启用了此功能,但通过新方法 Pawn:SetAIAvoidanceSettings() 提供了按需禁用它的方式,以允许自定义此行为。

Esc 键覆盖​

你们中的许多人要求更好地处理 Esc 键,尤其是菜单导航方面。我们现在可以在脚本中注册 Esc 键了。

Input.Bind("Menu", InputEvent.Pressed, function()
-- 使用示例代码
if (is_my_menu_open) then
CloseCustomMenu()
return false
end
end)

如果玩家持续按住 ESC 一段时间,游戏菜单仍会照常打开,确保他们不会被困在你的服务器中。

DLSS 4 完整集成​

最近我们将 DLSS 集成升级到了最新的 DLSS 4,为现有技术带来了大量改进以及新功能多帧生成(尽管仅支持新的 RTX 50)。

为了跟上进度,我花时间完成了 nanos world 中 DLSS 的集成,因为我们之前只支持超分辨率和帧生成(2x)设置。

所以我们现在完全集成了:

新的 DLSS 与 Reflex 设置

超分辨率​

所有 DLSS 超分辨率设置现在完全集成到界面中。启用 SR 将自动禁用分辨率缩放和抗锯齿,因为 SR 内部处理这些。

你可以通过比较超级性能模式(仅建议 8K 分辨率使用)和关闭时的性能差异:

DLSS SR 关闭
DLSS SR 开启(超级性能)
DLSS 超分辨率 (SR) 超级性能模式对比

帧生成​

我们已将帧生成正确集成到 UI 中(需要关闭垂直同步并开启 Reflex)。也支持多帧生成。如果你有 RTX 50,请告诉我们对你的效果如何! 😅

你可以在对比中看到,它几乎使呈现的帧数翻倍(我们将其显示在单独一行,因为它只使呈现的帧翻倍——而不是游戏帧):

DLSS FG 关闭
DLSS FG 开启(2x)
DLSS 帧生成(2x)对比

光线重建​

这是一个新的集成,可改善复杂光照和阴影场景中的图像质量,你可以看到启用后阴影伪影消失,注意它有一点性能开销:

DLSS RR 关闭
DLSS RR 开启
DLSS 光线重建 (RR) + DLSS 超级性能对比

锐度​

我们还新增了一个滑块,如果需要可以调整 DLSS 锐度。

Reflex 低延迟​

Reflex 低延迟减少输入延迟,使游戏手感更流畅、响应更灵敏,你可以看到输入延迟的差异:

Reflex 关闭
Reflex 开启
Reflex 关闭 vs 开启对比

崩溃与 Sentry​

与任何开发中的游戏一样,崩溃会发生,但我们需要了解它们才能修复它们。你可能以前遇到过虚幻崩溃报告器屏幕,但我们现在集成了一套新的 SDK,通过新的 Sentry 虚幻插件来捕获崩溃。

Sentry 是一个记录游戏崩溃、致命错误和上下文信息的工具,并将其发送到我们自己的服务器。

我们之前已经在客户端和服务器上使用了 Sentry,但现在我们更原生地将其集成到客户端,帮助我以更有用的信息跟踪和接收游戏崩溃和错误。

通过这个新集成,我们摆脱了那个通用丑陋的虚幻崩溃报告器,目前我们有了这个新的另一个丑陋的弹窗,在崩溃发生时显示:

游戏崩溃后显示的新崩溃弹窗

我们现在能够获得更丰富和上下文相关的信息,更有助于追踪崩溃的真正原因。无需那么多地不断询问可复现步骤。

性能分析​

虚幻有一个很棒的工具叫做 Unreal Insights。它是一个遥测工具,捕获并分析游戏的每一帧,准确告诉我们瓶颈以及哪些方法造成瓶颈。

我开始使用它是因为发现 nanos world 存在一些瓶颈,我找到了很多,帮助修复了几个性能问题:

Unreal Insights 应用程序剖析 nanos world 帧

性能分析调试​

我改进了性能分析调试部分,现在它显示每个操作每秒花费的时间、调用次数、每次调用的平均时间以及最后一秒内操作的最大耗时(峰值)。

此外,我挂钩了虚幻的计时,还显示虚幻全局 Tick 和 Slate Tick 时间:

新的“帧时序”部分显示帧、游戏、渲染、RHI 和输入时间
还有“性能分析”部分,包含新的时序列和新的虚幻条目(世界 Tick 和 Slate Tick)

FPS 时序​

我集成了我们自己的面板来显示 FPS 和时序,取代了虚幻的绿色覆盖层。这可以在调试设置中的新下拉菜单中激活:

新的帧时序设置

正如你在上面的性能分析调试中看到的,现在你可以看到游戏中运行的所有时序和线程:

  • 游戏:主执行线程(虚幻 Tick、计时器、网络、Lua 代码、UI 等)运行帧所花费的时间。
  • 渲染:渲染线程为 RHI 线程准备命令所花费的时间
  • RHI:(渲染硬件接口)DX11 或 DX12 线程向 GPU 发送操作所花费的时间。
  • GPU:GPU 渲染帧所花费的时间。
  • 输入时间:按下输入与游戏响应之间的延迟。

游戏线程将始终等待其他线程完成(等待赶上渲染线程落后的一到两帧),因此你可以通过分析哪个时序等于帧时间来确定你的游戏模式瓶颈在哪个线程。

提示

你可以在 Epic 的文档页面线程概述中了解更多关于这些时序和虚幻线程的信息。

游戏性能++​

得益于 Unreal Insights 和新的性能分析时序,我成功识别并修复了我们遇到的几个性能问题:

控制台冻结修复​

控制台打开时不再卡顿!我们曾遇到使游戏冻结数秒的情况,但现在已修复!

测试地图导航网格体​

一段时间以来,我们的 default-testing-map(已经有些年头了 😅)开始表现非常糟糕。 FPS 不太好,我们可以清楚地看到 GPU 没有被充分利用(我们有主线程(CPU)瓶颈)。

通过分析帧,我发现罪魁祸首是它的导航网格体每帧都在重新计算(因为我们使用动态导航网格体生成),在游戏线程上花费了巨量时间。

然后我最终发现原因是地图中的一些物体导致了这一点:

那个静态船​

测试地图船舱中的静态船

这艘船只是地图中启用了浮力的角色,但它启用了“甚至能影响导航”设置,导致其周围所有导航网格体每帧都被重新计算。

道具​

道具不再影响导航网格体

另一个也在影响导航网格体的逐渐增多的实体是道具。它也启用了影响导航开关,当地图中有大量道具时性能被急剧消耗。

当然这可能会造成一些缺点,比如 NPC 穿过道具并将它们踢开,但性能提升是不可估量的。此外我正在研究添加新方法以编程方式启用/禁用道具影响导航网格体的可能性,所以如果你真的需要,可以按道具启用。

这个修复绝对是一个巨大的改进,现在在测试地图上游玩流畅多了非常明显。

提示

这些改进不仅会改善测试地图,还会改善游戏中的所有其他地图,包括你的!

测试地图阴影​

我们遇到的另一个问题是测试地图的光照/阴影,我们为所有草地网格体启用了动态阴影,这通常是一个糟糕的决定,因为它消耗大量 GPU 性能。

所以我将所有草地阴影改为使用接触阴影方法,它效率高得多,视觉效果非常相似:

之前(动态阴影)
之后(接触阴影)
之前(开启动态阴影)和之后(开启接触阴影)聚焦草地的对比

此外,我们的火把在靠近时导致巨大的 FPS 损失,你可以看到直视它时花费了近 4ms。

通过改用接触阴影,我们注意到巨大的性能提升(阴影深度通道从 ±4.35ms 降至 ±2.26ms),释放了大量 GPU 使用:

之前(动态阴影)
之后(接触阴影)
靠近火把时的性能对比

角色 Tick​

此外,我发现在游戏 tick 中,有很多角色和组件每帧都在 tick,即使它们未被激活或使用,这占据了主线程帧时间的相当大比例。

仅举几个例子:

  • 武器一直启用了多个 Tick,用于计算血液防抖或射击节奏等,现已改进为仅在我们拾取武器时才激活它们。
  • Pawn(Character 与 CharacterSimple)有大量组件和其他网格体处于活动并 tick 状态,例如非主控玩家的降落伞或物理手柄,所以现在根据需求按需启用/禁用。

在其他小改动中,性能和优化现在进一步改善,允许同时生成更多实体。

测试地图改进​

其他测试地图改进:

火把开/关​

旧的昼夜火把系统已修复,现在它根据一天中的时间自动开启/关闭。

它通过挂钩 Ultra Dynamic Sky 的时间来检测是白天还是夜晚。

环境音效​

旧的环境音效也已修复并重新放置,根据一天中的时间自动循环白天和夜晚的声音。

减少树木​

我减少了测试地图中的树木数量,因为某些区域树木导致视觉清晰度差,甚至对性能产生负面影响。

次要荣誉提名​

一些小的改进:

主菜单现在上限为你的显示器刷新率(之前上限为 120)。

虚幻更新 5.4.4​

虚幻版本已更新至最新补丁版本 5.4.4,此更新中不应有任何烘焙资产损坏。

结语​

这个月对优化爱好者(像我)来说是一次巨大进步,解决了多个低层和高层性能问题,更不用说新的 DLSS 功能为一切增加了另一层优化。

衷心感谢每一位为达成我们的“让开发者保持清醒基金” Ko-fi 目标 做出贡献的人 ☕!你们绝对震撼了!你们的支持让这个项目蓬勃发展,也让我保持咖啡因充足。 😅

另外,由于 Ko-fi 捐款会随时间累积,我已将其更新为“按月”目标。

幕后有很多东西正在酝酿,一些大事即将到来™!一如既往,感谢你参与这段旅程! 💙

下次见!

Ko-fiKo-fi

3 月:全新路线图与咖啡!

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

新路线图与咖啡!

欢迎阅读我们上个月最新更新的汇总!

新路线图!​

隆重介绍……我们全新的官方**路线图**页面!

路线图页面

我自豪地呈现我们的新路线图页面,让大家了解 nanos world 的未来计划。此页面还编目了所有过去已实现的功能,是回顾我们进展的好方式!

路线图分为四个部分:

  • 🎯 计划必备功能:游戏发布所需的不可协商功能
  • 👍 计划应有功能:将改善游戏但对发布不关键的重要新增内容
  • 💭 分析中的功能:正在审查中的理想功能,不保证会开发
  • ✅ 所有已发布功能:游戏中已可用的已完成功能

你还可以点击每个功能查看更多详情:

路线图功能描述

这只是初始版本,将持续更新新的计划和过去的功能(肯定有一些被遗忘了)。

我再次邀请所有对新功能有想法的人,请在我们的反馈中分享,因为它们很可能会被纳入我们的路线图!

🛣️ 功能与路线图https://docs.nanos-world.com/roadmap

请我喝杯 Ko-fi​

在过去的几年里(+5),我将热情和无数小时倾注于开发 nanos world。这是一段由奉献精神驱动的旅程,而且不可否认,还有相当数量的咖啡!

信息

不确定你们中多少人知道,但我非常热爱意式浓缩咖啡,我就是那种用花哨技巧尽可能把咖啡冲得漂亮的人,我还有所有那些来自速卖通的不必要的配件来制作意式浓缩! 😅

我在冲泡意式浓缩咖啡

所以,如果你喜欢 nanos world 并希望支持我和它的持续开发,我建立了一个 Ko-fi 页面,一个你可以真正给我买咖啡的网站。

捐助完全是自愿的,没有任何义务,但深表感谢!你可以随时请我喝一杯 ☕ 咖啡(或更多)!

此外,如果你想持续为我的工作做贡献,还有定期会员选项:

Ko-fi 会员等级
  • ☕ 单杯浓缩:小额定期捐助,就像每月买一杯咖啡。
  • ⭐ 咖啡供应商:对支持我和 nanos world 的更大承诺,并获得一个特殊的 Discord 角色作为感谢!
Ko-fiKo-fi

脚本改进​

虽然这个月主要精力放在组织我们的路线图上,但我们在脚本方面也有一些改进!

PlayerConnect 事件​

你们的需求被听到了!这确实是社区中的一个常见问题,我们为你提供了解决方案:

之前,当玩家尝试连接时,服务器仅通过 PlayerConnect 接收基本的连接事件。并可以选择返回 false 来阻止他们。

现在,我们引入了两个新方法,可以从 PlayerConnect 事件内部调用:

提示

这些新方法可以在代码中的任何地方使用,不仅限于该事件内部!

IsPackageLoaded()​

我们为客户端和服务器引入了一个新方法:.IsPackageLoaded(),用于获取包当前是否已加载。

合并的方法​

我们对 Pawn 和 Character 方法进行了一些改进:

Actor.GetSocketTransform()​

Character.GetBoneTransform() 方法现已弃用,建议使用新的 Actor 方法 Actor:GetSocketTransform()。

此方法现在适用于所有拥有网格体的 Base Actor 类(Character、CharacterSimple、Base Vehicle、Weapon、StaticMesh、Prop 等)!

Pawn.GetCapsuleSize()​

方法 Pawn:GetCapsuleSize() 正在移至 Base Pawn 实体,以更有组织的方式使 Character 和 CharacterSimple 都可使用!

文档改进​

文档导航栏得到了完善,将外部链接(问题、账户等)转换为图标并移至右侧。现在,左侧只保留内部导航标签。

新的文档导航栏

更新日志​

我们的更新日志页面也得到了改进!我们添加了一个新的 Markdown 渲染器来正确格式化我们的更新日志注释,使其更易阅读:

新的文档更新日志 Markdown 渲染器
📃 更新日志https://docs.nanos-world.com/changelog

结语​

这个月一切都是关于组织整理!我把重点放在了路线图上,安排了 nanos world 的所有未来目标,还花了一些功夫收集所有过去的更新及其时间线,创建了一个很酷的功能历史记录,尽管还有一些遗漏的内容会在想起来时添加,以保持其更新。

我还推出了 Ko-fi 页面,作为一种简单且可选的方式,供那些想要支持我和 nanos world 的人使用。这是一种保持动力流动的好方式,同时给你们——社区——另一种参与的方式!

幕后也有很多事情在发生,新功能正在开发、测试和完善中。我将在未来的博客文章中推出更多令人兴奋的更新,敬请期待!一如既往,非常感谢所有支持,你们太棒了!

2 月:更多性能分析与更好的插值!

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

新的性能分析工具与更好的插值!

欢迎阅读我们上个月最新更新的汇总!

虚幻引擎 5.5​

Epic 终于发布了期待已久的虚幻引擎热修复 5.5.2!在 1.71.0 更新中,nanos world 也已更新到虚幻引擎 5.5!

Steam 分支 bleeding-edge 现在运行在 5.5 上,而 main 目前仍保持在 5.4。我们强烈建议你尽快更新你的资产以确保兼容性!

新的性能分析工具​

我们为性能分析工具集引入了多项新功能和改进!

网络统计信息​

我们实现了一项新的性能分析功能,显示游戏会话期间每个类使用的网络数据量:

客户端网络统计信息显示本次会话中每个类的累计字节使用量

在服务器端,每分钟将输出一条调试消息,提供发送和接收字节数的详细信息:

服务器性能分析显示过去一分钟的网络统计信息

要在客户端启用此功能,请同时打开 性能分析 和 在屏幕上显示网络统计信息 设置。

对于服务器,请使用 --profiling 命令行标志启动。

网络调用​

通过启用游戏内性能分析,你现在可以查看调用单个类方法所花费的时间:

客户端屏幕性能分析网络现在显示网络调用时间

网络插值卡顿​

最近的虚幻引擎更新导致在糟糕连接场景下网络插值出现问题。每次丢包或小延迟都会导致可见的卡顿或顿挫,如下面的视频所示:

旧插值偶尔丢包,导致卡顿/顿挫

我们显著改进了客户端插值/外推系统,即使在弱连接下也能防止这些卡顿:

新插值有丢包但无卡顿/顿挫

此改进目前适用于角色移动。我们计划很快™重新审视基于物理对象的插值。

缓存的资源库 API​

我们为资源库实现了一个实验性缓存系统,因为我们知道目前加载资源库资产极其缓慢,所以我们实现了一个中间缓存系统,大大加快了资源库请求:

资源库加载时间减少到一秒
备注

由于这是一个缓存系统,结果会以频繁的速率在内部更新,在资源库中更新内容并在游戏中看到它时会有几秒钟的延迟。

文档改进​

服务器安装​

我们更新了服务器安装页面,修订了在 Linux 上设置 nanos world 服务器的最低操作系统要求。

API 参考弹出窗口​

我们通过一个新组件增强了文档,该组件在悬停时显示详细的方法和事件信息,改进了教程和示例:

新资产缩略图​

我们更新了所有资产缩略图照片并修复了缺失的图片:

沙盒生成菜单所有缩略图已更新

加载屏幕改进​

异步回调​

“等待异步回调”步骤现在显示待处理任务的数量:

平滑进度​

此外,现在进度条平滑更新,而不是在数值之间跳跃。

更新的依赖项​

我们更新了内部依赖项以确保稳定性和性能:

  • CEF 更新到版本 132。
  • Ultra Dynamic Sky 插件更新到版本 8.6——请确保也更新你的。

启用的插件​

我们启用了 MotionTrajectory 插件,供你在 UGC 项目中使用。

结语​

希望你喜欢本月的更新!

我正在整理更清晰的开发路线图,并重组项目的某些部分,使一切运行更加顺畅。令人兴奋的事情即将到来,我迫不及待地想尽快分享更多!

非常感谢大家一直以来的支持和反馈。这真的让我保持动力。下个月请继续关注更多精彩更新!