For what you have described “so far”, I highly recommend you to do these things below:
1. Turn everything into meshes: By turning into meshes, you will decrease draw calls, better optimized complex shapes, less textures calls, better polycount control, better LOD system control (RenderFidelity) and more.
2. Turn on StreamingEnabled: StreamingEnabled helps you load and deload parts of the map where a player is not in anymore. There are many settings of StreamingEnabled that have their own purposes/ dowside and you can find out more in the document here:
3. Optimize collision Fidelity: Use box and hull Fidelity as much as possible because these allow the CPU to calculate much less accurate collision results. I encourage you to try for yourself and see if enabling these collision calculation affects the gameplay at all, if not then use them.
4. DO NOT USE UNIONS!!!: I will say this here and clear, do not ever use unions if you want to your game to run smooth. Unions are cheap and skill less and a useless feature for making games. Why would you use unions when you can just make the mesh in Blender? Meshes offer much better control and performance then unions. Unions poly calculation also TRASH and will have many excessive polycounts for no good reason.
5. Turn off CanTouch, CanQuery and CanCollide as many as humanly possible: These three affects performance so turn them off whenever you can.
6. Turn off FluidForces on instances when not needed: This new Roblox feature affects performance so turn them off if you’re not working with aerodynamic.
7. Use less accurate lightings: Avoid using Future technology because it is the most performance consume lighting tech with semi-realistic light calculation (the most realistic in Roblox studio). If you’re not going for hyper-realistic visual, I do not condone the use of this lighting tech.
8. Models instances together: Models things together help with draw calls, rendering and much more. I will let an official Roblox quote speak for this fact:
9. Use StreamingMode LOD system for Models: The quote above mentioned about something call LOD so I will continue from there. Models have an LOD system that you can utilize to decrease your instances polycounts. If you are asking what is LOD then it essentially look like this:
As you can visualise, the LOD is short for level of details. The LOD 3 is when the model is in all of its glory and renders maximum details. As the player go further away, the models decrease the details therefore lower the polycount and lag for the game.
10. Keep your eyes on post-processing effects: Post-processing effects like blur, ColorCorrection are laggy when use intensively.
11. Decreases player counts per server: Decrease the players count will decrease humanoid, moving parts,… which helps a lot with the game server performance.
Newbie Tips:
1. Get rid of as much dynamic physics calculation as possible: Do this by get rid of weldConstaint, anchore your instances,… this means that you decrease physic calculation which is good for performance.
Advanced optimization (requires scripting knowledge):
1. Make a system to turn off Light.Shadow: By disabling Light.Shadow, the CPU doesn’t need to calculate dynamically the shadow casted by instances in the game. Note: (As we’re on the topic of shadows rendering) contradict to popular believes, disabling an instance.CastShadow doesn’t boost the performance of the game due to CastShadow not being designed with the intension to do so.
Resource for this claim:
If you have any question regarding performance for your game. I can’t be more happy to help !