Introduction & Previous Contact
Recently, during the summer, I asked a colleague to create a post regarding severe FPS drops in games caused by an excessive number of “Draw Shadow Calls.” This forces the engine to calculate massive amounts of data on seemingly non-complex locations, especially when compared to modern-day games. Our goal was to determine if this behavior was correct or if it constituted a bug. We did not receive a response from Roblox Staff or a Developer. Time has passed, but the problem remains the same. Additionally, a strangely high percentage of “Schedule Render” has appeared, reaching up to 90% (in my case, it consumes almost 50 FPS from the total).
2. System Configuration
Primary Workstation:
OS: Windows 11 Home (24H2, Build 26100.4946)
CPU: Intel Core i5-12400F
GPU: AMD Radeon RX 6700 XT (Stable Driver)
RAM: 32GB (4x8GB) DDR4 @ 3200MHz
Storage: SSD
Connection: Wired Internet
Browser: Firefox
Secondary Workstation:
OS: Windows 11 Home (24H2, Build 26100.4946)
CPU: Intel Core i5-14600KF
GPU: AMD Radeon RX 6700 XT (Stable Driver)
RAM: 32GB (2x16GB) DDR4 @ 4400MHz
Storage: SSD
Connection: Wired Internet
Browser: Firefox
Internet Speed Test: https://www.speedtest.net/result/18194927265 (Provided as requested by support)
Actual Behavior
When any dynamic object moves (e.g., doors, wheels, or BaseParts), an intense shadow recalculation is triggered. This is most noticeable on large maps. As a result, the shadow draw count skyrockets to 5,000 – 6,000 calls (representing approximately ~1 billion triangles), and the FPS is halved. On some less powerful devices, this leads to unacceptable lag, making the game unplayable. This occurs even with minor movements (such as resizing a part in Studio) and can last for over 3 seconds per object. Notably, the movement of a player’s avatar typically causes only 200-300 draw calls, which proves that optimization is possible.
Where It Occurs
-
In our game: A “Wheel of Fortune” script caused ~6,000 shadow draws. A single rotating part consumed ~6,000 draw counts.
-
In popular experiences like “Doors”: Shadow draws spike to ~1,500, capping the FPS at around 120.
-
The issue is reproducible in minimal, controlled scenes (see the attached file for a reproducible test place).
When It Occurs / Frequency
We first fully encountered this issue in July-August of this year. It persists to the present day without any change. I have contacted Roblox technical support, and we filed a report, but received no response. The issue triggers 100% of the time when an object moves or spawns (observing this requires a scene with active lighting and geometry).
Reproduction Steps
-
Open Roblox Studio and create a new baseplate place (using standard “Future” graphics settings, etc.).
-
Add approximately 16 or more PointLight objects (with Shadows.Enabled = true) and 50 or more assets (e.g., PBR meshes, shelves, barrels, or other complex geometry).
-
Create a single moving part (driven by physics or a script) within or near the illuminated area.
-
Press Shift + Ctrl + F2 to open the performance stats and navigate to Draw Counts > Shadows.
Observation
The shadow draw count will skyrocket to 800-1,000+ calls (varies depending on the test setup), causing a 30-40% FPS drop (up to 100% on complex scenes, making them unplayable).
I have attached videos below that clearly demonstrate the problem in both our project and in the “Doors” experience. If more detailed information is required, I also have a private YouTube video created specifically on this topic.
Expected behavior
Expected Behavior
I expect that when an object moves under light sources, it should only force those specific lights to recalculate their shadows, rather than causing a near-global recalculation of the entire shadow map. For instance, when a player character moves and we observe them from a third-person view, in most cases, it does not cause such massive recalculations compared to, for example, a simple unanchored Part.
A private message is associated with this bug report