Skip to content

Object Culling and Static Batching

Two performance systems in the Unturned™ Level Editor control how many objects are rendered and how efficiently they are drawn: manual object culling and static level batching. Manual object culling allows the map author to define volumes in the world where objects use a reduced render distance, hiding distant objects that do not need to be visible for gameplay. Static level batching groups objects that share materials into combined meshes, reducing the number of GPU draw calls the CPU must issue. Together, these two systems can significantly improve frame rate on object-dense maps without requiring the map author to remove objects or reduce visual quality.

This article is a procedural tutorial covering both manual object culling and static level batching. It describes the culling volume placement workflow, the per-object render distance override system, the legacy LOD fields for automatic culling, the batching version configuration in Config.json, the material eligibility rules that determine which objects can be batched, the batching artifacts that occur with animated objects, and the performance testing workflow for validating culling and batching changes. The article assumes the reader has completed the interactable object configuration in the preceding article.

Culling tool open in the Unturned Level Editor showing a culling volume bounding box around a cluster of objects

Prerequisites

  • A map with completed object placement, including all structural and decorative objects. The editor must be open and the map must have terrain data initialized.
  • Familiarity with the editor toolbar, viewport navigation, and the Culling tool location.
  • A text editor for modifying the map's Config.json file.
  • Understanding of the frame rate and draw call relationship: more draw calls = higher CPU load = lower frame rate.

What you will learn

  • How manual object culling works and what it affects.
  • How to add and configure culling volumes in the Level Editor.
  • How to configure per-object render distance using the legacy LOD fields.
  • How to exclude specific objects from culling volumes.
  • How to enable static level batching in the map's Config.json.
  • What material eligibility rules determine which objects can be batched.
  • When batching improves performance and when it degrades performance.
  • How to exclude animated objects from batching to prevent ghost images.
  • How to test culling and batching performance changes in single-player.

Background: how culling and batching work

Manual object culling and static level batching are independent performance systems that can be used together. Culling reduces the number of objects rendered by hiding those beyond a distance threshold. Batching reduces the CPU cost of rendering by merging meshes with shared materials into combined draw calls.

As shown in the flowchart above, culling and batching target different stages of the rendering pipeline. Culling prevents objects from being sent to the GPU at all. Batching reduces the number of draw calls required to render the objects that are visible. When both systems are active, the benefits are additive.

Manual object culling

Manual object culling uses bounding boxes placed in the Level Editor to define regions where objects should be rendered at a reduced distance. Objects inside these volumes are not drawn beyond the volume's configured render distance.

How culling volumes work

A culling volume is a rectangular bounding box that the map author places in the world. Every object that intersects the volume is affected by the volume's culling settings. When the camera moves beyond the volume's culling distance, all affected objects disappear from the viewport.

Adding a culling volume

Step 1: Click the Culling tool icon on the Level Editor toolbar. The Culling panel opens on the right side of the editor.

Step 2: Click Add Volume in the Culling panel. A new bounding box appears in the viewport at the world origin.

Step 3: Position the volume using the move tool. The volume should enclose the objects that should be culled at a shorter distance.

Step 4: Resize the volume using the scale tool. The volume should fully contain the target objects without extending into areas occupied by objects that should not be culled.

On-screen appearance: The culling volume is displayed as a wireframe box with a translucent blue fill. Objects inside the volume are outlined when the volume is selected. The Culling panel shows the volume's position, size, and culling distance.

Configuring culling distance

Step 1: Select the culling volume.

Step 2: In the Culling panel, locate the Culling Distance field.

Step 3: Enter the distance in world units at which objects inside the volume should be culled. The cohort recommendation for decorative objects is 30-60 units.

Object type inside volumeRecommended culling distanceRationale
Small decorative props (rocks, debris)30-40 unitsThese objects do not need to be visible at long range
Medium props (barrels, crates, furniture)40-60 unitsMedium objects may be gameplay relevant at mid-range
Large props (vehicles, containers)60-80 unitsLarge objects may serve as cover at mid-range
Foliage instancesManaged by foliage systemFoliage has its own LOD system; do not include in culling volumes

