Roblox lags, sheduler render is broken.. were are optimization in roblox?

I am not the only one who has noticed that recently, the “Scheduler Render” percentage has risen to over 90% and is now causing significant FPS drops in Roblox experiences. Okay, the shadow issue consumes a large part of performance, but now it seems that the long-awaited Occlusion Culling has also broken.

On my project, where I have been working on optimization for a very long time, new issues keep appearing. They seem global to me because they extend beyond the boundaries of my project. For some reason, the exact same problem has appeared in many other places.

Before:

After:

Well-made, graphically sophisticated games are all affected by this issue. Doors, Pressure – even some unknown games. It happens even when you are looking at a nearly empty area. This is a strange anomaly and is clearly a bug at the moment.

I hope that I can get help or that this will be seen. My previous post on the shadow issue went unnoticed… These performance regressions are having a significant impact on the playability of many experiences.

8 Likes

Hello There! I hope you’re doing well.
Thank you for taking the time to submit this issue and for reading our message.

To help us move forward, we’d appreciate your support with a few questions:

  • Is this issue still occurring on your device?

  • If so, could you please include a microprofiler dump?

Don’t worry — we’ve got you covered!
You can find step-by-step instructions on how to generate and send the microprofiler [How to post a Bug Report - Bug Reports - Developer Forum | Roblox]. Following these steps will help us better understand the issue and work on a solution more efficiently.
Thank you again for your cooperation!

3 Likes

Yes, still occuring. But I can tell you that my friend is experiencing the same thing.

My device:

    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

Dump:

microprofile-20251105-191056.html (841.3 KB)

2 Likes

I also encountered this problem. Bump

1 Like

Were is help? We have so many problems for this badly shadows., Staff ignore this. Technical support ignore this.

2 Likes

Will there be any response from you?

1 Like

Thanks for the detailed report and screenshots, really helps us understand what you’re seeing.

We took a look at our internal metrics and logs, and so far we’re not seeing anything unusual platform-wide with Scheduler Render times. That said, your screenshots clearly show something’s off, so this is likely hitting specific edge cases we haven’t caught yet.

Quick note on how occlusion culling works: it’s designed to save overall frame time, but the tradeoff is it sometimes uses more CPU to reduce GPU load. Usually this comes out ahead, but there can be scenarios where the balance doesn’t work in your favor.

We also tested Doors and Pressure internally and couldn’t immediately repro what you’re showing.

Would you be able to help us narrow this down? Specifically:

  • Your specs (platform, GPU, CPU, RAM)
  • Roblox client version
  • A place file or minimal repro where this is most noticeable
  • Does it happen all the time or just sometimes?
  • Did anything change in your project around when this started?

Would really appreciate the help tracking this down!

Thanks

2 Likes

Thank you for noticing my appeal, or rather, the bug report. This topic still concerns me and my colleagues. I would be glad to deal with it myself, if Roblox had open source or at least a bit more capabilities in this Profiler - where it’s difficult to understand anything.

First, I will answer your questions:

CPU: Intel Core i5-14600KF
    GPU: AMD Radeon RX 9070 XT (Stable Driver)
    This bug occurred exactly the same way on the RX 6700XT back in those days
    RAM: 32GB (2x16GB) DDR4 @ 4400MHz (DDR4 TRIDENT Z B-die)

==============

My comrades computer:
    CPU: Intel Core i5-12400F
    GPU: GTX 1660 (Stable Driver)
    RAM: 32GB (2x16GB) DDR4 @ 3200MHz
  1. version-1588a9c58c674e38 (In my new tests) (Both have this version)
    As for the old ones. I would be very happy if I could know the versions in which I did this. The whole problem is that I don’t even have access to old versions of Roblox Studio (like in UE where you have a choice of versions), to compare where, how, and what.

  2. I will send you 2 project files. The Lobby. Where the percentage grows noticeably, especially on weaker PC configurations. And the Main location - where even for me this Scheduler rises. It rises only in the main game. This is not observed in Studio. There were cases when the FPS in the studio was higher than in the game itself.

Lobby Weak Link Build 23.01.26.2195.7.rbxl (3.0 MB)

  1. I can say this. I have already upgraded to a very powerful PC configuration. I have powerful hardware. And with such, I began to encounter this less. But for my comrade, in principle, this happens almost everywhere. As the problem appeared, in complex scenes the Scheduler grows. As I showed earlier in the screenshots. Looking at an empty wall - the Scheduler increased and the FPS dropped from nothing, simply.

    At those moments, nothing particularly changed, we, on the contrary, after the problem appeared, began to optimize everything as strictly and quickly as possible. Looking for solutions to lower the Scheduler and Shadows. Unfortunately, we have only come to the point of lowering the quality of our places. Further, I will simply show what I found during the time period while waiting for your response.

