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.

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.jsonfile. - 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 volume | Recommended culling distance | Rationale |
|---|---|---|
| Small decorative props (rocks, debris) | 30-40 units | These objects do not need to be visible at long range |
| Medium props (barrels, crates, furniture) | 40-60 units | Medium objects may be gameplay relevant at mid-range |
| Large props (vehicles, containers) | 60-80 units | Large objects may serve as cover at mid-range |
| Foliage instances | Managed by foliage system | Foliage 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 trueStep 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 type | Why it should be excluded |
|---|---|
| Landmark buildings | Players use them for spatial navigation at distance |
| Large cover objects | Gameplay-important cover must be visible at engagement ranges |
| Navigation markers | Objects that mark routes, exits, or points of interest |
| Spawn points | Zombie, 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:
| Field | Type | Purpose |
|---|---|---|
LOD | enum | Volume calculation mode: Mesh (uses renderer bounds) or Area (uses Occlusion Area size) |
LOD_Bias | float | Multiplier for the default 64-meter culling distance. A value of 0.5 gives 32 meters; 2.0 gives 128 meters |
LOD_Center_X/Y/Z | float | Offset of volume center relative to object transform |
LOD_Size_X/Y/Z | float | Size 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 role | LOD_Bias | Effective culling distance |
|---|---|---|
| Decorative, never gameplay-relevant | 0.5 | 32 meters |
| Standard object, visible at moderate range | 1.0 | 64 meters |
| Gameplay-important, should be visible at range | 1.5-2.0 | 96-128 meters |
| Landmark, never culled | 3.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 type | Culling volume size | Culling distance | Objects affected |
|---|---|---|---|
| Building interior | Matches building footprint | 20-30 units | Furniture, decoration, clutter |
| Outdoor decorative cluster | 30x30 units per volume | 40-60 units | Rocks, bushes, small props |
| Urban block | 50x50 units per volume | 50-70 units | Street furniture, signs, debris |
| Forest undergrowth | 40x40 units per volume | 30-50 units | Ground-level foliage, fallen logs |
| Industrial zone | 60x60 units per volume | 60-80 units | Pipes, machinery parts, crates |
| Residential area | 50x50 units per volume | 50-60 units | Garden 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": 2Step 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 scenario | Batching result |
|---|---|
| 100 objects share the same material | All 100 objects merged into 1-2 draw calls |
| 50 objects share Material A, 50 share Material B | 100 draw calls reduced to 2-4 (one per material) |
| 100 objects all use unique materials | No batching possible; 100 individual draw calls |
| Mixed: 80 share a material, 20 are unique | 80 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:
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.
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 trueStep 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 type | Reason for exclusion |
|---|---|
| Doors (animated) | Animation moves the mesh; batched mesh is static and does not update |
| Lights with toggle animation | Movement during state change conflicts with static batch |
| Moving platforms | Runtime transform changes are not reflected in batched mesh |
| Animated machinery | Any object with a runtime-changing transform or animation |
| Water surfaces | Water 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 category | Batching compatibility | Expected gain | Notes |
|---|---|---|---|
| Large (buildings, containers) | High (shared materials common) | 60-80% draw call reduction | Best candidates for batching |
| Medium (barrels, crates, furniture) | High (shared materials common) | 50-70% draw call reduction | Strong candidates for batching |
| Small (props, debris, rocks) | Moderate (may use unique materials) | 20-40% draw call reduction | Check 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 system | N/A | Trees use a separate instancing system |
| NPC spawns | Not applicable | N/A | Spawn 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
| Field | Type | Description |
|---|---|---|
| Position X/Y/Z | float3 | World-space position of the volume center |
| Size X/Y/Z | float3 | Dimensions of the bounding box |
| Culling Distance | float | Distance from camera at which objects inside the volume are hidden |
Appendix B: Per-object culling and batching field reference
| Field | Located in | Purpose |
|---|---|---|
Exclude_From_Culling_Volumes | Object .dat | Prevents culling volumes from affecting this object |
Exclude_From_Level_Batching | Object .dat | Prevents this object from being included in static batching |
LOD | Object .dat | Volume calculation mode (Mesh or Area) |
LOD_Bias | Object .dat | Multiplier for default 64-meter culling distance |
LOD_Center_X/Y/Z | Object .dat | Volume center offset from object transform |
LOD_Size_X/Y/Z | Object .dat | Volume size multiplier |
Appendix C: Performance optimization failure mode diagnostic table
| Symptom | Most likely cause | Resolution |
|---|---|---|
| Animated objects have ghost images | Animated object included in batching | Add Exclude_From_Level_Batching true to object .dat |
| Batching does not reduce draw calls | Most objects use unique materials | Review material usage; consolidate shared materials |
| Out-of-memory after enabling batching | Batched mesh exceeds client memory | Reduce object density or disable batching |
| Gameplay objects hidden at distance | Culling volume distance too short | Increase culling distance or exclude important objects |
| Draw call count high despite batching | Atlas overflow; some materials not batched | Reduce unique material count |
| Culling volume has no effect | Volume does not contain any objects | Resize volume to enclose target objects |
| Performance worse with batching enabled | Batching increases memory bandwidth usage | Disable batching for this map |
| Objects flicker at volume boundary | Volume boundary crosses through object midpoint | Resize 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
- Interactable Objects and Properties -- the previous article; covers interactable object configuration.
- Lighting and Lightmap Baking -- the next article; covers light placement and lightmap baking.
- Manual Object Culling Reference -- the complete field reference for culling volume configuration and per-object exclusion.
- Level Batching Reference -- the complete field reference for batching version configuration, atlas generation, and material eligibility.
- Level Config Reference -- Config.json fields including batching version and lighting parameters.
- Smartly Dressed Games modding documentation -- official field reference.
- Unturned on Steam -- game page and community.
Document history
| Version | Date | Author | Notes |
|---|---|---|---|
| 1.0 | 2026-07-26 | 57 Studios | Initial publication. Culling volume placement, per-object LOD configuration, batching version setup, material eligibility, exclusion rules, performance testing, failure mode documentation. |
