mcpField
R
roblox-performance

roblox-performance

github.com/el4cteo开发59618 次安装2 周前更新
代码仓库

关于 roblox-performance

roblox-performance 是用于诊断和改善 Roblox 游戏性能的开发技能,介绍分析工具及常见瓶颈,并提供服务器、客户端、内存、网络、渲染和物理方面的指导。

主要功能

  1. 01服务器与客户端性能分析工具
  2. 02诊断内存泄漏和帧耗时峰值
  3. 03Luau 热路径优化建议
  4. 04渲染、资源与物理优化建议
  5. 05Parallel Luau 使用指引

适用场景

  1. 01查找客户端 FPS 下降的原因
  2. 02排查内存增长或服务器延迟
  3. 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 ConsoleF9(游戏中)错误、按类别划分的服务器/客户端内存、网络、脚本活动。可在实时服务器中使用。
MicroProfilerCtrl+Alt+F6(⌘⌥F6);服务器使用 Dev Console逐帧计时;尖峰;转储帧以查看详细信息。
Script ProfilerStudio / Dev Console哪些函数消耗了 Luau 时间(采样)。
Luau heap snapshotsDev Console → Memory → Luau Heap查看哪些表/闭包/实例被保留,以及保留它们的对象(泄漏)。
Scene AnalysisStudio脚本内存、未设父级的实例(泄漏)、实例组成、音频/动画内存、三角形数量。也可通过 Studio MCP 使用 SceneAnalysisService。
Performance Stats / Debug StatsCtrl+Alt+F7 / Shift+Ctrl+F1–F5实时 CPU/GPU/内存/网络叠加层。
Network SimulatorStudio Device Simulator toolbar使用延迟、抖动、丢包进行测试(3G/4G/Wi-Fi 配置)。
Performance dashboardCreator 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