Looking at this Occlusion Culling, I guess there is still no OC in Roblox. I experience big FPS drop when facing lots-of-parts in camera frustum, even when the stuff is behind a wall and I can’t see a thing. Like you could imagine a huge Castle with lots of rooms and stuff, but you are viewing only a small portion of it - being in some single room.
So I wonder is there currently some trickery or workaround to achieve something similar to OC?
I do use Transparency 1 for the parts player don’t see and that brings back up fps to max. So the statement in solution post: “I don’t think changing Transparency would even help in this case – the parts would have to be actually removed from the scene to not affect rendering costs” is false.
Model level-of-detail should be coming somewhat soon. LOD already exists for meshes. Using LOD should help a bit, since it reduces the number of polygons that have to be rendered with far-away assets. Of course, this wouldn’t be super beneficial for your use-case with a lot of rooms, which I assume are not very far away from each other.
While I wouldn’t really recommend it, you could build your own system that pops assets in/out of the game locally based on where the player is. It’s very easy to do this improperly though & cause more performance issues.
I could set Transparency to 0 for parts far away as the bottleneck is in GPU. But that’s a lot of loops and checks and will be a perfo hit on CPU.
I don’t think changing Transparency would even help in this case – the parts would have to be actually removed from the scene to not affect rendering costs.
A few ideas though, if you’re talking about your own game
- Read this
- Use the profiler to see where the problem really is. Just to confirm that rendering is really the issue.
- Make sure as many parts as possible are anchored, and not just welded to an anchored part.
- Use CSG if you can (or even prefer low-poly meshes to parts), this can help reduce the overall polygon count.
- You could do a kind of “chunked” occlusion culling, where you pop whole areas (e.g. rooms of your castle) in and out of the workspace when their bounding box isn’t visible – but “visible” is again going to be pretty tricky to define without performance loss.
- You could probably cheat, depending on how your game is laid out (e.g. “Unless the player is in room A or B, don’t show room C”).
- You could take another approach to loading areas and just stick some doors that the player has to manually click on to enter + load the room behind it – think skyrim style.
Skyrim style is cool, but Robox is all about multiplayer. So I can have players in multiple rooms. Considering that it gets kind of difficult and wicked - i mean, for example, I would load room for player A, which player B doesn’t see and the way around. And that’s only best scenario. If the players are over the place it’s no optimization at all.
Unless there is a way to hide (exclude) geometry on a client level (LocalScript), what would effect only the observing player from his machine. But I haven’t found such options.
How so? What’s preventing you from just deleting/managing the parts on the client side via local scripts?
Aren’t such action automatically synced to all clients?
It would be a major security flaw if one player deleting a part deletes it for everyone else. A client’s actions aren’t replicated, except for set exceptions (RemoteEvents/RemoteFunctions, character behaviour and animations).
Ok, thank you. Good to know. I just did a small test, and yes I can confirm that. My bad I did not know