So a mesh Instance has the advantage of being easily replicated on the screen with minimal performance drawbacks, essentially because they are all the same, for the CPU, all that grass in Sintra is only 16 triangles. You have 3 ish options:
1 - Use MultiMeshInstance3D node: this is godot node, its really fast but u have a limit on the ammount of instances as it's not really meant for grass and stuff like that, maybe for 100 trees in flat surface or other other real-time usages
2 - You can write your own instancer: pseudocode for this would be:
- Get every grass point in space
- Add each point to an array
- Feed the array with the mesh to a Draw call
I have never done this on godot but this is the better way to go if you have time and you wanna get the best performance
3 - Use the Proton Scatter Plugin: https://github.com/HungryProton/scatter
This is what I used, it's very easy to use, it's not amazigly optimized but works as a middle ground where you can get a large amount of grass and not have to hack the code as much. Then you create chunks, you read where the camera is, depending on each chunks distance it will cull or have a lower fidelity mesh. And that's it