Hi Creators,
We are back with another update on Experience Chat performance and stability! As you know, Experience Chat, powered by TextChatService, is essential for many experiences on Roblox, allowing users to directly communicate with each other in real-time and feel more immersed in your experience. TextChatService is a powerful tool which can help you customize the chat’s appearance, add experience-specific commands or messages and more! We’ve also recently rolled out Experience Chat for Playstation and Xbox, helping you connect with a wider range of users.
Since April, we’ve implemented 11 changes, aimed at improving the amount of frame time Experience Chat consumes. Each of these improvements has been tested in weeks-long individual experiments to ensure positive impact. Check out our previous updates on performance here and here.
Beyond these individual changes, we’ve also measured the combined impact of these changes on engagement. When comparing user groups who received all the performance updates against those without, we’ve observed significant lifts to the number of messages sent and number of Experience Chat users. These results clearly demonstrate that our investments in Experience Chat performance are delivering tangible impact to the platform.
Background section expandable for curious minds…
Measuring and Improving Chat Performance
In order for devices to maintain a steady frame rate of 60 frames per second, they have a strict 16 milliseconds (ms) for all operations. Within Roblox, we are prioritizing minimizing the amount of frame time the core platform needs, especially for our internal Luau CoreScripts and Core UI, which use the React-lua framework. We’ve been tracking Avg P95 React Frame Time for Experience Chat because it describes how much of our time is spent in our UI code running Luau itself. It is calculated by measuring the milliseconds of work done by React for and dividing that duration by the total number of frames within the last 30 seconds. To make it more relevant, we only look at the slowest 5%. It also allows us to scale and measure both absolute and relative improvements across all experiences and device types.
Most notably, since we’ve started tracking this metric and improving performance, we’ve decreased the Avg P95 React Frame Time for Experience Chat on Android by around 69% (Android as a device type has been most sensitive to improvements since it supports the widest margin of device capabilities and constraints).
The following table is a historic record of Avg P95 React Frame Time for Experience Chat. It details how we have observed improvements across all measured device types since March.\
P95 React Frame Time for Experience Chat
Platform | March 1 | March 1st to April 1st | April 2nd to July 1st | March 2025 to now total percent change |
---|---|---|---|---|
Windows | 0.96ms | 0.49ms (-49%) | 0.27ms (-45%) | -72% |
OSX | 0.59ms | 0.30ms (-49%) | 0.19ms (-37%) | -68% |
Android | 1.98ms | 0.95ms (-52%) | 0.61ms (-36%) | -69% |
iOS | 0.36ms | 0.22ms (-39%) | 0.16ms (-27%) | -56% |
Console | N/A | 0.18ms | 0.14ms (-22%) | -22% |
Microprofiler Missattributions
We know many of you rely on the Microprofiler to understand how your experience performs within a snapshot of time, under specific device conditions and we use it constantly to validate our own improvements as well. However we’ve seen some inconsistencies with how frame time is attributed to Experience Chat, which can make performance analysis tricky.
This challenge stems from our shared React scheduler, which many Core UI React surfaces use. Since the Microprofiler doesn’t fully see the scheduler’s internal operations, React UI updates can be mislabeled, often appearing under tags like ExperienceChatMain, SchedulerHostConfig.default, TopBar, or $Script.
We’re actively working with internal teams to improve work attribution for both React and non-React cases, aiming to provide you with more accurate and insightful Microprofiler data.
When sending a message in a popular Roblox experience for example, we were able to verify that both average and max frame time was decreased on a Mac. Internally we were able to fix the misattributions in the Microprofiler to calculate these differences.
Before:
After:
Key Fixes and Their Impact (Since April 2025)
In general our improvements have focused on minimizing unnecessary UI updates and optimizing data flow. Here are some key changes:
- Reduced Unnecessary UI Updates: A major focus has been on preventing Luau UI components from doing work when the end result is unchanged. Specific target areas include improvements to bubble chat, voice speaker bubbles and the main chat window.
- Optimized State Management: Our chat UI handles a lot of player, text, and voice state. We’ve made substantial gains by transitioning to a more efficient state management system. This is an ongoing effort and we expect to see more gains when we complete the migration of various text chat and voice related states to this new pattern.
- Zero Cost for Unused Features: We want to ensure that features not enabled by developers consume no frame time. We addressed instances where the chat service consumed frame time even when disabled. For example, when a developer invokes
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Chat, false)
or when a user hides the Chat by interacting with the top bar, we now do less work since the ChatWindow will not need to be updated in either case.
Next Steps
While we see welcome improvements, there’s still more work to do. We are happy to see lower frame time averages but developers are still reporting spikes that occur on receiving or sending of messages, and we are continuing to investigate as a result.
We are actively fixing a backlog of issues related to TextChatService. We appreciate your patience and thank you for reporting issues in this space. Your feedback is invaluable, as we are actively listening and iterating on Experience Chat. Please share your thoughts and suggestions below!