The whole problem lies in rendering behind walls. And first, we will talk about the Scheduler.
The problem was discovered by October 31st. (It could well be earlier, but specifically to be discovered on this date it happened).

What happened?

  • The Scheduler Render began to show a high load percentage (This did not happen before).

  • An interesting fact, in Studio - the scheduler shows minimal readings.

  • Why I paid attention to it - my comrade has a GTX 1660 - and his performance drop was the most noticeable. For me (example in the video) it amounted to only 20-30 frames in some scenes. But for him, the drops became stronger.

I have attached two videos, before and after. Most likely, this is more an indicator that the Scheduler did not show such numbers before. And it’s not just us. It was like that everywhere.

Before

After

After that, I went to test in other places - in case this problem is only with us and it’s something we did wrong. But I discovered the same performance drop in Doors. And an increase in numbers in the Scheduler.

I started an investigation, and unfortunately, I could not understand exactly what is loading the Scheduler so much.

I will show a video and pictures that shows, to this day and perhaps even slightly worse, the readings. Both for me and for my comrade.

However, I found many other problems with Rendering Behind Walls and am ready to share them so that you take note of them.

  1. A strange bug, for some reason behind the wall parts begin to render when I start to move the camera to the side. ((I still don’t see these parts behind the wall, but they start rendering) The CPU skyrockets.) - This works both with a large number of parts, and with one, even the smallest!

  1. Shadow calculations behind a wall. There is a light source, a shadow caster (in this case, a rotating part that should cause shadow calculations). A wall that blocks the light source, and behind the wall there are objects. From experience, we see that objects from which there are literally no shadows, none at all. In Draw Calls, shadow polygons are being rendered. Can this be considered a bug or not?

Shadows and wall.rbxl (173.5 KB)

1 Like

Hello,

I am looking at this, but I’m not 100% sure what the problem is you want to have fixed. For the on screen timer and the scheduling percentage:

image

The first number 195.3 means it is updating 195.3 times per second, which means 1000 / 195.3 ~ 5.1ms /frame… this number aligns with the numbers you see on CPU and GPU. The second number is how long the render job took CPU time wise, in this case 0.7ms. The last number is a percentage of the render job time / total frame time. Or in this case 0.7 / 5.1 ~ 13%.

What this means though is that the render job is 5.1 - 0.7 = 4.4ms idle, doing nothing (or ~87%). With optimizations we have done over the last years we use some of that idle time to try to improve the situation. Things like occlusion culling try to not render objects that cannot possibly be seen, as that could help improve the overall frame time, if we’re GPU bound. In your screenshot the GPU also took 5.1 ms, so that means we’re pretty much GPU bound… while at the same time the CPU is idle 4.4ms (for rendering that is).

So the goal of the optimizations is to use some of the idle time to see if we can reduce the workload on the GPU. However doing so increases the render job time… and as such the last number in the “Schedule render”. For example… say we spent 1 ms to do occlusion culling… then the renderjob time would be 1.7 ms, which would end up being 1.7/5.1 ~ 33%. However this has another side effect… usually the GPU now renders less, because we send it less commands. So since the frame was previously GPU bound, imagine that we now saves 0.5ms off the GPU time. This would make the GPU time 5.1 - 0.5 = 4.6. (And consequently the FPS ~217.4). However that further drives up the percentage… since now it is not 1.7/5.1 ~ 33%, but 1.7/4.6 ~37%.

Or for the microprofile you have attached:

Here it is clear that YES we are spending CPU time, and that time increases the "Schedule Render % in the on screen display, but that CPU time doesn’t negatively affect frame rate. It most likely helps the framerate to get better since we’re GPU bound and that CPU time is spent to send less to the GPU.

So in essence this is not a bug, this is an optimization to improve framerate overall. Have more time in the render job 80% - 90% provided that it benefits FPS (sometimes it doesn’t because if a scene is nearly empty, or you look at an empty part, there’s not much optimization you can do with things like occlusion culling).

That leads sort of to you next part where sometimes pieces behind a wall go hidden and sometimes they don’t. We have heuristics to determine if running occlusion culling helps. As soon as we approach the place where doing the occlusion costs more time than it would save, we don’t do it. There are a lot of other heuristics around this, due to how the occlusion culling works. This makes it not easy to understand from an outside point of view on the decisions it makes.

If you want a slightly better understanding of how it works you can look at https://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.pdf. The basics of the technique are the same, but we have a lot of custom heuristics that help decide.

One thing you can see in your example, since this feels counter intuitive is that the tech occludes more objects when looking straight onto the first wall as opposed to at an angle.

This has to do with how occlusion culling works against a hierarchical depth buffer. Slide 26 of the previously mentioned slide deck gives some intuition as to why this is… when looking straight onto the first wall, the conservative depth in the depth pyramid has fairly equal conservative min depth across the entire surface. When the angle gets more slanted, the conservative min depth is correct for the high detail occlusion depth, but due to the nature of creating the hierarchy the conservative min depth basically becomes the furthest away point. of that wall. As such all other wall segments have pieces that are closer than the conservative depth at the area of the pyramid where we only need to test 1 sample… and therefore we cannot early reject it.

