Unless you are going to need to manipulate every object separately at runtime, generally it’s a much better idea to use a modeling program like maya, 3dsmax, or blender to create bigger models. Instead of having 400 separate tiles, model and import that roof, or even the entire building as one object. This greatly reduces the overhead that the game engine needs to render the objects in many cases. This is because for each object, a draw call is made to the GPU and these have a certain amount of overhead, so it’s often better to make a few draw calls than it is to make thousands.
Aside from modeling things in bigger sections, instancing is also able to reduce overhead a lot, but it does take a bit more to set up and is generally best for things that you will have a lot of in your scene but with different positions/orientations etc. Generally things like grass, foliage, trees, rocks are good candidates for instancing.
In your example, the reason I’d suggest larger models vs instancing is that the roof tiles probably won’t need to be changing position in respect to one another during your map creation or at runtime, so it’s much better to lower the overhead by importing that roof as one object. The other thing this opens up for you is the ability to handle some of that tile detail in your texture or material instead of using geometry. This can also be a tremendous method for lower overhead in respect to rendering.