On opening your scene, I see that we are not on the "around 800k vertices" already:
Just about a third more, but if you look at a more meaningful data: it's 2M3 triangles. Not a light scene to begin with.
Looking at your scene, I see some areas of improvements. But one bigger than the others:
Simulations are running
When running the playback, during the first time going through the play range I am around 18-20fps, but once it loops back to the beginning I jump to ~400 fps (with unlocked FPS for benchmark purposes, nobody needs nor wants to run at 400fps in the viewport).
This means, things are getting cached down during the first time each of the frames are played (hence the gain of speed once all frames are done caching). And usually, that means physics simulations.
I don't see where you use them, but usually you do simulations separately in an isolated work scene for that sole purpose.
Deleting rigid body simulations seem to do the trick in your scene. To do this, go to Properties Editor > Scene tab > Rigid Body World and click Remove Rigid Body World:
This should already do a lot.
But we can do more if you need to.
For the next steps, read entirely before doing anything to avoid issues down the line.
Disable Auto Smooth
Autosmooth can be nice for obtaining the combination of flat and smooth shaded edges, but it's heavier in calculations, is recalculated on every frame for animated objects, and is; t compatible with GPU subdivision.
So I suggest selecting all objects, go to Properties Editor > Mesh Data tab > Normals panel, hold ⎇ Alt down while unchecking Auto Smooth so that it propagates to all selected objects.
You also have some objects with weighted normals modifiers. Not the least impactful modifiers, you might want to remove them or apply them.
You have a lot of objects that are exactly the same. Instead of using full copies, you could use instances. Instead of loading identical objects dozens of times, you load it once for all of its instances. This drastically reduces memory usage, loading and calculation times.
When you want to duplicate an object, instead of using the Duplicate operator with ⇧ ShiftD, use ⎇ AltD to instantiate.
For objects, you already duplicated but would like to turn into instances:
- Select identical objects, like your chairs
- Press ⎈ CtrlL > Link Object Data
You could also apply this logic to duplicated parts within a single object if you want. Much like you did here with these 13 identical bars generated from one bar and an array modifier:
If you have identical objects or need to apply some modifiers, do all the other steps before turning them into instances. As you can't apply modifier on instances.
Objects with a lot of unnecessary geometry
To illustrate, I set the viewport shading to flat white, and enabled the wireframe overlay:
ALL the black you see here is just raw wireframe. By raw, I mean it doesn't show any mesh generated by a subdivision modifier, for example.
This tiny rack alone is 65k triangles, and I can't even distinguish them in close up:
Most of this geometry is pretty much indistinguishable in rendering until you are close enough, so you could probably could remove a lot of it and be fine.
And ideally, even if you get close enough, you should have the bulk of your geometry handled by subdivision modifiers instead. Firstly because you can change their level of subdivision manually or automatically (like by using the Simplify like you already do), but also because you can let your GPU handle them for better performances:
If I were you, I would do a pass on all your objects to reduce their mesh density and chose which ones to add a subdivision modifier.
Before doing this: make sure to identify which objects you want to turn into instances. Do these first, then edit the mesh and modifiers of only one of the identical objects. And when selecting objects to turn them into instances : select the one with the new geometry last, so that it is active and is the one used as instances in the others.
Some might be easy to do with just a couple modifiers. Like your chairs:
This could be a lighter mesh with a subdivision modifier instead.
Since the mesh is even and quite obviously obtained from a raw mesh plus a subdivision applied onto it, you can sort-of undo the process by first adding a Decimate modifier, un Un-Subdivide mode and even number of iterations:
Not perfect, but serviceable most of the time, and you can fix the topology afterward if you want.
Apply that modifier, then add a subdivision modifier.
Or you reduce the amount of decimate operations to the highest number you can without weird topology, apply it, then manually remove what you don't need.
Some other objects might be tricky to handle by semi-automated ways, like your cupboards:
Unless you go at it by hand, it will be hard to press a button and not lose the nice curves. But it's still possible to do at least some quick fixes that won't be noticed easily.
Let's try the handle button:
- ↹ Tab into edit mode
- Press 2 to toggle edge selection
- Hold ⎈ Ctrl⎇ Alt and click an edge to select a ring loop:
- Menu Select > Checker deselect to deselect every other edge
- Menu Select > Select Loops > Edge Loops
- ⎈ CtrlX to dissolve the edges and their vertices.
- ⎇ Alt LMB some edges in the other way to select their loops and dissolve them, and you can get something like this:
Apply this kind of logic to the whole object, and in 30 seconds you end up with this:
- In edit mode you can hit F3 and search for "unsubdivide" to unsubdivie a selection of mesh, like does the modifier but with your control on the area of effect
- To not spend your life clicking the same menus and sub-menus every time (like the checker deselect and loop select), I suggest you RMB them and Add to Quick Favorites Menu. This menu is available via Q and you can add/remove anything you want at any time. A huge time savior when doing repetitive tasks.
It's not much, but if you do this in a few selected places enough, with all the duplicated meshes you have, it will help a lot.
If you do this even sparingly, you will get improvements. In my case, I did a quick pass on a few objects.
The scenes statistics are very different:
And even though it struggles to playback the frame range the first time, after it went through it once to cache everything, the fps go from ~20 to 400-500.
The difference might not feel like much on my system because we are already at 400 to begin with. But on another system where you could have barely reached 12fps, that could mean hitting the 24fps constant.
Last but not least:
In the outliner, enable the "Disable in viewport" restriction toggle:
When you want to hide objects or collections to have better performances, use that screen icon instead of the eye icon.