Video Tutorials
How To
Interface Overview
Assets Workflow
Settings and Preferences
Working With Projects
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Landscape Tool
Using Editor Tools for Specific Tasks
Extending Editor Functionality
Built-in Node Types
Light Sources
World Objects
Sound Objects
Pathfinding Objects
Setting Up Development Environment
Usage Examples
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine Tools
Double Precision Coordinates
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
Content Creation
Content Optimization
Art Samples

Configuring Landscape Terrain Visualization and Performance

The global Landscape Terrain settings (and the corresponding console parameters) provide set of parameters for fine-tuning of the Landscape Terrain in order to achieve stable work, high performance and great level of detail. All settings are interdependent and have huge influence on performance, therefore they are to be considered to the full extent.

The vast majority of parameters causes the Landscape Terrain object to reload all its graphic data, which is unacceptable at run time. The Making it Run-Time section lists parameters that are safe to be changed at run time.

Render Parameters#

ObjectLandscapeTerrain doesn't cast shadows and self-shadows from light sources. Only Screen-Space Shadows from light sources are supported at the moment.

First, the Texel Size parameter defines the maximum possible density of the components of the main virtual texture. Set this value (from 0.0001 to 1 unit) to limit the density for albedo, normal and height components up to 1 mm per pixel.

The geometry of the landscape terrain is split down to a number of detail levels using adaptive hardware tessellation. The intensity of displacement is controlled by the group of geometry parameters: adjust the Progression value to configure displacement progression with the distance and control the density of tessellated geometry separately using the Polygon Size parameter (in comparison with the Texel Size the maximum value is used).

For optimization purposes you can increase the Subpixel Reduction value to get rid of too small polygon patches. This feature is performed on-the-fly, so make note that high values may cause slight but noticeable visual artifacts when the camera moves.

Levels of tessellation detail can be faded with each other via increasing the Intensity of LODs fading to remove sharp edges between areas with different geometry density.

The Culling Parameters provide additional optimization techniques, such as Backface Culling and Frustum Culling.

During rasterization the renderer selects the mip-level of textures according to the distance to the camera, as well as to the angle of the surface to the camera, i.e. the screen size of the polygon: distant polygons and polygons that are not faced right to the camera are rendered at a lower quality. The Texture Filtering mode controls the way of treating such situations, it has the following presets:

  • Low — use the lower mip-level. This option has the best performance but low quality: there is a noticeable edge of mip-levels change.
  • Medium — use the higher mip-level. Though the quality is better, the edge still remains. This option has a moderate effect on the performance.
  • High — linearly interpolate adjacent mip-levels. This option uses appropriate mip-levels and interpolates pixels, so the edge between mip-levels disappears. This is the most performance-consuming mode.

Comparison of filtering modes: Low, Medium, High. Settings were degraded for obviousness.
The Low and Medium modes may provide slight flickering due to low filtering quality. Use TAA to get rid of perceptible artifacts. If your project requires TAA to be disabled, try decreasing overall detail quality.

You can force selecting a higher-quality mip-level by using the Detail Level By Angle parameter:

Target Resolution defines the maximum viewport resolution available for the Landscape Terrain renderer, which guarantees that VRAM limits will not be exceeded if the Application is launched with a higher screen resolution. When being equal to the current viewport size, the parameter provides pixel perfect quality. Decrease it, to gain more performance at a cost of visual quality.

The amount of VRAM used is highly affected by the viewport resolution. Thus, when developing a project using a Landscape Terrain, you should check performance and memory consumption at the screen size of the target platform.

The final quality of details (if there are some on the Landscape Terrain object) is defined by the resolution of the detail textures: albedo, height and additional mask. The available range is [0, 8]:

  • 064×64 pixels,
  • 816384×16384 pixels.

Amount of video memory currently consumed by detail textures is available in Rendering Performance Profiler and using the Render Textures helper:

Terrain Details Texture section
Also, make note that visual artifacts are possible on huge distances from the origin (more than 5000 km) due to precision loss. This can be fixed by lower Texel Size values, however, be ready to lose a lot of details.

By changing the Visibility Distance value you can control the distance from the camera on which the surface of the Landscape Terrain is visible.

Streaming Configuration#

The Landscape Terrain is a sophisticated and powerful system for landscape simulation featuring scopes/binoculars support, multiple cameras and run-time modification. Using these advantages may significantly increase performance consumption and requires careful adjustment.

