Tidal URP

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.

Rule of thumb: Most performance gains come from reducing FFT cost, mesh complexity, and planar reflections — not from disabling subsystems.

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.

Where to edit
  • 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.

Where to edit
  • Component: TidalBody
  • Inspector tab/section: Mesh Settings
  • Fields: LengthScale, VertexDensity, LODLevels, UpdateMaterialProperties
Biggest wins: LengthScale and VertexDensity
Secondary win: LODLevels
What each setting does
  • 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).
Tip: If you use planar reflections and notice odd behavior after disabling 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.

Where to edit
  • 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.

Where to edit
  • 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.

Where to edit
  • 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.

Where to edit
  • 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.

Where to edit
  • 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.

Where to edit
  • Component: TidalUnderwaterSubSystem
  • Location: TidalBody
  • Setting: Has Underwater

Disabling underwater saves shader work and material synchronization.

Recommended optimization order:
Disable planar reflections → lower FFT resolution → reduce mesh complexity (VertexDensity/LengthScale) → reduce Compute Hz → disable GPU readback (if you don’t need CPU queries).