识别性能问题通常意味着深入分析以下三类之一:帧率(计算)、内存或加载时间。
Roblox 提供了多种工具来识别性能问题,其中一些在 Roblox 客户端(因此也在 Studio 中)可用,而另一些仅在 Studio 中可用。虽然您可以直接观察客户端行为,但必须使用工具来诊断服务器问题。
诊断工具
| 工具 | 描述 | 位置 | 键盘快捷键 | 环境 |
|---|---|---|---|---|
| 开发者控制台 | 一个具有实时日志消息、错误和内存、网络及脚本性能详细信息的控制台。它对于查看内存消耗、关键服务器健康统计、脚本性能统计以及启动客户端或服务器 MicroProfiler 非常有用。 | Studio 游戏中 | F9 | Studio 测试 实时会话 |
| MicroProfiler | 一个调试工具,分解每帧花费多少计算时间在任务上。它可以生成分析转储,显示单个帧的精确分解,有助于识别导致性能问题的特定任务。您可以在客户端或服务器上运行分析器,具体取决于哪个方面存在问题。 | Studio 游戏中 | CtrlAltF6 (⌘⌥F6) | Studio 测试 实时会话 |
| 场景分析 | 提供有关客户端和服务器场景使用的资源以及哪些实例负责该资源使用的快速比较信息。 | Studio | N/A | Studio 测试 |
| 性能统计 | 一个工具栏,显示基本性能统计信息,包括内存消耗、CPU、GPU、发送和接收的网络数据以及延迟时间。 | 游戏中 | CtrlAltF7 (⌘⌥F7) | Studio 测试 实时会话 |
| 调试统计 | 覆盖详细的图形、物理、网络流量和 FPS 信息。 | Studio 游戏中 | ShiftCtrlF1 (Shift⌘F1), ShiftCtrlF2 (Shift⌘F2), ShiftCtrlF3 (Shift⌘F3), ShiftCtrlF4 (Shift⌘F4), ShiftCtrlF5 (Shift⌘F5) | Studio 测试 实时会话 |
| 网络模拟 | 模拟现实世界网络条件(如延迟、抖动和数据包丢失)以进行连接的游戏测试的属性。 | Studio | AltS(⌥S) | Studio 测试 |
| 性能仪表板 | 一个仪表板,实时显示客户端和服务器内存使用情况、客户端帧率、服务器心跳和崩溃率的汇总图表。它有助于分析随时间变化的性能模式。请参见 监控性能。 | 创作者仪表板 | N/A | 实时会话 |
服务器计算
所有游戏的服务器心跳限制为 60 FPS,因此较低的值可能表示性能问题。要检查服务器心跳:
使用 开发者控制台 - 在 服务器作业 选项卡中,展开 心跳 行并检查 每秒步骤 值,该值表示您游戏的心跳。
使用 MicroProfiler,您可以检查图表以查看帧是否花费超过 16.67 毫秒。
服务器心跳下降的另一个症状是延迟增加(通常称为 ping)。服务器每帧完成计算任务所需的时间越长,处理从客户端发送和接收的网络数据所需的时间就越长。要检查连接到服务器的所有玩家的平均 ping,请转到 开发者控制台 中的 服务器统计 选项卡。
如果在您 改善性能 后服务器心跳仍然较低,您的游戏可能需要比其服务器默认获得的更多 CPU。您可以通过 扩展计算服务 来保留更多。
客户端计算
默认的客户端帧率上限为 60 FPS。然而,用户可以在 Windows 上将其帧率上限提高到 240 FPS。
不同设备之间的帧率差异很大。例如,高端 PC 可能能够“强行解决”计算问题,仅体验到微不足道的帧率下降。如果您 在低端设备上测试,问题往往更严重,因此更容易注意到。
要检查您游戏的帧率:
在客户端中,按 ShiftF5 显示调试统计摘要。
从 Studio 的 窗口 ⟩ 性能 菜单中,切换打开 统计 以启用调试统计。
使用 MicroProfiler,您可以检查图表以查看帧是否花费超过 16.67 毫秒。
服务器内存
尽量将服务器内存使用保持在 50% 以下。总服务器内存使用以下公式计算:
6.25 GiB + (100 MiB * 最大连接玩家数)
例如,连接 30 名玩家的服务器总内存约为 9.18 GiB。服务器在玩家连接时会增加内存,但在玩家断开连接时 不会 减少内存。如果 10 名玩家离开,服务器仍然拥有 9.18 GiB 的内存,而不是缩减到 8.2 GiB。
当服务器关闭时(例如,当它们为空或作为 更新过程 的一部分),其替代品将从基本内存量开始,并在玩家连接时开始增加。
客户端内存
检查游戏内存使用情况有几种方法:
- 打开 开发者控制台 并切换到 内存 选项卡。此选项卡提供内存分配的详细信息。使用客户端而不是 Studio 以获得最准确的读数。
- 在客户端的设置菜单中启用 性能统计 视图,以查看总客户端内存使用情况的覆盖。
高内存使用并不一定表示存在问题,但一些需要您进一步调查的迹象包括:
- 在 性能仪表板 中显示的客户端崩溃的显著百分比,特别是与更新同时出现的突然增加。某些崩溃是预期的,但如果您的崩溃率超过 2-3%,您应该进行调查。
- 在您希望游戏支持的设备上测试时发生崩溃。
游戏在客户端的内存消耗中,资产(如图像、网格和音频文件)占据了相当大的一部分,这些资产被加载到内存中。在开发者控制台中,检查 PlaceMemory 下的以下标签:
- GraphicsMeshParts - 网格消耗的图形内存。
- GraphicsTexture - 纹理消耗的图形内存。
- Sounds - 音频文件消耗的内存。
加载时间
加载时间,也称为加入时间,是从玩家点击 播放 到世界渲染并开始游戏的总时间。在客户端连接到服务器后,加入过程按以下顺序进行:
- ReplicatedFirst 复制到客户端,任何自定义 加载屏幕 在此处出现。
- 玩家角色加载。加载时间在加载屏幕消失并开始渲染世界时结束。
知道哪个步骤较慢有助于您选择影响最大的优化。有关常见原因和修复,请参见 改善性能。
没有内置工具可以检查加载时间,但由于它们不需要毫秒级的精度,通常只需一个秒表即可了解您当前的基线并检查您是否进行了实质性改进。您可以在 ReplicatedFirst 中使用客户端脚本来了解您的更改如何影响加载时间,但该脚本并未提供完整的端到端测量。它在 ReplicatedFirst 复制后开始计时,并在初始复制完成并触发 DataModel.Loaded 时停止,因此不包括连接到服务器或加载角色的时间:
local startTime = os.clock()
game.Loaded:Connect(function()
local loadTime = os.clock() - startTime
local roundedLoadTime = math.round(loadTime * 10000) / 10000 -- 四位小数
print("游戏加载时间为 " .. roundedLoadTime .. " 秒。")
print("加载的实例数量: " .. #workspace:GetDescendants())
end)为了获得更多见解,请在 Studio 设置 的 网络 选项卡中启用 打印加入大小分解,以在您在 Studio 中启动游戏时打印按大小排序的前 20 个实例及按实例类型的百分比分解。
如果您的加载时间相对于游戏的明显大小意外地高,请检查您的地方是否存在未识别或混淆的脚本。一些来自创作者商店的免费模型包含生成数千个额外实例的脚本,这会显著增加玩家加入时必须复制的数据量。
在每次优化或更新之前和之后测量加载时间,以便您可以确认其影响并捕捉回归。突然增加通常意味着最近向 ReplicatedStorage 添加了内容,或者资产更改增加了下载大小。
Ping
Ping(延迟)的两个主要测量是 网络 ping 和 数据 ping。
网络 ping 是从客户端发送网络数据包到接收服务器的回声回复的往返时间。它类似于通用 ping 网络工具报告的 time。
网络 ping 在 性能统计 条中可见。它主要受客户端和服务器之间网络路径长度的影响,超出您的控制范围。然而,您可以在 Studio 中进行游戏测试时使用 网络模拟 来模拟 ping 和其他网络条件。
数据 ping 是从客户端通过复制系统可靠发送数据到接收来自服务器复制系统的回声回复的往返时间。它包括在客户端和服务器的复制队列中花费的时间,以及丢失或损坏数据包的 TCP 类重传。
数据 ping 类似于从客户端发送可靠的远程事件,在服务器上接收它,然后从服务器向客户端发送可靠的远程事件作为响应。由于数据 ping 还包括客户端和服务器之间网络上花费的时间,因此它大于或等于网络 ping。
连接到服务器的所有玩家的平均数据 ping 在开发者控制台的 服务器统计 选项卡中可见。单个客户端的数据 ping 可以使用 ShiftF3 显示网络调试统计信息。
数据 ping 受网络路径和复制队列延迟的影响。当服务器生成的复制数据比网络发送的速度快(或比客户端处理的速度快)时,数据必须在复制队列中等待。由于网络重传和 Roblox 应用程序处理网络数据的方式,数据 ping 和网络 ping 之间的某些差异是正常的。然而,如果数据 ping 显著高于网络 ping,请使用 MicroProfiler 查看网络流量。有关优化建议,请参见 网络和复制。