Performance & Optimization
Tidal is designed to scale from calm lakes to massive oceans, but some features are more expensive than others. This page explains the most impactful performance settings, what they do, and exactly where to find them in the Unity Editor.
Share a Single TidalCompute
The FFT wave simulation is the most expensive part of Tidal. In nearly all
cases, you should use one TidalCompute and
share it across all water bodies.
- Component:
TidalCompute - Assigned on:
TidalBody → Mesh Settings → TCompute
Multiple TidalBody instances can safely reference the same
compute simulation. This avoids duplicating FFT cost.
To calm specific areas, use Tidal Zones with Damping instead of additional simulations.
Mesh Settings (Geometry)
Mesh complexity directly impacts vertex count and draw cost. If you’re GPU/CPU bound due to geometry (especially in oceans), tuning these values can provide major performance wins.
- Component:
TidalBody - Inspector tab/section: Mesh Settings
- Fields: LengthScale, VertexDensity, LODLevels, UpdateMaterialProperties
LengthScale and VertexDensitySecondary win:
LODLevels -
LengthScale— Controls the base spacing/scale of the clipmap geometry. Increasing it generally reduces how dense geometry appears in the world (fewer vertices on-screen), which can improve performance. (Most impactful for large oceans.) -
VertexDensity— Controls the mesh resolution of each clipmap ring. Lowering this is one of the most effective ways to reduce vertex count. -
LODLevels— Number of clipmap rings (LOD bands). Fewer levels reduces generated geometry and update work, but can reduce far-distance coverage/tightness. -
UpdateMaterialProperties— When disabled, Tidal stops syncing some material properties every frame. This can save a bit of per-frame overhead, but may cause issues if you rely on features that expect continuous syncing (planar reflection setups can be the most sensitive).
UpdateMaterialProperties, keep it enabled for that body.
FFT Resolution (Simulation Quality)
FFT resolution controls the texture size used for wave simulation. Higher values produce more detail but significantly increase GPU cost.
- Component:
TidalCompute - Inspector section: Simulation
- Setting: FFT Texture Size
64 – Very performant (low-end GPUs)
128 – Default / balanced
256+ – High quality, expensive This is one of the fastest ways to improve performance.
Simulation Update Rate
Tidal does not need to update the FFT every frame. Reducing the update rate lowers GPU workload with minimal visual impact.
- Component:
TidalCompute - Inspector section: Rates and Callbacks
- Setting: Compute Hz
Lower values reduce cost but make wave changes react more slowly.
Dynamic FFT Rebuilds
When enabled, FFT cascades rebuild whenever spectrum values change. This is useful for dynamic weather systems, but unnecessary for static water.
- Component:
TidalCompute - Inspector section: Simulation
- Setting: Dynamic
Disabling this prevents rebuilds and reduces overhead. You can safely toggle it at runtime via code.
GPU Height Readback
GPU readback enables querying water height from C#, but requires GPU → CPU data transfers.
- Component:
TidalCompute - Inspector section: Rates and Callbacks
- Settings: GPU Cache Heights, GPU Cache Hz
Disabling this improves performance but removes access to
GetWaterHeight on the CPU.
Planar Reflections
Planar reflections are visually impressive but expensive. Disabling them is often the single largest performance win.
- Asset: Tidal Surface Material
- Inspector tab: Reflection
- Setting: Enable Planar Reflection
When enabled, additional tuning is available on:
TidalBody → TidalPlanarReflectionSubSystem
- Update Hz — lowers how often the reflection renders
- Downscale — reduces reflection texture resolution
- Distance — limits how far reflections render
- Shadows / Post — disabling these can be a big savings
Underwater Rendering
If the camera never goes below the water surface, underwater rendering can be safely disabled.
- Component:
TidalUnderwaterSubSystem - Location:
TidalBody - Setting: Has Underwater
Disabling underwater saves shader work and material synchronization.
Disable planar reflections → lower FFT resolution → reduce mesh complexity (VertexDensity/LengthScale) → reduce Compute Hz → disable GPU readback (if you don’t need CPU queries).