Flexible streaming settings make it possible to configure terrain rendering even for computers with a limited VRAM capacity, but these settings depend on the content used (distances, level of detail, etc.) and requirements (the number of cameras and viewports, etc.) and are to be adjusted for each project individually.

On the very loading of a world with a Landscape Terrain and later, when the camera moves and the point of view is changed, graphic data is being asynchronously loaded. Asynchronous data streaming of Landscape Terrain implies that tiles appearing in the viewport are first cached into RAM and video memory, and afterwards passed to the Virtual Texture to be rendered on the screen. This process is performed on demand, so appropriate streaming settings are required for seamless loading of graphic data.

Landscape Layers#

Only visible Landscape Layers are taken into account when streaming graphic data. Thus, a Landscape Layer Map with a higher Order value would overlap other ones and take part in data streaming.

A schematic representation of several Landscape Layer Maps overlapping each other.
The one with the higher Order value will overlap the other ones and its data will be loaded.

Streaming is based on using previously loaded geometry to define the visible areas of terrain. The Culling flag of Landscape Layer Map enables uploading preliminary low-level data of the map to CPU (about 2 meters per pixel) to be used for checking what tiles are to be streamed next. For maps with the Culling option disabled, only high-detail data of the base map is uploaded on CPU, provided there is data loaded in the visible area.

Best Practice
Disable the Culling flag for landscape layer maps that contain high-detail graphic data (having an insignificant difference in height from the base low-detail layer, e.g. centimeters, like vehicle tire tracks) and are used as insets (placed within the bounds of another layer map to provide a higher level of detail) to exclude them from loading preliminary low-level data and reduce load on CPU.
For landscape layer maps that form basic shape of the landscape keep the Culling flag enabled, otherwise no graphic data will be loaded.

Virtual Texture Size#

The overall terrain memory consumption and intensity of data streaming depend on the size of the Virtual Texture components (Albedo, Normal and Height). Higher Texture Memory Size lets more tiles to be presented in video memory enabling you to have more tiles loaded at a moment. This parameter has the highest effect on the amount of VRAM consumption and is defined in the [0, 1] range, where:

  • The lowest value of 0 corresponds to the size of 3072×3072 pixels for each of 3 Landscape Terrain textures (~140 MB of VRAM),
  • The highest value of 1 stands for the size of 16384×16384 pixels for each of 3 Landscape Terrain textures (~3.1 GB of VRAM).

With lower size the Virtual Texture requires less video memory but doesn't provide enough capacity for high-detail mip-levels resulting in poor performance, low detail level and fast flickering of the Landscape Terrain surface due to continuous reloading of tiles. Check video memory consumption using the Terrain Virtual Texture counter of Rendering Performance Profiler.

Cache Settings#

The more the CPU Cache Size, the faster intersection and collision detection is, overall loading of tiles is faster. The GPU cache contains graphic data of tiles to be transferred to the GPU for rendering. It is also accountable for fast work of GPU-based run-time modification of the Landscape Terrain surface. Control the volume of GPU cache using the GPU Cache Size parameter.

Check memory consumption using the Terrain Cache CPU and Terrain Cache GPU counters of Rendering Performance Profiler.

It's highly recommended not to set the highest possible cache memory limits as they may be slightly exceeded during run time.

GPU cache has the Life Time for landscape tiles. It can be increased to speedup landscape modification (less cache misses), but this will increase memory consumption.

If you modify a layer map by using Brush Editor or your project implies run-time terrain modification, increase the cache memory limits and cache lifetime for better performance.

Tiles Loading#

Even having high cache memory limits and the size of the virtual texture, you can have a bottleneck in the speed of tiles being loaded. Control the number of tiles loaded to memory per each frame via the Tiles Load Per Frame parameter. The Tiles Update Per Frame parameter controls the number of tiles updated and presented on the Landscape Terrain per each frame. Make note that by using high values of these parameters you will increase load on CPU and GPU cache and the Virtual Texture but make streaming of tiles really fast.

Use the Landscape Terrain VT Streaming helper (or the render_show_landscape_terrain_vt_streaming 1 console command) to enable visualization of tiles being streamed. In this mode colored areas show the tiles that are currently being rendered in a lower resolution until the highest mip-level is loaded.

Streaming of tiles

Making It Run-Time#

Asynchronous nature of the Landscape Terrain system makes it possible to modify the landscape surface at run time: vehicles leaving tracks while moving, procedural pit holes or even an excavator digging trenches are easy to simulate by using a separate Landscape Layer Map.

