This walkthrough shows how to use the MicroProfiler to find a problematic aspect of an experience and identify the root cause. Download the experience, Open from File in Studio, and follow along.
Identifying the Issue
After you open the experience in Studio, start testing it with F5 or the Play button.
The frame rate feels decent, but not as smooth as it should be for an experience of this size and scope. Navigate to the View tab and click Summary under Stats.
Note that the frame rate is below 60 frames per second (FPS).
Open the MicroProfiler by pressing CtrlAltF6 (⌘⌥F6).
Note that the frame times are consistent—the bars are roughly the same height—so whatever is causing the low frame rate is running every single frame as opposed to running occasionally and causing frame time spikes.
Pause the MicroProfiler by pressing CtrlP (⌘P). Pausing with the keyboard shortcut opens detailed mode.
Click and drag to pan the graph. Note how one particular process in the worker threads seems to be using a lot of processing time compared to the main thread. Hover over RunService.Stepped and note how long it's taking to render.
Stacked bars in the timeline indicate a hierarchy of code, so keep hovering on lower and lower layers to try and identify the issue.
Note the LocalScript label, which indicates the name of the script, and the Raycast label, which indicates that the problem might be related to raycasting.
Creating Troubleshoot Labels
Now that the MicroProfiler has provided a starting point, you can troubleshoot the problematic code.
Stop the play test and filter the Explorer window for localscript to find the file.
A search for raycast indicates that this portion of code is probably the culprit for the experience's poor performance:
local RAYS_PER_SECOND = 1500local function onStepped()for _ = 1, RAYS_PER_SECOND dolocal startPosition = getRandomPosition()local endPosition = getRandomPosition()local direction = endPosition - startPositionWorkspace:Raycast(startPosition,endPosition)endendRunService.Stepped:Connect(onStepped)Specifically, you can see that the code is casting 1,500 rays per second in random directions.
To verify that this portion of code is causing the rendering delay, wrap the contents of the function with debug.profilebegin() and debug.profileend():
local function onStepped()debug.profilebegin("Raycast Spam")for _ = 1, RAYS_PER_SECOND dolocal startPosition = getRandomPosition()local endPosition = getRandomPosition()local direction = endPosition - startPositionWorkspace:Raycast(startPosition,endPosition)enddebug.profileend()end
Confirming and Fixing the Issue
Start testing the experience, and open the MicroProfiler again.
Note how the MicroProfiler now shows the custom label, indicating that this function was indeed the root cause.
Stop the play test.
Delete or comment out the onStepped() function and the RunService.Stepped:Connect(onStepped) connection.
Start testing the experience again, and check the debug stats summary again.
Note the huge improvement to frame rate and corresponding drop in frame times on the MicroProfiler graph.