Step 4: The culling distance is measured from the camera to the center of the culling volume. Objects inside the volume are visible when the camera is within the culling distance and hidden when the camera is beyond it.

Previewing culling effects

Step 1: In the viewport options menu, enable Preview Culling. The effect is enabled by checking the "Preview Culling" checkbox in the view options dropdown.

Step 2: All objects inside culling volumes are hidden in the viewport. The wireframe boxes of the culling volumes remain visible.

Step 3: Move the camera in the viewport. Objects inside volumes appear or disappear based on the camera distance to the volume center.

Step 4: Disable Preview Culling when not actively editing culling volumes to return to the full scene view.

Multiple culling volumes

Multiple culling volumes can be placed in the same map. Each volume has its own position, size, and culling distance. Objects that intersect multiple volumes use the shortest culling distance from the intersecting volumes.

The cohort recommendation for culling volume placement is:

  • One volume per building interior for interior decorative objects.
  • One volume per 100x100 unit area for outdoor decorative objects.
  • No culling volumes over gameplay-critical areas (objective locations, landmark buildings, navigation reference points).

Removing a culling volume

Step 1: Select the culling volume in the viewport or in the Culling panel's volume list.

Step 2: Click Remove Volume in the Culling panel, or press the Delete key.

Step 3: The volume is removed. Objects that were previously affected by the volume revert to their default render distance.

Per-object culling exclusion

Some objects should never be managed by culling volumes. Large objects that serve as gameplay cover (shipping containers, large walls, landmark buildings) must remain visible from full distance to provide spatial reference for players.

Excluding objects from culling

Step 1: Open the object's .dat file in a text editor.

Step 2: Add the following line to the file:

Exclude_From_Culling_Volumes true

Step 3: Save the .dat file. The object is excluded from all culling volumes on the map.

The Exclude_From_Culling_Volumes field is an asset-level property. It applies to every instance of that object across the map. For selective exclusion of individual instances, the recommended approach is to not place those instances inside a culling volume.

Objects that should be excluded from culling

Object typeWhy it should be excluded
Landmark buildingsPlayers use them for spatial navigation at distance
Large cover objectsGameplay-important cover must be visible at engagement ranges
Navigation markersObjects that mark routes, exits, or points of interest
Spawn pointsZombie, animal, and item spawn points must be active at all distances

Legacy LOD fields for automatic culling

Objects that are not inside manual culling volumes can still participate in culling through the legacy LOD fields. These fields create automatic culling volumes based on the object's mesh bounds.

Configuring legacy LOD fields

The following fields are set in the object's .dat file:

FieldTypePurpose
LODenumVolume calculation mode: Mesh (uses renderer bounds) or Area (uses Occlusion Area size)
LOD_BiasfloatMultiplier for the default 64-meter culling distance. A value of 0.5 gives 32 meters; 2.0 gives 128 meters
LOD_Center_X/Y/ZfloatOffset of volume center relative to object transform
LOD_Size_X/Y/ZfloatSize multiplier in Mesh mode

Configuring LOD_Bias for a specific object

Step 1: Open the object's .dat file.

Step 2: Add or modify the LOD field. Set it to Mesh to use the object's renderer bounds.

Step 3: Set the LOD_Bias field. The default value is 1.0 (64 meters). Adjust based on the object's gameplay role:

Object gameplay roleLOD_BiasEffective culling distance
Decorative, never gameplay-relevant0.532 meters
Standard object, visible at moderate range1.064 meters
Gameplay-important, should be visible at range1.5-2.096-128 meters
Landmark, never culled3.0+192+ meters

Step 4: Save the .dat file and reload the map.

For the complete legacy LOD field reference, see Manual Object Culling Reference.

