Alternatives of occlusion culling?

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?

Edit:

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.

2 Likes

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.

3 Likes

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 :confused: and will be a perfo hit on CPU.

2 Likes

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

  1. Read this
  2. Use the profiler to see where the problem really is. Just to confirm that rendering is really the issue.
  3. Make sure as many parts as possible are anchored, and not just welded to an anchored part.
  4. Use CSG if you can (or even prefer low-poly meshes to parts), this can help reduce the overall polygon count.
  5. 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.
  6. 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”).
  7. 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.
3 Likes

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).

1 Like

Ok, thank you. Good to know. I just did a small test, and yes I can confirm that. My bad I did not know :slight_smile: