识别性能问题通常意味着深入到三个类别之一:帧率(计算)、内存或加载时间。
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,请进入 开发者控制台 的 服务器统计 标签。
客户端计算
默认的客户端帧率上限为 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 中使用客户端脚本,以了解您的更改如何影响加载时间,但该脚本无法提供完整的端到端测量:
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 个实例及根据实例类型的百分比细分。
Ping
Ping(延迟)的两个主要测量值是 网络 ping 和 数据 ping。
网络 ping 是从客户端发送网络数据包到收到服务器回显回复的往返时间。它类似于一般目的 ping 网络工具报告的 time。
网络 ping 在 性能统计 条中可见。它主要受客户端和服务器间网络路径长度的影响,超出您的控制范围。然而,您可以使用 网络模拟 在 Studio 中进行游戏测试时模拟 ping 和其他网络条件。
数据 ping 是从客户端通过复制系统可靠发送数据到收到来自服务器复制系统的回显回复的往返时间。它包括在客户端和服务器的复制队列中所花费的时间,以及因丢失或损坏的数据包的 TCP 类似重传。
数据 ping 类似于从客户端发送可靠的远程事件,在服务器上接收它,然后从服务器响应客户端发送一个可靠的远程事件。由于数据 ping 还包括客户端和服务器之间网络所花费的时间,它大于或等于网络 ping。
所有连接到服务器的玩家的平均数据 ping 在开发者控制台的 服务器统计 标签中可见。通过 ShiftF3 显示网络调试统计信息,可以查看单个客户端的数据 ping。
数据 ping 同时受到网络路径和复制排队延迟的影响。当服务器生成的复制数据超过网络发送的速度(或超过客户端处理的速度)时,数据必须在复制队列中等待。数据 ping 和网络 ping 之间的一些差异是正常的,原因包括网络重传以及 Roblox 应用程序处理网络数据的方式。然而,如果数据 ping 显著高于网络 ping,请使用 MicroProfiler 查看网络流量。有关优化建议,请参阅 网络和复制。