Another example of why it unintuitive to figure out what occlusion object we take has to do with selecting the best occluders.

Anyways, all this is to say that… I wouldn’t try to reason about what are good occluders vs not. We have spent a long time tuning this number against virtually millions of experiences and there is lots of tech behind it that shows that on average it increases frame rates on most titles. There have been edge cases where occlusion culling was occasionally detrimental and we’ve spent a lot of time refining that and automatically turning it off when it isn’t helpful.

If you believe however that it is not helping your title, please create a place file with a fixed camera, with the exact same angle, scenario, etc. So that we can run a test with optimizations on and off. And then we can tweak the algorithm further if needed.

2 Likes

Listen, thank you for such a detailed and even very clear answer. Due to my narrow-mindedness and the period of just starting out and only now beginning to understand all this, I of course mistakenly consider the Scheduler to be the problem area.

This problem actually hasn’t been very concerning to me, because it seems to me that the performance in my place would be better anyway. Could you help if I provide the place and a microprofiler from it?

Lobby Weak Link Build 23.01.26.2195.7.rbxl (3.0 MB)

This is my MicroProfiler - there is a slight drop to 210 frames - not a perfect 240, let’s say.

And here is my comrade’s MicroProfiler - He has a 1660 video card. 140 frames. And so bad visions of 100 frames.

The problem is that the FPS differs greatly on different devices, and it seems that even on an already very simplified scene, we still get weak performance on not even the weakest devices. Such as the 2060 and 1660 - it’s quite painful for them to see almost 100 frames on average.

There are doubts that objects with a transparency function might heavily load the frame time via the GPU - the more objects with transparency, the more the GPU starts to get loaded. If you could help, I would be very glad, as we have been solving optimization issues in our game for the past six months. And all the paths that pointed to this were: Shadows, Scheduler, Transparent Objects, Polygons on the Scene. We are currently not sure what could help us.

If this is difficult, are there any documentation resources helping me understand how everything works in the MicroProfiler?

1 Like

Oh, exactly, another question: why didn’t this indicator grow at all before? Only up to 20-30. And it seems like the FPS was a bit higher before. Maybe there is an option to look at the versions from that time and compare them with now.

1 Like

From the first profile:

that’s ~200FPS (1000/4.9) if vsync is off

From the second profile:

That’s ~154FPS (1000/6.5) if vsync is off

This is in line with what is expected UserBenchmark: Nvidia GTX 1660 vs RTX 2060

2060 is about 33% faster so 1.33 * 4.9 ~ 6.5.

I have run the test place you provided (thank you for doing so) and turned on/off occlusion culling in various view angles. I’ll post 1 comparison here as to not flood the reply with images (note that I run with vsync on, so it is frame locked at 60FPS, making the scheduling percentage low):

EDIT: Extra note, I tested this purely in studio so that the shadow map invalidations do not affect the overall frame time, since then all the timers become way more variable.

Occlusion culling OFF:

Occlusion culling ON:

From here it can be seen that the GPU time drops quite dramatically, while the CPU time drops about 0.6ms even though we’re doing occlusion culling on another thread.

I have run this on multiple camera angles and having occlusion culling on consistently improves frame time.

2 Likes

I don’t think that turning off occlusion would be better. I believe that the October version of Studio and the current version differ. And it’s quite possible there might be a performance gain (maybe the old algorithm was better and it needs to be rechecked???).

I don’t want to be too pushy; I would honestly test this myself if I had access to an older version of Studio, at least the October build. Unfortunately, RobloxModManager no longer allows launching an old Roblox Studio for testing.

To reiterate: I suspect that occlusion was more EFFECTIVE before, in the October version, and maybe even September’s—back when even the font in the Performance Stats changed.

Thank you for clarifying what you meant.

So this could be the case. However it might be informative to know that we track performance quite detailed and any regressions in performance across the board are flagged and investigated.

So it could be that for your particular case performance is slightly lower (but within acceptable ranges), while performance for all experiences overall improved. That’ll be hard to measure and we cannot optimize for specific individual use cases, as we have millions of experiences, but rather we have to keep the platform as a whole in mind.

The game you have still experiences > 100 FPS. Which is both very good frame rate, most people have vsync at 60hz and the performance on most low end mobile phones is 30Hz or lower. But also at this levels of FPS tiny fluctuations in code swing the frame rate quite heavily. E.g. 200FPS == 5ms/frame, 100 FPS == 10ms/frame, 60 FPS ~~ 16.67ms/frame. So you have some leeway till you hit 60FPS which is still great frame rate.

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.