Culling volume placement by map area type

Different map areas benefit from different culling strategies. The table below provides cohort-validated culling configurations for common area types:

Map area typeCulling volume sizeCulling distanceObjects affected
Building interiorMatches building footprint20-30 unitsFurniture, decoration, clutter
Outdoor decorative cluster30x30 units per volume40-60 unitsRocks, bushes, small props
Urban block50x50 units per volume50-70 unitsStreet furniture, signs, debris
Forest undergrowth40x40 units per volume30-50 unitsGround-level foliage, fallen logs
Industrial zone60x60 units per volume60-80 unitsPipes, machinery parts, crates
Residential area50x50 units per volume50-60 unitsGarden decorations, fences, mailboxes

The culling distance should be set relative to the player's expected engagement range in that area. A building interior where players clear rooms at close range needs a shorter culling distance (20-30 units). An outdoor industrial zone where players engage at medium range needs a longer culling distance (60-80 units).

Static level batching

Static level batching is a Unity engine performance optimization that combines multiple meshes sharing the same material into a single GPU draw call. In the Unturned™ level system, static batching is controlled through the level's Config.json file.

Enabling batching

Step 1: Navigate to the map's root folder and open the Config.json file in a text editor.

Step 2: Add or modify the following property:

json
"Batching_Version": 2

Step 3: Save the Config.json file.

Step 4: Load the map in the editor. When batching is enabled, the engine processes eligible renderers at level load time and groups them by material.

What batching affects

Batching reduces the CPU cost of rendering by reducing the number of draw calls the CPU must issue before each frame. The GPU workload is largely unchanged because the same number of triangles are rendered.

Batching affects:

  • Mesh renderers on static objects that share the same material.
  • The number of draw calls submitted per frame.

Batching does not affect:

  • Collision detection (collision uses a separate system).
  • Navmesh calculation (navmesh uses collision geometry, not render geometry).
  • Object interaction behavior.
  • Lighting or lightmap data.

Material eligibility for batching

For an object to be eligible for batching, its mesh must use a material that is shared with at least one other object in the scene. Objects with unique materials (no other object uses the same material) cannot be batched and are always rendered as individual draw calls.

Material sharing scenarioBatching result
100 objects share the same materialAll 100 objects merged into 1-2 draw calls
50 objects share Material A, 50 share Material B100 draw calls reduced to 2-4 (one per material)
100 objects all use unique materialsNo batching possible; 100 individual draw calls
Mixed: 80 share a material, 20 are unique80 objects batched, 20 remain as individual draw calls

The performance gain from batching is greatest when a large number of objects share a small number of materials. This is the most common scenario in Unturned™ maps because vanilla assets are designed with material sharing in mind.

When batching degrades performance

Batching has two cases where it can degrade performance:

  1. Increased memory footprint: Merged meshes must be stored as a single combined mesh, which requires more memory than the sum of the individual meshes. The combined mesh has shared vertex data that cannot be unloaded per-object. On maps with very large object counts (5000+), the additional memory consumption can cause out-of-memory errors on 32-bit clients.

  2. Texture atlas overflow: On maps with many unique materials, the texture atlas (which merges textures to enable batching) can exceed the GPU's maximum texture dimension (typically 4096x4096 or 8192x8192). When the atlas overflows, batching fails for the materials that do not fit. The engine logs a warning in the Unity console when atlas overflow occurs.

Performance testing with batching

Step 1: Load the map in single-player with batching disabled.

Step 2: Navigate to the most object-dense area of the map. Open the performance overlay and record the draw call count and frame rate.

Step 3: Enable batching by setting Batching_Version 2 in Config.json.

Step 4: Reload the map. Navigate to the same object-dense area. Record the draw call count and frame rate.

Step 5: Compare the two measurements. If the draw call count has decreased by at least 20% and the frame rate has improved, enable batching for the published map. If the improvement is less than 5% or the frame rate has decreased, disable batching.

