Take a close look at the lighting in your scene and leave only what is really needed. For example - with the latest updates, Mesh Light is faster and cleaner than Area Light.
Modifier that reduces the polygon density by a percentage. It comes in handy when you need to quickly reduce the number of polygons in highly detailed meshes. It also preserves UVs in most cases, so the textures will stay in place. This is probably the easiest way to optimize your scene.
However, it loads the system when it counts polygons, which affects the work in the viewport, and sometimes the rendering. Therefore, it is better to apply the changes immediately, so as not to burden the system with further additional miscalculations. Yes, the process becomes destructive for the topology, but no one bothers you to save backups of the original models in a separate collection.
It is also important to understand that if you use the batching method described above, then the modifier applied to one instance will not be applied to others, and the linking of objects will break. If you want to apply a modifier to a collapsed object, then apply it to all at once. It is best to initially apply the modifier to the original object, and when you duplicate instances, it will automatically be applied to all. (or even better, apply it right away, and then multiply the instances) And, obviously, the values of the modifiers must be the same.
Do a retopology if suddenly you don't. But it is not always necessary, you should know. And if you feel that you are not enough to make it humanly with your hands, then just use another free and open source software - Instant Meshes. He will do everything for you, you will not even notice - it works, as they say, instantly. There is a Remesh Modifier in the blender, which will also do everything for you (but not the fact that it is good)
1. Prioritizing the size of textures
Prioritize - whatever is large or close to the camera is 4k or more, the rest is 2k or less.
2. Render textures not in .png
The easiest and most effective way to optimize textures.
.JPG files weigh much less (on average 4 times) - and this is the main argument. From a purely technical point of view, a .jpg contains much less information than a 16-bit .png. But this is not scary, and only plays a role when working with maps such as displacement, normal and height. Otherwise, textures in png are just a waste of resources.
As we remember, before starting rendering, all texture maps used in the scene are loaded into video memory. That is, if for one material you use, say, 5 images (base color, metallic, roughness, height, normal), and you have 21 textures, then 105 images are loaded into memory, respectively.
When you copy an object (just copy via Ctrl + C → Ctrl + V, the blender considers that this is a completely new object, and does not transfer the material, but creates a unique copy of it. For example, a copied object with a material called "ass" when inset will become an object with material "ass.001".
Moreover, all texture maps will also change. For example, if the original "ass" material had three maps:
then the new material - "ass.001" will have maps:
And these are completely different cards, and they will be loaded into video memory as separate images.
In general, keep the number of materials strictly equal to the number of unique elements.
In general, copy the elements using Shift + D to keep the original materials, or Alt + D if you want to tell the blender that the objects are completely identical. And use the menu Ctrl + C → Ctrl + V for everything else.
But what if you already see materials like "ass.027" in the list?
You can select all the same objects, which in our case are 28, press Ctrl + L, and link information about the object between them.
One thing: if objects have multiple links to other objects, those links can break everything.
Pressing Ctrl + L, you can link not only all information about objects, but also separately information about materials (Make Links → Materials - Such a knight's move will simply leave the same material on all n objects, and will not break anything.)
The question remains:
what about the orphaned 27 copies of the material?
Unnecessary materials and textures should not be stored in the project. This may not have a huge impact on performance, but it will help to some extent. In order to remove all unnecessary materials, objects, etc. from the project in the blender there are purge / purge all buttons in the Orphan Data subsection