关于 roblox-performance
roblox-performance 是用于诊断和改善 Roblox 游戏性能的开发技能,介绍分析工具及常见瓶颈,并提供服务器、客户端、内存、网络、渲染和物理方面的指导。
主要功能
- 01服务器与客户端性能分析工具
- 02诊断内存泄漏和帧耗时峰值
- 03Luau 热路径优化建议
- 04渲染、资源与物理优化建议
- 05Parallel Luau 使用指引
适用场景
- 01查找客户端 FPS 下降的原因
- 02排查内存增长或服务器延迟
- 03减少资源加载时间和网络压力
MCP 相关
README 提到通过 Studio MCP 使用 Scene Analysis,并关联 roblox-studio-mcp 技能进行性能分析和场景分析。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ el4cteo/ roblox-skills --skill roblox-performance安装后在 Claude Code 中输入/roblox-performance确认已加载。
附带文件references/profiling.md
详细介绍
Roblox 性能
优化前先测量。 确定瓶颈是服务器计算、客户端计算(CPU/GPU)、内存、网络还是加载时间,然后使用相应的工具。
工具
| 工具 | 打开方式 | 用途 |
|---|---|---|
| Developer Console | F9(游戏中) | 错误、按类别划分的服务器/客户端内存、网络、脚本活动。可在实时服务器中使用。 |
| MicroProfiler | Ctrl+Alt+F6(⌘⌥F6);服务器使用 Dev Console | 逐帧计时;尖峰;转储帧以查看详细信息。 |
| Script Profiler | Studio / Dev Console | 哪些函数消耗了 Luau 时间(采样)。 |
| Luau heap snapshots | Dev Console → Memory → Luau Heap | 查看哪些表/闭包/实例被保留,以及保留它们的对象(泄漏)。 |
| Scene Analysis | Studio | 脚本内存、未设父级的实例(泄漏)、实例组成、音频/动画内存、三角形数量。也可通过 Studio MCP 使用 SceneAnalysisService。 |
| Performance Stats / Debug Stats | Ctrl+Alt+F7 / Shift+Ctrl+F1–F5 | 实时 CPU/GPU/内存/网络叠加层。 |
| Network Simulator | Studio Device Simulator toolbar | 使用延迟、抖动、丢包进行测试(3G/4G/Wi-Fi 配置)。 |
| Performance dashboard | Creator Hub | 按设备统计的实时平均 FPS、服务器心跳、内存、崩溃率。 |
在 MicroProfiler 和内存视图中标记自己的代码:
--!strict
local RunService = game:GetService("RunService")
debug.setmemorycategory("EnemyAI") -- memory allocated by this thread is attributed to "EnemyAI"
RunService.Heartbeat:Connect(function(_deltaTime)
debug.profilebegin("EnemyAI.think") -- shows as a labeled bar in the MicroProfiler
-- ... work ...
debug.profileend()
end)
目标
- 客户端:中端手机达到 60 FPS(约 16.6 ms/帧);许多玩家使用低端 Android 设备。
- 服务器:心跳接近 60 Hz;
Stats(workspace:GetRealPhysicsFPS()、Dev Console Server Stats)。 - 内存:移动客户端最先会因 OOM 崩溃。低端设备上的客户端内存应远低于约 1–1.5 GB;留意
PlaceMemory、LuaHeap、GraphicsTexture、Sounds、Animation类别。
最常见的问题 → 修复方法
| 症状 | 常见原因 | 修复方法 |
|---|---|---|
| 内存随时间增长 | 未清理的连接、以玩家/实例为键的表、已销毁但仍被引用的实例、未设父级的实例 | 断开连接/清理每个玩家和每个角色的数据;在 PlayerRemoving 时清空表;使用 Scene Analysis 的“unparented instances”和堆快照。 |
| 玩家较多时服务器卡顿 | 每帧运行的逐玩家循环、while true do task.wait() end 循环、负载过重的远程处理程序、许多未锚定部件的物理计算 | 使用事件驱动代码、单一调度循环、降低思考频率、锚定静态部件,并减少服务器拥有的装配体数量。 |
| 客户端 FPS 下降 | 部件/绘制调用过多、许多灯光产生的阴影、透明效果/粒子的过度绘制、每帧更新 UI | 合并/实例化网格;对小部件设置 CastShadow = false;减少投射阴影的灯光;限制粒子;仅在变化时更新 UI。 |
| 每隔 N 秒出现尖峰 | 自动保存/GC 突发、玩家之间同步的循环、大型 Clone() 操作 | 使用随机偏移错开执行时间;对象池化;将工作分散到多个帧中。 |
| 高 ping / 画面回弹 | 远程调用刷屏、负载过大、复制大量属性变化 | 批处理、增量压缩、节流;在客户端执行补间;参见 roblox-networking。 |
| 加入时间过长 | 地图过大、独特资源过多、未启用流式加载 | 使用流式加载和 SLIM LOD,减少独特网格/纹理;仅对关键资源调用 ContentProvider:PreloadAsync。 |
Luau 热路径
- 在循环外缓存服务、实例和
RaycastParams;避免每帧调用FindFirstChild/GetDescendants。用标签(CollectionService)或维护的集合替代GetDescendants扫描。 - 对逐帧工作,使用
Heartbeat/PreSimulation提供的deltaTime,而不是task.wait()循环。 - 避免在热点循环中每帧创建闭包/表;使用
table.clear重用缓冲区。 - 对计算密集型代码使用
--!native(整个脚本)或@native(单个函数);类型化参数有助于本机编译器。不要全局启用:这会增加编译时间,并受全局本机代码内存限制。 - Roblox 已经会使用
--!optimize 2编译实时游戏;微基准测试不要依赖 Studio 的计时结果。
渲染与资源
- Part:更少、更大的 Part;共享
MeshId的MeshPart会实例化(开销低);联合体(PartOperation) 可能开销较高——在 Scene Analysis 中检查三角形数量。 - 对精细网格使用
RenderFidelity = Automatic/Performance;对装饰性网格使用CollisionFidelity = Box/Hull; 对纯装饰使用CanCollide/CanQuery/CanTouch = false。 - 灯光:限制投射阴影的
PointLight/SpotLight/SurfaceLight;限制ParticleEmitter.Rate和粒子大小(overdraw);限制Beam/Trail数量。 - 纹理/图像:复用,保持合理分辨率(大多数最高 1024²);谨慎使用
SurfaceAppearance。 - 启用流式加载(
roblox-architecture),对静态模型使用Model.LevelOfDetail = SLIM,并让StreamOutBehavior = Opportunistic释放内存。
物理
- 为所有不需要移动的对象设置 Anchor。在移动组件上焊接装饰性 Part 会增加开销。
- 更少、更简单的碰撞(
CollisionFidelity,用碰撞组跳过成对碰撞);在不需要Touched的地方 设置CanTouch = false。 - 避免每帧设置未锚定 Part 的
CFrame;改用约束或锚定 + CFrame。 - 使用
workspace:BulkMoveTo(parts, cframes, Enum.BulkMoveMode.FireCFrameChanged)移动大量已锚定的 Part。 - 自适应时间步进(
PhysicsSteppingMethod = Adaptive)可降低物理 CPU 占用。
并行 Luau
位于不同 Actor 实例下的脚本可以并行运行:
--!strict
-- Script parented under an Actor (one Actor per logical unit, e.g. per NPC group or chunk).
local RunService = game:GetService("RunService")
local results: { number } = {}
RunService.Heartbeat:ConnectParallel(function(_deltaTime)
-- Parallel phase: read-only access to most instances, pure computation, thread-safe APIs (raycasts).
for i = 1, 100 do
results[i] = math.noise(i / 10, os.clock())
end
task.synchronize()
-- Serial phase: write to instances, fire events, call thread-unsafe APIs.
end)
task.desynchronize()/task.synchronize()切换阶段;ConnectParallel以并行方式启动。- 同一 Actor 中的脚本彼此串行运行:将工作拆分到多个 Actor。
- 在反同步状态下无法
require或修改大多数实例。可通过Actor:SendMessage/BindToMessageParallel或SharedTable(SharedTableRegistry)进行通信。 - 适合的场景:射线检测验证、程序化生成、寻路相关数学计算、大规模模拟。 不适合的场景:微小任务(同步开销)、实例密集的工作。
性能分析与内存泄漏排查演练:references/profiling.md。
相关技能
roblox-architecture(流式加载)、roblox-networking(带宽)、roblox-physics、roblox-npc-ai、
roblox-studio-mcp(通过 MCP 使用 Roblox 的 rbx-perf-profiling/场景分析)。
评论
支持 Markdown