The cohort recommendation is to test batching in single-player before enabling it on a published map. Batching behavior varies by map geometry, object density, and material variation.

Excluding objects from batching

Some objects are incompatible with batching. Animated objects, objects with runtime-moving renderers, and objects that use Unity Event components to modify material properties at runtime must be excluded from batching.

Excluding an object from batching

Step 1: Open the object's .dat file in a text editor.

Step 2: Add the following line to the file:

Exclude_From_Level_Batching true

Step 3: Save the .dat file.

Objects with Exclude_From_Level_Batching true are still rendered normally but do not participate in the batching pass. They incur the full cost of their individual draw calls.

Objects that must be excluded from batching

Object typeReason for exclusion
Doors (animated)Animation moves the mesh; batched mesh is static and does not update
Lights with toggle animationMovement during state change conflicts with static batch
Moving platformsRuntime transform changes are not reflected in batched mesh
Animated machineryAny object with a runtime-changing transform or animation
Water surfacesWater uses a special shader that is incompatible with batching

Failure mode: animated objects produce ghost images

Animated objects that are included in the batching pass produce ghost images at their original position while the animation moves the visual representation elsewhere.

What it looks like: A door that opens remains visible at its closed position (the ghost image) while the animated mesh moves to the open position. The door appears to be in two places simultaneously.

Root cause: The batched mesh is static. When the animation moves the door's renderer, the batched mesh remains at the original position. The engine renders both the batched mesh (static, at original position) and the animated renderer (moving, at new position).

Resolution:

Step 1: Open the door object's .dat file.

Step 2: Add Exclude_From_Level_Batching true.

Step 3: Save the file and reload the map. The door is no longer batched and its animation no longer produces a ghost image.

Step 4: Verify that all animated objects on the map have the batching exclusion field set.

Failure mode: batching does not reduce draw calls

Batching that shows no measurable draw call reduction has been applied to a scene where most objects use unique materials.

What it looks like: The draw call count in the performance overlay is similar before and after enabling batching.

Root cause: Batching can only merge meshes that share the same material. If every object on the map uses a unique material, there are no material groups to merge.

Resolution: Review the map's object material usage. The largest batching gains come from objects that use commonly shared materials: building walls, container surfaces, road surfaces, and generic props. If the map is composed primarily of unique objects, batching provides minimal benefit. The cohort recommendation in this case is to focus on culling volumes for performance improvement instead.

Failure mode: out-of-memory errors after enabling batching

The game client crashes with an out-of-memory error after batching is enabled.

What it looks like: The map loads with batching enabled. During load or shortly after entering the most object-dense area, the game freezes and crashes. The crash log shows an out-of-memory error.

Root cause: The combined batched mesh exceeds the available memory on the client. This is most common on 32-bit clients with limited address space.

Resolution:

Step 1: Disable batching to confirm the crash is related to batching.

Step 2: Reduce object density in the most object-dense areas. Fewer objects means smaller batched meshes.

Step 3: Reduce the number of unique materials used by the objects in the dense area. Consolidating materials creates fewer, larger batch groups.

Step 4: If the crash persists, disable batching for the published map and rely solely on culling volumes for performance optimization.

Failure mode: culling volume hides gameplay-important objects

A culling volume that is too large or too aggressively distanced hides objects that players need to see for gameplay.

What it looks like: At a moderate distance, buildings, cover objects, or navigation landmarks disappear. Players cannot see threats or navigation references.

Root cause: The culling volume's distance is too short for the objects it contains, or the volume extends beyond the intended target area.

Resolution steps:

Step 1: Select the culling volume and increase the culling distance in the Culling panel. The cohort minimum for gameplay-important areas is 60 units.

Step 2: If increasing the distance does not resolve the issue, resize the culling volume to exclude the gameplay-important objects.