It is crucial to understand that operating a Landscape Layer Map is not the same as operating a mesh or another familiar type of object. If any of the events listed below occurs, it causes the affected tiles of the Landscape Terrain to be reloaded with the changes taken into account:

Loading of tiles data is time-sliced and not performed momentarily, neither is reloading of data. Thus, when making any changes to the set of Landscape Layer Maps in the world, it is necessary to minimize the number of modifications. As an example, you can substitute a crater with a decal or a mesh to hide the moment when the crater abruptly appears.

Control the number of reloaded tiles per each frame via the Tiles Reload Per Frame parameter, in all cases described above it might be worth increasing this value for better performance. You may also need to increase the GPU Cache Update Limit and the GPU Cache Life Time for better performance.

Nonetheless, don't forget to check performance consumption of applied changes by using Rendering Performance Profiler. The Terrain Reload Bounds counter shows the number of unprocessed events causing restreaming some area of the Landscape Terrain surface. Obviously, a big number of tiles can be subject to reloading at the same moment due to these changes, so the Terrain Reload Tiles counter will help you estimate this number.

Rendering Performance Profiler output

Changing most render and streaming settings, as well as operations on Landscape Terrain Details (switching detail masks on and off, assigning materials to details or specifying textures) initiate reloading of all Landscape Terrain graphic data, which is unacceptable at run time. The following parameters are safe to be changed when running a project using Landscape Terrain:

  • Cache parameters
  • Culling settings
  • Geometry Fade Lods parameter
  • Holes toggle
  • Geometry Subpixel Reduction
  • Detail Level By Angle
  • Target Resolution
  • Tiles Load Per Frame, Tiles Reload Per Frame and Tiles Update Per Frame parameters.

As an example, you can modify these parameters to achieve variable level of detail for different fields of view of the camera. Observing Landscape Terrain through a camera with a narrow FOV may drop performance and make streaming issues noticeable.

Perform the following steps:

  1. Set the lowest camera FOV your project requires. Degrade the quality a bit for better performance by tweaking safe parameters, e.g. Detail Level By Albedo, Target Resolution and Geometry Subpixel Reduction.
  2. Switch to the highest possible camera FOV. Adjust the listed render settings.
  3. Use coding or scripting to linearly interpolate between target values if the FOV is changed gradually or simply change the values for instantly changing field of view of the camera.

Configuring Landscape Terrain Streaming#

To sum up, when configuring a Landscape Terrain pay the closest attention to the following steps:

  1. Prepare all cameras in the project, open all viewports if your project requires more than one. Two cameras observing the same area of the terrain at the same time don't increase the resources consumption (however, there may be performance drop due to rendering) while cameras that visualize different parts of the landscape will require more performance-consuming settings.
  2. Adjust the Texture Memory Size so the size of all terrain render textures fits your VRAM and the terrain surface doesn't have noticeable flickering.
  3. Check the performance and resources consumption using the Rendering Profiler tool and the Render Textures helper at the full screen size and resolution of the target platform, specify the maximum Target Resolution.
  4. Adjust cache memory limits and the render parameters to avoid visual artifacts, streaming errors and performance spikes.
  5. Tweak the streaming parameters, especially if your project implies run-time terrain modification.

OpenGL Settings#

Though DirectX is the recommended graphic API for the Landscape Terrain system, OpenGL is also supported but has quite serious limitations: asynchronous operations are not available regarding the Landscape Terrain system. Additional setup may be required in order to achieve acceptable performance. Consider following these suggestions:

gl_terrain_use_async 0 Disable asynchronous data loading to get rid of spikes at the cost of the loading speed.
gl_terrain_waiting_frames Number of frames to wait for streaming. Increase this value (4-16 frames) to avoid more performance spikes and slightly improve the loading speed by forcing deferred data loading that imitates asynchronous data streaming without synchronization points.
render_landscape_cache_cpu_size Increase the memory limit of cache.
render_landscape_cache_gpu_size Increase the memory limit of GPU cache.
render_landscape_cache_gpu_life_time Increase the lifetime of GPU cache. Keep noted that memory limits of cache may be exceeded in the case when the lifetime is highly increased.
render_landscape_terrain_vt_tiles_load_per_frame Decrease the number of loaded tiles per frame to 1 to get rid of performance drops. Low values make streaming slower and more noticeable.
Last update: 2021-02-17