Perf Auditor plugin

Quick Demo:

Most slow places don’t have one big mistake. They have four thousand tiny parts casting shadows, a MeshPart someone set to Precise months ago, and a RemoteEvent firing 60 times a second because it ended up inside RenderStepped. Nothing breaks, so nobody notices. The game just runs worse on phones.

Finding that stuff by hand means clicking through Explorer, the MicroProfiler, the F9 console and Network Stats one by one. So I built a plugin that scans everything at once, tells you what’s worst first, and selects the offending parts for you.

Note that I built this plugin for myself, to get some sanity back when debugging why the game is slow. You still have to think about what to optimize (balance things). But at least you get an overview of expensive stuff and possible directions towards improvement.
I am not making this post to sell it, but to make it searchable/findable in case someone needs exactly this.

Get it, it is paid: Perf Auditor on the Creator Store

What it does

  • Scans the whole place, or only your selection, with 63 checks and gives it a score out of 100. Findings are ranked by severity.

  • Selects the offenders of any finding in one click, or groups them by folder so you can see which part of the map they’re in.

  • Has a one-click Fix for the common ones (RenderFidelity, CastShadow on small parts, particle rates, hidden decals, AnimSaves and more). Every fix is one undo step.

  • Shows live engine stats while you build or playtest: FPS, frame timings, draw calls, triangles, physics, memory and network, with yellow and red thresholds for Mobile, Mid-range or High-end PC.

  • Watches for memory leaks on its own. If instance counts, script memory, connections, threads, UI, sounds or images climb steadily for a minute, it tells you what is growing and where.

  • Records remote traffic during a playtest and points at the remotes that send the most, down to the payload of each packet.

Quick start

After installing, you get a Perf Auditor button in the Plugins tab. The panel docks like any other Studio window.

  1. On the Audit tab, click Run Audit. To scan only part of the place, select a model or folder first and click Selection.

  2. Open a finding. Read Safe to act?, then click Select to see the offenders in the viewport, or Fix if the finding has one.

  3. Run the audit again and check the score moved.

  4. Start a playtest and open Live with the device set to Mobile. Play for a few minutes and see if leak watch has anything to say.

  5. Open Network in the same playtest and look at Biggest offenders.

Audit

The audit walks Workspace, ReplicatedStorage, ReplicatedFirst, Lighting, StarterGui, StarterPack, StarterPlayer, SoundService, ServerScriptService and ServerStorage.

The score starts at 100. A critical finding takes off 15 and a warning takes off 5. A finding counts once no matter how many offenders it has, so one bad MeshPart and nine hundred bad MeshParts cost the same. The severity already says how bad it is.

Some of what it checks:

  • Rendering. Precise RenderFidelity and CollisionFidelity, unions, transparency, Glass, Neon, decal and texture counts, giant parts, estimated triangles, mesh reuse.
  • Shadows. Small parts casting shadows, invisible or Neon parts casting shadows, shadow-casting lights, and parts under a roof whose shadows nobody can see.
  • Physics. Unanchored parts, legacy BodyVelocity and BodyGyro, orphaned joints, duplicate welds, anchored parts with CanTouch on.
  • Scripts. wait(), spawn() and delay(), while true loops, per-frame RenderStepped work, copy-pasted scripts, disabled scripts.
  • Streaming. StreamingEnabled and its radii, persistent models, ReplicatedFirst and ReplicatedStorage size, estimated join time.
  • World. Heaviest models, overlapping duplicate parts, parts lost far outside the map, crowded grid cells.
  • UI and sound. UI that’s built but never shown, Billboard and Surface GUIs with no MaxDistance, sounds that replicate to every client.
  • Leftovers. Animation Editor AnimSaves and KeyframeSequences still in the place.

The report also lists the checks that found nothing, so you know what it looked at instead of guessing whether something was missed.

Acting on a finding

Every finding has Why it matters, Safe to act? and Check it yourself. Safe to act? tells you what the change does to collisions, scripts and the look of the place before you touch anything. Check it yourself tells you which Studio tool confirms it (Render Stats, MicroProfiler, F9 console or Network Stats), because you shouldn’t trust a plugin over your own measurements.

Flip the offender list to a tree and offenders group under the folder they live in. Each branch has its own Select button. Handy when 300 offenders are in a map you’re deleting anyway and 12 are in the lobby.

Advanced Settings

Three checks do extra work per part or per image, so they live in Advanced Settings. Hidden decals is cheap and on by default. Shadow casters under cover tests each part against the sky. Texture resolutions loads every unique image and flags ones bigger than the engine renders (1024px, or 256px for particles). The last two are off by default because they’re slow on big places.

Live

Live samples engine stats every second, in edit mode or during a playtest. It keeps going while you’re on another tab.

Pick a target device at the top. Rows turn yellow or red against that device’s limits, so a number that’s fine on a PC can still warn you about phones. Each row keeps the whole session and shows how far it has moved since you started. Once the place has finished loading, press Reset baseline so growth counts from there.

Leak watch

A leak is anything that goes up and never comes back down. The game doesn’t stutter. It just gets slower the longer it runs, and on a phone it closes itself in the end.

Leak watch reads the shape of every Live measurement and reports one once it has climbed steadily for a minute. Each report says what happened, what it means, what to change and how to check it yourself. For instance leaks it names the classes growing fastest and where one of them came from, with a Select button.

When it finds something, the readout stops moving so you can read it. Sampling carries on underneath, and Back to live shows what happened in the meantime.

Network

Start a playtest and open Network. Capture starts on its own. It hooks every RemoteEvent and UnreliableRemoteEvent and shows totals per remote, in and out rate charts, a packet log, and warnings for packets of 10 KB or more, remotes firing more than 20 times a second, and the same payload sent over and over.

Click a row in Biggest offenders to open that remote right under the list.

A rate chart tells you a spike happened, not what caused it. Click the bar. That pins the second and lists the remotes that sent in it, ranked by bytes, with every packet behind them, down to the payload.

Good to know

  • Packet sizes are estimates of how Roblox serializes remote arguments. Use them to compare remotes against each other. The engine’s own KB/s figures sit next to them.

  • RemoteFunctions show up in the list, but a plugin can’t see their calls, so they have no traffic numbers.

  • In Studio, the engine counts every installed plugin’s script memory as part of your place. Leak watch and “This place only” leave plugins out, so a plugin growing in the background doesn’t get blamed on your game.

  • What’s New inside the plugin lists every change with its release date.

Feedback

Bug reports and feature requests are welcome in the replies. If a check is wrong for your game, or misses something it should catch, post a screenshot of the finding and I’ll look at it.

Current version: 0.4.1

4 Likes