Step 3: For large objects that should never be culled, add Exclude_From_Culling_Volumes true to their .dat file.

FAQs

Can culling volumes and batching be used together?

Yes. The two systems are independent and their benefits are additive. Culling reduces the number of objects rendered per frame. Batching reduces the draw call cost of the objects that remain visible. The cohort recommendation is to configure culling volumes first, then enable batching.

How many culling volumes should I place on a map?

The practical maximum is 20-30 culling volumes per map. More volumes increase the culling evaluation cost each frame. Place volumes strategically over object-dense areas and avoid overlapping volumes.

Does batching affect navmesh or collision?

No. Batching merges mesh renderers only. Collision and navmesh use separate systems that are unaffected by batching changes.

How do I check if batching is working?

Load the map in single-player with batching enabled. Open the in-game performance overlay. The draw call count should be noticeably lower compared to the same map with batching disabled. A reduction of 30-50% in draw calls indicates effective batching.

Can I batch objects with different scales?

Objects with different scales can be batched as long as they share the same material. The batching system applies the scale as a per-instance transform before rendering. Scale does not affect material eligibility.

Will batching break my map if I enable it and then disable it?

Enabling and disabling batching by changing the Batching_Version value in Config.json is safe. The engine rebuilds the batched mesh at load time based on the current setting. No data is lost or corrupted.

Do I need to rebuild the master bundle after changing batching settings?

No. Batching is a runtime operation performed by the engine at level load time. Changing the Batching_Version in Config.json does not require rebuilding any bundles.

How do I find which objects are not eligible for batching?

The engine logs ineligible objects to the Unity console during level load. Open the Unity console after loading the map and search for "Batching" or "batch" messages. Objects listed as ineligible are those with incompatible materials, animated renderers, or explicit exclusion flags.

What is the performance impact of LOD_Bias = 3.0?

A LOD_Bias of 3.0 gives an effective culling distance of 192 meters. At this distance, the object is visible across most of the map's viewable area. The performance impact is minimal because the object is still rendered; the LOD_Bias only affects whether automatic culling volumes are created, not the rendering cost of the object itself.

Should I use LOD_Bias or culling volumes for performance?

Culling volumes are the recommended approach for most maps. LOD_Bias fields provide a simpler per-object configuration that does not require placing volumes in the editor. For maps with 20+ culling volumes, the evaluation cost of the volumes may exceed the benefit. In that case, use LOD_Bias on individual objects instead.

Best practices

  • Place culling volumes after all object placement is complete. Volumes placed before final object layout will need adjustment when objects are moved.
  • Start with conservative culling distances (60 units) and reduce them only after testing that gameplay is not affected.
  • Exclude all animated objects from batching. The ghost image artifact is guaranteed for any animated object that is included in the batching pass.
  • Test batching in single-player before enabling it on a published map. Batching behavior varies with object density and material usage.
  • Use material palettes for objects that appear frequently to ensure material sharing exists for batching.
  • Combine culling and batching for maximum performance gain. Apply culling volumes first, then enable batching.
  • Monitor the Unity console for batching warnings. Atlas overflow warnings indicate that batching is only partially effective.
  • Keep the number of culling volumes under 20 to avoid excessive per-frame evaluation cost.

Advanced considerations

Combining batching with manual culling for layered optimization

Level batching and manual culling are complementary performance systems. Batching reduces draw calls by merging meshes. Culling reduces the number of meshes considered for rendering by hiding objects at distance. Both systems can be active simultaneously, and their benefits are additive. The cohort recommendation is to apply culling volumes first to define the visible-set boundaries, then enable batching to optimize the draw calls within each visible region.

Atlas overflow and material consolidation

When the texture atlas exceeds the GPU's maximum texture dimension, batching fails for the materials that do not fit. The resolution is to reduce the number of unique materials in the scene by consolidating similar materials. Objects that use variants of the same material (e.g., different shades of the same building texture) should be modified to use a single material with per-instance color tinting through the material palette system rather than separate materials.

