How to improve fps?

My scene has too much static and dynamic geometries(about 64000 objects, 30 million triangles, 26 million vertices),if I do nothing, fps is only around I took the following steps to improve, but the results were not satisfactory:
(1) If I use batching, it will be 90 fps, that’s sound good, but this will cause preprocessing to take too long and this should not deal with dynamic geometry.
(2) If I use gpu instance, it will be 20 fps, I think it’s not good.
(3) If I use lod, some models cannot be processed, because their data is error(such as a point is not on the triangle).
(4) If I use hardware occlusion queries, fps hasn’t changed much. So I realize the compute shader by myself to cull objects which are blocked by querying the depth map which is created by filter, it can’t cull too many objects and the communication between gpu and cpu is time-consuming. In addition, the depth map’s information is different from cam.getScreenCoordinates().z, and the depth map’s information come from m_DepthTexture, I think it is weird.
(5) I’ve seen Unity’s ECS and I think it’s good for improving FPS, but does Zay-es have it?
Begging for help, I’m gonna cry.

Use better geometry that supports LOD, where appropriate.
Use fewer triangles… you current triangle count is crazy even with batching.
Use batching when appropriate but only when appropriate.
Use instancing when appropriate but only when appropriate.
Only load stuff into the scene that is actually visible.
Structure your scene graph in such a way that those things are possible.

There is no magic answer and anything more detailed would require knowing more about your scene.


To me, an ECS has nothing to do with graphics except that it promotes good game design where you’ve kept the “game objects” separate from the “view objects” and that means it’s easier to only create “view objects” for the “game objects” that are actually visible.

But I didn’t get the best results with these conventional solutions. In addition, you know why the depth information my GPU gets is different from my own calculation?

In fact, my scene is not certain, the scene can be imported by users, just like BIM software.

I’ve read articles about Unity ECS and it seems to say that ECS improves performance because it allows data to be stored continuously and is CPU-cache-friendly.

Game object data.

There is no magic pill for this stuff. This is why game development is hard. You can’t just load 60,000,000 triangles into a scene and expect one technique to solve your problem.

…and if Unity can do that then you should use Unity. Otherwise you are going to have to use a COMBINATION of techniques to get what you want.

But it sounds like what you want may be impossible. You haven’t really explained it so all I can go on is “users can load crazy things”… and that’s impossible.

Can you tell us a bit more about your use case? Can you provide some screenshots? Do you render objects that are far away?

For example, what about bim software like Revit?It has large models that render smoothly.Do you know how it works or anything else?

This is my screenshot about the case.

I wanted to be able to look down on it and certainly roam in it

I think that your use case of rendering buildings is not meant for real-time rendering. As far as I can see, Revit doesn’t do real-time rendering either. Maybe they use some space partitioning technique to render only visible parts of the building. It is simply too much to render all at once

i think its similar question “why voxel-worlds render so smoothly, while they have 99999999999 triangles in world”

its all about “techniques”.

For example LOD system. They probably just have some special way to “minimize” rendering objects/tris at camera view

ok…I don’t know much about spatial partitioning techniques. Can you tell me some useful ones?

It’s right,So is it achievable using conventional techniques?I simply used these techniques in the case.