System Specifications:
Device: MSI Thin GF63 Laptop
Intel Core i5-12450H (Validated: 200W/32W power limit tests confirm consistent bottleneck regardless of power availability; zero thermal/power throttling observed).
GPU: NVIDIA GeForce RTX 3050 Laptop GPU
Memory: 16GB Dual-Channel RAM
OS: Windows 10
Description of the Issue:
The Roblox client experiences chronic frametime instability, as shown by high-frequency micro-stutters. MicroProfiler analysis proves this is a pure CPU-bound Task Scheduler bottleneck. The GPU consistently reports < 1ms rendering times, confirming the hardware is not the limit. The issue stems from a structural failure in the engine’s Task Scheduler: sequential Lua execution workloads (including Knit frameworks, RunService.Heartbeat, RenderStepped, and native Roblox CoreScripts) are serialized and pinned to a single background worker thread (e.g., RBX Worker A or Worker C). This core reaches its full computational saturation and spills past the frame budget, forcing the RBX Main thread into a synchronous dependency stall (the timeline shows RBX Main as empty while waiting for the saturated worker to return).
Why i believe this is the case:
Thread Dependency Stalls: Heavy sequential workloads consistently pin a single worker core while peripheral cores (Worker J, L, F, G) remain entirely unutilized.
Control Test Validation Testing on an empty baseplate (zero user scripts) targeting 120 FPS 8.32 ms budget reproduces the identical saturation issue using native CoreScripts (PlayerList, SettingsHub, ExperienceChat). This confirms the bottleneck is intrinsic to the engine’s Task Scheduler.
Power-Limit Invariance Testing with elevated power limits 200 W produces no change in frametime behavior, confirming the issue is architectural and not a result of thermal or power throttling.
Frame-Budget Sensitivity: Performance “stutter” scales linearly with frame-budget constraints; toggling between 60 FPS 16.6 ms budget and 120 FPS 8.32 ms budget demonstrates that the single-threaded execution limit is the primary cause of the instability
Reproduction Steps:
-
Enable the MicroProfiler during high intensity frame periods.,
-
Monitor thread workload distribution; observe a single pinned worker core vs. idle peripheral cores.,
-
Observe the RBX Main timeline during saturated execution; note the synchronous stall (empty timeline).,
-
Toggle target framerate 60 vs 120FPS to observe direct correlation between budget constraints and frametime spikes.
Attached Files:
Jailbreak clip (Place ID: 606849621) - Watch Jailbreak | Streamable
Jujutsu Shenanigans (Place ID: 9391468976) Watch ROBLOX_9593df57-f085-4412-b345-2428ab04678f | Streamable
Baseplate clip - Watch ROBLOX_649cf32d-6c82-4c97-a068-d867e631d4cd | Streamable
Example:
Expected behavior
What should be expected behaviour:
The engine’s Task Scheduler should dynamically distribute non-interdependent client-side sequential frame operations across available multi-core worker threads to prevent synchronous dependency stalls and optimize CPU utilization.
A private message is associated with this bug report