Batching compatibility by object category

Not all object categories benefit equally from batching. The table below shows how each category interacts with the batching system:

Object categoryBatching compatibilityExpected gainNotes
Large (buildings, containers)High (shared materials common)60-80% draw call reductionBest candidates for batching
Medium (barrels, crates, furniture)High (shared materials common)50-70% draw call reductionStrong candidates for batching
Small (props, debris, rocks)Moderate (may use unique materials)20-40% draw call reductionCheck material sharing before relying on batching
Decal (paint, graffiti)Low (decals use different renderer)0%Decals are not eligible for standard batching
Resource (trees)Managed by foliage systemN/ATrees use a separate instancing system
NPC spawnsNot applicableN/ASpawn points are not renderers; they have no batching interaction

Objects in the Large and Medium categories should be prioritized for batching because they represent the majority of draw calls in a standard map. Small props contribute fewer draw calls individually but can still benefit from batching when many instances share a material.

Batching and object update frequency

Batched objects cannot be moved or modified at runtime. If an object's transform, material, or renderer state changes during gameplay, that object must be excluded from batching. This applies to doors, moving platforms, destructible objects that change their mesh on damage, and any object that responds to gameplay events with a visual change. The batching exclusion field must be set on every such object to prevent ghost images and state mismatch.

Appendix A: Culling volume configuration reference

FieldTypeDescription
Position X/Y/Zfloat3World-space position of the volume center
Size X/Y/Zfloat3Dimensions of the bounding box
Culling DistancefloatDistance from camera at which objects inside the volume are hidden

Appendix B: Per-object culling and batching field reference

FieldLocated inPurpose
Exclude_From_Culling_VolumesObject .datPrevents culling volumes from affecting this object
Exclude_From_Level_BatchingObject .datPrevents this object from being included in static batching
LODObject .datVolume calculation mode (Mesh or Area)
LOD_BiasObject .datMultiplier for default 64-meter culling distance
LOD_Center_X/Y/ZObject .datVolume center offset from object transform
LOD_Size_X/Y/ZObject .datVolume size multiplier

Appendix C: Performance optimization failure mode diagnostic table

SymptomMost likely causeResolution
Animated objects have ghost imagesAnimated object included in batchingAdd Exclude_From_Level_Batching true to object .dat
Batching does not reduce draw callsMost objects use unique materialsReview material usage; consolidate shared materials
Out-of-memory after enabling batchingBatched mesh exceeds client memoryReduce object density or disable batching
Gameplay objects hidden at distanceCulling volume distance too shortIncrease culling distance or exclude important objects
Draw call count high despite batchingAtlas overflow; some materials not batchedReduce unique material count
Culling volume has no effectVolume does not contain any objectsResize volume to enclose target objects
Performance worse with batching enabledBatching increases memory bandwidth usageDisable batching for this map
Objects flicker at volume boundaryVolume boundary crosses through object midpointResize volume to fully contain or fully exclude each object

Authoring checklist

Before publishing a map with culling and batching configured, confirm the following:

  • [ ] Culling volumes placed over all object-dense decorative areas
  • [ ] Gameplay-important objects excluded from culling volumes
  • [ ] Culling distances set to appropriate values (30-80 units depending on object role)
  • [ ] All animated objects excluded from batching
  • [ ] Batching enabled in Config.json (Batching_Version 2)
  • [ ] Draw call count measured with and without batching
  • [ ] Frame rate tested in the most object-dense area
  • [ ] No ghost images visible from animated objects
  • [ ] No gameplay-important objects hidden by culling
  • [ ] Unity console checked for batching warnings after map load

Cross-references

Document history

VersionDateAuthorNotes
1.02026-07-2657 StudiosInitial publication. Culling volume placement, per-object LOD configuration, batching version setup, material eligibility, exclusion rules, performance testing, failure mode documentation.