Performance Guidelines
This environment pack was produced for desktop/console platforms, as such the visual fidelity does not come free. Development was done on a laptop with an i7-4700HQ, a GTX765M (comparable to a desktop GTX650) and 8GB of RAM, where the demo scene performed around 40-70fps in the editor (higher in a build). On machine powered by a GTX960 it performed around 120fps.
At this time of writing, the average framerate in the downloadable demo is 93 FPS, across +1850 reports.
For your own project, the Profiler and Frame Debugger tools should always be consulted, these will tell you where performance is affected and by what. Learning to understand these tools is vital for optimizing performance, as otherwise it comes down to guesswork.
Instancing
All shaders support GPU instancing, which is available since Unity 5.6. It sees a huge performance improvement as it allows objects that share the same mesh/material to be rendered in a few draw calls. Be sure the “Enable Instancing” checkbox is ticked on the used materials. This already enabled on all materials by default. Always avoid non-uniform or negative scaling on objects, since this prevents them from being instanced.
It’s important to note that Static Batching has been disabled on the tree prefabs. Otherwise GPU Instancing will fail to work.
Shadows
Rendering shadows for an object (casting), requires to render it again, but from the perspective of the Directional Light. Meaning, an object will be rendered twice (2 drawcalls) if it falls within the shadow distance range (set in Quality Settings). GPU Instancing still comes into play here, so objects that share the same mesh/materials (eg. vegetation) will still only require 1 drawcall for shadows.
The impact can be mitigated by decreasing the Shadow Distance in Unity’s Quality Settings, Decreasing the amount of Shadow Cascades is also beneficial, but to maintain some shadow quality, you can increase the maximum shadow resolution.
Consider disabling shadow casting on the grass prefab, as a style choice.
Occlusion Culling
Also note how in the demo scene, the line of sight is broken at several points:
This is beneficial for Occlusion Culling, which avoids rendering objects that aren’t visible. Thus, reducing the rendering overhead.
https://docs.unity3d.com/Manual/OcclusionCulling.html
Terrain
Increasing the “Pixel error” value in your terrain settings, also has a huge impact on performance. In Unity 2018.3+ be sure to check the “Draw Instanced” checkbox.
Be sure the splatmap (referred to as “control texture” in the terrain settings) is not set too high. If you need a higher resolution it’s advised to split the terrain up into multiple pieces. Rather than using a single 2x2km terrain with a 4096px splatmap, this would incur a long loading time. These settings must be configured before starting to sculpt/paint the terrain, as they cannot be changed afterwards.
GPU instancing will be disabled for objects painted as terrain trees when light probes are enabled for them. So be sure to disable this in your terrain’s settings.
Vegetation Studio Pro
This package is something I cannot recommend enough if you plan on having a vast amount of vegetation. It fully utilizes GPU Instancing and culls all vegetation with minimal overhead (much faster than Occlusion Culling). All the FAE shaders are supported by this package.
The non-Pro version is no longer being tested on, or supported.