Level Batching Reference
Level batching is the performance optimization system in Unturned™ that reduces draw calls by combining multiple meshes into a single rendering operation. Every mesh renderer in a level represents a draw call from the CPU to the GPU, and draw calls are the dominant performance bottleneck in many maps. Batching combines compatible meshes so that the engine issues fewer draw calls, which improves framerate across all hardware tiers. The batching system has two complementary mechanisms: static batching (which combines meshes sharing the same material) and the texture atlas system (which combines meshes with different textures into a shared material so they can benefit from static batching together).
57 Studios™ has documented and validated the full level batching configuration surface. This reference covers enabling batching in a level's Config.json, the purpose and operation of the texture atlas generator, material eligibility rules, the per-object exclusion mechanism, UV validation, and the preview tools that map developers use to verify batching coverage before publishing.

Documentation source: This article references the official Smartly Dressed Games modding documentation for the Level Batching chapter and related sections on draw call optimization. Community-validated notes from 57 Studios cohort mapping projects are marked where official documentation is silent on a detail.
Who this article is for
This reference is written for Unturned™ map developers who have already completed a basic map and are optimizing its performance before publication. If you are new to map creation, start with Custom Map Creation: Project Setup before returning here. The level batching system is an optimization layer that sits on top of a complete map; optimizing a map that is not yet finished may produce misleading performance data.
What you will learn
- How to enable level batching in Config.json with the
Batching_Versionfield - How the texture atlas generator works and which materials are eligible for inclusion
- How to exclude specific objects and resources from batching
- How to find renderers that could benefit from atlas inclusion
- How to validate UV coordinates for atlas compatibility
- How to preview atlas inclusion and static batching using launch options
- How to optimize material usage for maximum batching coverage
How the level batching system works
The level batching system combines two mechanisms that work together to reduce draw calls. The simpler mechanism is static batching, a Unity engine feature that combines meshes sharing the same material into a single GPU draw call. The more complex mechanism is the texture atlas generator, which creates a combined texture sheet from multiple smaller textures, allowing meshes with different original textures to merge onto a shared material and then benefit from static batching together.
As shown in the flowchart above, batching is a multi-step process that runs at level load time. The texture atlas generation step is the most computationally expensive phase; it creates a combined texture from all eligible source textures, then updates the UV coordinates on every mesh that uses those textures to point to the correct sub-region of the combined atlas.
The performance case for batching
The benefit of batching is directly proportional to the number of unique materials in the level. A map with hundreds of unique materials forces hundreds of draw calls per frame, each of which requires the CPU to issue rendering commands to the GPU. After batching, those hundreds of draw calls can collapse into a handful of draw calls per material type. The improvement is most noticeable in indoor environments and dense urban areas where many small objects with different textures are within the camera's view frustum simultaneously.
Enabling batching in Config.json
Batching is disabled by default because some parts of a level may be incompatible (causing graphical bugs), the texture atlas may become too large, or batching may actually worsen performance on some hardware configurations. Publishing a map with batching enabled is only recommended after double-checking each location in single-player, not in the level editor (batching is disabled in the editor).
To enable batching, add this property to the level's Config.json file:
json
"Batching_Version": 2The version number allows for future improvements without potentially breaking existing maps. If atlas generation is supported for more shaders in a future update, those shaders would be excluded on older version numbers to prevent unexpected visual behavior. The current version is 2. Maps that predate this version number may use 1, but new maps should always use 2.
Batching_Max_Texture_Size
The maximum included texture size defaults to 128x128. Including larger textures risks exceeding the maximum texture size that the atlas can accommodate. The maximum can be adjusted with this option in Config.json:
json
"Batching_Max_Texture_Size": 256The 57 Studios cohort recommendation is to keep this value at 128 (the default) and to ensure that as many materials as possible use 128x128 or smaller textures. Increasing to 256 accommodates more materials but reduces the total number of materials that can be included in the atlas because each takes up more atlas space. If the atlas exceeds the GPU's maximum texture dimension (typically 4096x4096 or 8192x8192 depending on the GPU), the generator may fail or produce degraded results.
| Config field | Type | Default | Purpose |
|---|---|---|---|
Batching_Version | int | not present | Enables batching when set to 2. Older versions use 1. |
Batching_Max_Texture_Size | int | 128 | Maximum texture dimension in pixels for atlas inclusion. Larger values include more materials but increase atlas size. |
Materials eligible for atlas inclusion
The texture atlas generator evaluates every material in the level against a set of eligibility criteria. Materials that do not meet the criteria are excluded from atlas generation but can still participate in static batching if they share a material with another mesh.
| Material type | Eligible? | Conditions |
|---|---|---|
| Standard (Decalable) or Standard (Specular setup) (Decalable) | Yes | Mode must be Opaque. Texture must be unset, or 128x128 or smaller with Clamp wrap mode. All other material features must be default. |
| Custom/Card | Yes | Supported for automatically generated tree skybox models. |
| Custom/Foliage | Yes | Default trees and bushes. |
| Standard with any non-default feature | No | Not eligible for atlas; uses static batching only |
| Standard with Repeat wrap mode | No | Must use Clamp wrap mode for atlas inclusion |
Standard with texture larger than Batching_Max_Texture_Size | No | Not eligible; consider reducing texture size or increasing the max size limit |
| Any custom shader not in the eligibility list | No | Not eligible; uses static batching only |
The Clamp wrap mode requirement
The most common reason a material is excluded from atlas generation is that its texture uses Repeat wrap mode instead of Clamp wrap mode. Repeat wrap mode tiles the texture, which means the UV coordinates on the mesh may extend beyond the 0-1 range to produce tiling. When the generator merges such textures into the atlas, the UV coordinates that reference the tiled area would point to a different part of the atlas, producing incorrect rendering.
The official documentation notes that if a mesh does not require UVs outside the 0-1 square, it can use Clamp wrap mode. The 57 Studios cohort recommendation is to inspect every Standard material in the level, confirm that the textures do not rely on tiling, and set wrap mode to Clamp. This single change can bring a substantial fraction of ineligible materials into the eligible set.
Excluding specific objects and resources from batching
Some assets are incompatible with batching and must be excluded. If an asset uses Unity Event components that move the renderer transform or set material parameters at runtime, batching that asset would prevent those runtime modifications from working correctly.
To exclude an asset from level batching, add this line to the asset's .dat file:
Exclude_From_Level_Batching trueThe following asset types are excluded from batching by default:
- NPCs (their renderers are managed by the NPC system)
- Decals (their rendering is handled separately from the mesh pipeline)
- Speedtrees (when enabled, their renderers are excluded because tree rendering uses a specialized pipeline)
The Exclude_From_Level_Batching option may also be useful for elaborate setups using Unity Event components. If an event component moves the renderer transform or sets material properties on a interactable object, that object should be excluded from batching to preserve the event behavior.
| Exclusion mechanism | Scope | How to apply |
|---|---|---|
| Default exclusion | NPCs, decals, speedtrees | Automatic; no action needed |
| Asset-level exclusion | Any object or resource | Add Exclude_From_Level_Batching true to .dat file |
| Runtime behavior exclusion | Objects with Unity Events | Manually exclude when events modify renderer state |
Finding renderers that could benefit from atlas inclusion
By default, the game considers every renderer in objects and resources for atlas inclusion. Some renderers are excluded from the atlas but can still participate in static batching if they share a material with another renderer. The game provides a launch option to log why each renderer is excluded from the atlas.
The -LogLevelBatchingTextureAtlasExclusions option
Run the game with this launch option to enable logging of atlas exclusion reasons:
-LogLevelBatchingTextureAtlasExclusionsThe logged messages explain why the game cannot atlas each renderer. None of the messages are errors in the traditional sense; they are informational logs that tell the map developer why a particular renderer was not included in the atlas. The most useful message for finding assets to modify is "Wrap Mode is not Clamp" because if the mesh does not require UVs outside the 0-1 square, it can use Clamp wrap mode, and the fix is straightforward.
| Log message | Meaning | Action |
|---|---|---|
| "Wrap Mode is not Clamp" | Texture uses Repeat wrap mode | Change to Clamp if the mesh does not tile the texture |
| "Texture size exceeds max" | Texture is larger than Batching_Max_Texture_Size | Reduce texture size or increase the limit |
| "Non-default material features" | Material has non-default settings | Simplify material to standard defaults |
| "Custom shader" | Material uses a non-eligible shader | Replace with an eligible shader type if possible |
| "Runtime behavior conflict" | Asset has Exclude_From_Level_Batching set | Remove the exclusion flag if the asset is compatible |
Finding unoptimized materials via inspection
The texture atlas exclusion logs are the primary diagnostic tool. The 57 Studios cohort workflow for batching optimization is to enable the exclusion logging, load the map in single-player, review every log entry, and address each one that points to a fixable exclusion. The most common fixed exclusion is the Repeat-to-Clamp wrap mode change, which typically brings 30-60% of previously excluded renderers into the atlas.
Validating UVs
When textures are merged into an atlas, any meshes referencing them need their UV coordinates updated to point to the correct sub-region of the combined atlas texture. If any UVs are outside the 0-1 square, they will now overlap a completely different texture and appear incorrectly.
The game provides a launch option to validate UV coordinates for batched meshes:
-ValidateLevelBatchingUVsThis option logs any batched meshes with UV coordinates outside the 0-1 range. An example log entry from the official documentation references a vanilla chess board:
Mesh "Model_0" in renderer "Chess_0/Model_0" has UVs outside [0, 1] rangeIn the case of the vanilla chess board, the UV unwrapping contained an error that was subsequently fixed. In most cases, out-of-bounds UVs suggest that the mesh relies on Wrap Mode being Repeat to tile the texture across its surface. Such meshes cannot be included in the atlas because the tiling behavior is not preserved when the texture is repacked into a combined sheet.
| UV situation | Atlas compatible? | Resolution |
|---|---|---|
| All UVs within 0-1 | Yes | No action needed |
| UVs extend beyond 0-1, Wrap Mode is Repeat | No | Exclude from atlas or modify UVs to stay within 0-1 |
| UVs extend beyond 0-1, Wrap Mode is Clamp | No | The UV unwrapping is out of bounds; fix UVs in 3D modeling tool |
Previewing atlas inclusion
The game provides a visual preview mode to see which renderers have been included in the texture atlas:
-PreviewLevelBatchingTextureAtlasWhen this launch option is active, all renderers that have been merged into the atlas are displayed in white. Renderers that were not merged retain their original material appearance. The official documentation notes that it is not necessarily bad that some materials were not merged. For example, the HVAC units on the rooftops in one of the official map screenshots all share a material already, so they are able to use static batching together even without atlas inclusion. The same applies to roads and overpasses.
The preview mode is the most reliable way to verify that the batching configuration is producing the expected results. If a renderer that should be in the atlas appears without the white overlay, the exclusion log will explain why.
Previewing static batching
A separate preview mode shows which mesh renderers are included in static batching:
-PreviewLevelBatchingUniqueMaterialsIn this mode, each unique material is assigned a random hue. The brightness of the color decreases in order of uniqueness. The brightest color is used by the most renderers, and the darkest color is used by only a few. A map with many bright colors is well-batched; a map with many dark colors has many unique materials and will benefit from consolidation.
| Preview mode | Launch option | What it shows |
|---|---|---|
| Atlas inclusion | -PreviewLevelBatchingTextureAtlas | White = in atlas; original = not in atlas |
| Static batching | -PreviewLevelBatchingUniqueMaterials | Each unique material = random hue; brighter = more common |
Performance considerations
Batching is not universally beneficial. The 57 Studios cohort has identified several scenarios where batching may produce worse performance than running without batching, and these scenarios should be evaluated before enabling batching in a published map.
| Scenario | Batching effect | Recommendation |
|---|---|---|
| Dense indoor areas with many small objects | Large improvement | Enable batching; bulk of the benefit comes from indoor scenes |
| Outdoor areas with many unique objects | Moderate improvement | Enable batching; atlas may be large but benefit is still positive |
| Map with many identical objects | Minimal improvement | Objects already share materials; static batching is already effective |
| Map with large texture atlas (>4096) | Risk of GPU memory pressure | Reduce Batching_Max_Texture_Size or simplify materials |
| Map with runtime-animated objects | Risk of graphical bugs | Exclude animated objects with Exclude_From_Level_Batching |
| Low-end hardware (integrated GPU) | Variable | Test on target hardware before enabling |
The official documentation warns that batching can worsen performance in some cases. The 57 Studios cohort recommendation is to compare framerate with and without batching in the most demanding area of the map, and to only enable batching if the benefit is measurable. A 5-10% framerate improvement is worth enabling; a 1-2% improvement may not be worth the risk of atlas-related graphical bugs.
Worked example: optimizing a town scene
This worked example traces the batching optimization process for a typical small town in a custom map. The town has 15 buildings, 40 decorative objects (fences, mailboxes, streetlights), and 20 vegetation objects.
Step 1: Baseline. Load the map without batching. The town renders with approximately 1,200 draw calls in the center plaza view.
Step 2: Enable batching. Set Batching_Version 2 in Config.json. Load with -PreviewLevelBatchingUniqueMaterials. The preview shows 80% dark hues, indicating many unique materials.
Step 3: Review exclusion logs. Load with -LogLevelBatchingTextureAtlasExclusions. The logs show 45 exclusion entries, of which 32 are "Wrap Mode is not Clamp" on decorative object textures, 8 are textures exceeding 128x128, and 5 are custom shaders on unique objects.
Step 4: Fix wrap modes. For the 32 decorative objects, open their textures in Unity and set wrap mode to Clamp. All 32 materials become atlased.
Step 5: Consolidate textures. For the 8 oversized textures, scale them down to 128x128 and reimport. Six of the eight are now atlased; two are still excluded because they use non-default material features.
Step 6: Re-evaluate. Load again. Draw call count has dropped from 1,200 to approximately 450. The -PreviewLevelBatchingTextureAtlas preview shows most of the town in white, with only the custom-shader objects and the 2 oversized-materials objects in their original appearance.
Step 7: Verify. Load the map in single-player and walk through every area of the town. Confirm that no object has a graphical artifact (incorrect texture, flickering, or missing UV mapping). The map is now batching-optimized.
FAQ
What happens if I set Batching_Version to a value that does not exist?
The engine ignores unrecognized version numbers. Batching is not enabled, and the map runs without any batching application. No error is shown to the player. If a map was previously published with batching enabled and a future update removes the version field, existing players who downloaded the map while batching was active will continue to play on their locally cached version; new downloads will use the updated version without batching.
Does batching affect collision detection?
No. Batching is a rendering optimization only. Collision detection in Unturned™ uses a separate collision system that is unaffected by draw-call batching. Mesh colliders, box colliders, and other collision shapes continue to function identically regardless of whether batching is enabled.
Can I batch objects that use different materials if they share the same texture?
The atlas generator evaluates eligibility at the material level, not the texture level. If two objects use different materials but both materials reference the same texture and meet the eligibility criteria, both materials are included in the atlas and their meshes can be statically batched together. If one material uses default features and the other does not, they are not batched together even if they share a texture.
Why does my map look correct in the editor but wrong after batching?
Batching is disabled in the level editor. Visual bugs caused by batching (such as misplaced UVs or incorrect atlas mapping) only appear when the map is run in single-player or multiplayer with batching enabled. Always test batching in single-player before publishing, and walk through every location in the map to visually inspect for artifacts.
Can I batch objects that use transparency?
Standard materials with transparent mode are not eligible for atlas inclusion because the standard criteria require Opaque mode. Transparent objects are left unbaked and render individually. The 57 Studios cohort recommendation is to minimize the number of transparent objects in areas where batching is most beneficial; a small number of transparent objects mixed into a sea of batched opaque objects is fine.
Can I batch the player character or NPCs?
No. NPCs are excluded from batching by default because their renderers are managed by the NPC animation system. The player character is not a level object and is not affected by level batching. This is expected and desirable; batched objects must have static transforms, and characters change position every frame.
Can I batch animated level objects (doors, elevators)?
No. Animated level objects that change position or rotation at runtime should be excluded from batching using Exclude_From_Level_Batching true. Batched objects must maintain their initial transform for the entire lifetime of the level. An animated batched object would render at its original position while the animation moves the visual representation to a different position, producing a ghost artifact.
My atlas preview shows everything in color, not white. What went wrong?
If the -PreviewLevelBatchingTextureAtlas preview shows no white renderers at all, batching may not be enabled. Verify that Batching_Version is set in Config.json. If it is set, check the exclusion logs to understand why every renderer is excluded. The most likely cause is that every material in the level uses a non-eligible shader or has non-default feature settings.
Can I use batching on a modded map that uses custom shaders?
Custom shaders are not eligible for atlas inclusion by default. Objects using custom shaders are not included in the texture atlas, but they can still participate in static batching if multiple objects use the same custom shader material. The 57 Studios cohort recommendation is to use standard shaders for as many objects as possible and to reserve custom shaders for the small subset of objects where they are truly necessary.
Is there a limit to how many textures can be included in the atlas?
The practical limit is the GPU's maximum texture dimension. The atlas is a single texture whose dimensions depend on the total number and size of included source textures. If the atlas would exceed the GPU's maximum texture dimension, the generator may fail or produce degraded results. The 57 Studios cohort recommendation is to keep included textures as small as possible (128x128 or smaller) and to limit the total number of unique included textures to approximately 200-300 for a standard map.
Best practices
- Enable batching only after the map is complete and all visual elements are finalized
- Test batching in single-player by walking through every area of the map before publishing
- Use the
-LogLevelBatchingTextureAtlasExclusionsoption to identify fixable exclusion reasons - Change texture wrap mode from Repeat to Clamp whenever the mesh does not tile the texture
- Keep included textures at 128x128 or smaller to maximize atlas space
- Use
-PreviewLevelBatchingTextureAtlasto verify that the expected renderers are included - Use
-PreviewLevelBatchingUniqueMaterialsto identify unique material hotspots - Compare framerate with and without batching in the most demanding area before deciding to enable
- Exclude runtime-animated objects explicitly with
Exclude_From_Level_Batching true - Document the batching status in the workshop description so players know what to expect
Appendix A: Level batching quick-reference card
| Task | Config field or launch option | Notes |
|---|---|---|
| Enable batching | "Batching_Version": 2 in Config.json | Test in single-player before publishing |
| Increase atlas size limit | "Batching_Max_Texture_Size": 256 | Default is 128; increase cautiously |
| Log exclusion reasons | -LogLevelBatchingTextureAtlasExclusions | Run from command line or Steam launch options |
| Preview atlas inclusion | -PreviewLevelBatchingTextureAtlas | White = included; color = not included |
| Preview static batching | -PreviewLevelBatchingUniqueMaterials | Brighter = more common material |
| Validate UVs | -ValidateLevelBatchingUVs | Catches out-of-bounds UV errors |
| Exclude a specific object | Exclude_From_Level_Batching true in .dat | For runtime-animated objects and event-driven setups |
Appendix B: Diagnostic table for level batching issues
| Symptom | Most likely cause | Resolution |
|---|---|---|
| No batching effect despite enabling | Batching_Version not set or set to unrecognized value | Verify Config.json contains "Batching_Version": 2 |
| Most renderers excluded from atlas | Textures use Repeat wrap mode | Set wrap mode to Clamp in Unity |
| Atlas smaller than expected | Batching_Max_Texture_Size too small | Increase limit or reduce texture sizes |
| Graphical artifacts after batching | UVs outside 0-1 range | Validate UVs with -ValidateLevelBatchingUVs; exclude affected meshes |
| Batching worsens framerate | Atlas too large or too many materials | Reduce texture sizes or number of unique materials |
| Animated objects appear at wrong position | Animated object not excluded from batching | Add Exclude_From_Level_Batching true to animated object .dat |
| Preview mode shows no white renderers | Batching not enabled or all materials excluded | Verify Batching_Version; check exclusion logs |
| Objects with custom shaders not batched | Custom shaders not eligible for atlas | Use standard shaders where possible |
| Atlas generation fails at load time | Atlas exceeds GPU maximum texture dimension | Reduce texture sizes or number of included materials |
| Batching works in single-player but not on server | Server running different Config.json | Verify server Config.json matches the published version |
Level batching and multi-platform deployment
Level batching behavior can differ across platforms because the atlas generation depends on the GPU's maximum texture dimension, which varies between low-end integrated GPUs and high-end discrete GPUs. Map authors targeting multiple platforms should test batching on the lowest-spec target platform and verify that the atlas does not exceed that platform's maximum texture dimension.
| Platform | Typical max GPU texture dimension | Atlas risk |
|---|---|---|
| Windows desktop (discrete GPU) | 16384 or 8192 | Low risk for standard maps |
| Windows desktop (integrated GPU) | 4096 or 8192 | Moderate risk for large atlases |
| Linux (discrete GPU) | 8192 or 16384 | Low risk |
| Linux (integrated GPU) | 4096 | Moderate risk |
| macOS (Apple Silicon) | 16384 | Low risk |
| macOS (Intel integrated) | 4096 | Moderate risk |
The 57 Studios cohort recommendation is to target a maximum atlas dimension of 4096 as the safe baseline. If the atlas exceeds 4096 on any platform, reduce the Batching_Max_Texture_Size or consolidate materials to bring the atlas within this limit.
Common atlas generation failure modes
Failure mode 1: atlas exceeds GPU maximum
The atlas generator attempts to pack all eligible textures into a single texture sheet. If the total area exceeds the GPU's maximum texture dimension, the generator may fail silently, producing no atlas at all. The symptoms are lower-than-expected draw call reduction combined with a warning in the log. The fix is to reduce the Batching_Max_Texture_Size or to reduce the number of unique eligible materials.
Failure mode 2: atlas uses excessive GPU memory
Even when the atlas fits within the maximum texture dimension, a large atlas consumes substantial GPU memory. A 4096x4094 RGBA atlas at 8 bits per channel consumes approximately 64 MB of GPU memory. On GPUs with limited memory (integrated GPUs sharing system RAM, older discrete GPUs with 512 MB or less), this can cause out-of-memory conditions. The fix is to reduce the number or size of included textures.
Failure mode 3: UV artifacts on specific meshes
If a mesh has UVs that extend beyond the 0-1 range and are not caught by the validation step, the mesh renders with incorrect texture mapping after atlas generation. The fix is to run -ValidateLevelBatchingUVs and exclude affected meshes, or to fix the UV unwrapping in the modeling tool.
Failure mode 4: atlas texture quality degradation
When many textures are packed into a single atlas, the individual source textures may lose quality if they are downscaled to fit the atlas. Textures at 128x128 that are included in a 4096x4096 atlas retain their full resolution, but if the atlas generator must downscale a 256x256 texture to 128x128 to fit within the atlas size limit, that texture loses detail. The symptom is blurry or pixelated appearance on specific objects after batching is enabled. The fix is to either exclude the affected objects from batching or to ensure all source textures are at or below the Batching_Max_Texture_Size value so that no downscaling occurs.
Failure mode 5: atlas generation timeout on large maps
On very large maps with thousands of eligible materials, the atlas generator may take several seconds to complete. In extreme cases, the generator may appear to hang or timeout. The symptom is a noticeable pause during level loading, followed by normal map behavior (the atlas was generated successfully during the pause). If the pause exceeds 10 seconds, the map should be optimized to reduce the number of unique eligible materials before publishing. The 57 Studios cohort recommendation is to keep the number of eligible materials below 500 to ensure reasonable atlas generation time.
Failure mode 6: batching causes rendering order issues
In rare cases, batching changes the rendering order of transparent or semi-transparent objects, causing incorrect overlap behavior. The official documentation notes that transparent materials are not eligible for atlas inclusion, but statically batched opaque objects may still exhibit rendering order changes if they overlap with transparent objects in the scene. The fix is to exclude the problematic opaque objects from batching using Exclude_From_Level_Batching true.
Troubleshooting batching across different map scales
The behavior of the batching system changes with the scale and complexity of the map. The following guidance addresses specific scenarios that arise at different map sizes.
Small maps (under 500 unique objects)
Small maps benefit the least from batching because the draw call count is already low. The 57 Studios cohort recommendation for small maps is to enable batching with default settings and only optimize further if the framerate on target hardware is unacceptable. The overhead of the atlas generator may not be worth the modest draw call reduction on a map that renders at 200-300 draw calls without batching.
Medium maps (500-2000 unique objects)
Medium maps see the most dramatic improvement from batching. A medium map with 800 draw calls before batching may reduce to 200-300 draw calls after batching. The atlas generator operates efficiently at this scale because the number of eligible materials is large enough to benefit from consolidation but not so large that the atlas becomes unwieldy.
Large maps (2000+ unique objects)
Large maps present a challenge for the batching system. The atlas generator may produce a texture that approaches or exceeds the GPU's maximum texture dimension if too many materials are eligible. The 57 Studios cohort recommendation for large maps is to be selective about which materials are eligible for atlas inclusion. Set Batching_Max_Texture_Size to 128 and ensure that only truly small textures are included. For materials that use large textures (256x256 or larger), consider whether they can be reduced, excluded from the atlas, or consolidated into fewer unique materials.
Performance benchmarking methodology for batching
To accurately measure the performance impact of batching on a specific map, the following benchmarking methodology is recommended by the 57 Studios cohort.
- Identify the three most demanding viewpoints in the map (typically the center plaza, the most dense interior space, and a rooftop overlooking the highest density area).
- For each viewpoint, record the framerate and draw call count with batching disabled (remove
Batching_Versionfrom Config.json). - For each viewpoint, record the framerate and draw call count with batching enabled at default settings (
Batching_Version 2). - Compare the three pairs of measurements. If the average framerate improvement across all three viewpoints is less than 5%, consider whether batching is worth the risk of atlas-related graphical issues.
- If the average improvement exceeds 10%, enable batching and proceed to the visual verification walkthrough.
The draw call count is available through the Unity Editor statistics overlay or through the in-game debug console. Framerate should be measured using a stable method such as the average over 30 seconds at each viewpoint.
Appendix C: Glossary of batching terminology
| Term | Definition |
|---|---|
| Atlas | A single large texture containing many smaller textures packed together |
| Clamp | Wrap mode that clamps UV coordinates to the 0-1 range; required for atlas inclusion |
| Draw call | A CPU-to-GPU command that initiates rendering of a set of geometry |
| Exclusion | The mechanism that removes a renderer from the batching pipeline |
| Frustum | The visible volume of the camera; objects outside the frustum are not rendered |
| LOD group | Level-of-detail group that swaps mesh detail based on distance from camera |
| Material | A Unity asset that defines how a surface is rendered (shader, texture, properties) |
| Renderer | A Unity component that draws a mesh at a given transform position |
| Repeat | Wrap mode that tiles the texture when UVs extend beyond the 0-1 range; not atlas-compatible |
| Static batching | Unity engine feature that combines static meshes sharing the same material |
| Texture atlas | The combined texture sheet generated by the atlas generator |
| UV coordinate | The 2D mapping from a 3D mesh surface to a 2D texture image |
| Wrap mode | The texture sampling behavior when UV coordinates are outside the 0-1 range |
Appendix D: External references
- Smartly Dressed Games official modding documentation - the authoritative reference for level batching, texture atlas generation, and draw call optimization.
- Level Config Reference - the next article in this section; covers the Config.json format that includes the batching configuration fields.
- Custom Map Creation: Project Setup - the prerequisite map creation pipeline.
- Manual Object Culling Reference - the complementary optimization technique for reducing draw calls through culling volumes.
- Unity documentation: Static Batching - the underlying Unity engine feature.
- Unity documentation: Texture Atlases - the Unity-side texture atlas pipeline.
Advanced considerations
Interleaving batching with occluded areas
Batching and occlusion culling are complementary optimization techniques that can be used together. Batching reduces the per-draw-call cost, while occlusion culling reduces the number of objects considered for rendering. The 57 Studios cohort recommendation is to apply both optimizations to any map targeting 60 FPS on mid-range hardware. Batching should be applied first, because it provides the most consistent improvement across all camera positions. Occlusion culling is then applied to handle the specific case of objects hidden behind walls or terrain.
Version-specific atlas behavior
The batching version number (Batching_Version) is a compatibility mechanism. Future versions of Unturned™ may add support for additional shader types in the atlas generator, and those new shaders will be excluded on older version numbers. Map authors who want to take advantage of future atlas improvements should update their Batching_Version to the current version number when they update their map. The 57 Studios cohort recommendation is to always use the current version number (2 at the time of this writing) for new maps and to update the version number when releasing a major update to an existing map.
Atlas exclusion for performance-critical objects
Some objects, particularly those with high gameplay importance such as chokepoints, loot spawn locations, and navigation landmarks, should not be included in the atlas even if they qualify. The reason is that atlas-induced UV remapping can cause subtle visual differences that, while technically correct, deviate from the author's intended appearance. The 57 Studios cohort recommends excluding objects whose visual appearance must be absolutely predictable for gameplay reasons, accepting the slight performance cost of an unbaked draw call.
Appendix D: Texture atlas eligibility quick-reference table
| Material property | Required value for atlas inclusion |
|---|---|
| Shader type | Standard (Decalable) or Standard (Specular setup) (Decalable) |
| Rendering mode | Opaque |
| Texture resolution | Unset, or <= Batching_Max_Texture_Size |
| Texture wrap mode | Clamp |
| All other features | Default (no non-default settings) |
Any material that does not match every row in the table above is excluded from atlas generation. The material can still participate in static batching if another material in the level is identical (same texture, same shader, same properties).
Appendix E: Dictionary of batching terminology
| Term | Definition |
|---|---|
| Atlas | A single large texture containing many smaller textures packed together, used to reduce the number of unique materials |
| Batching | Combining multiple draw calls into a single rendering operation |
| Draw call | A CPU-to-GPU command that triggers a rendering operation |
| Exclusion | The mechanism by which a renderer is excluded from batching |
| Static batching | Unity engine feature that combines meshes sharing the same material |
| Texture atlas | The combined texture sheet generated by the atlas generator |
| UV unwrapping | The mapping of 3D mesh coordinates to 2D texture coordinates |
| Wrap mode | The behavior of texture sampling when UV coordinates are outside the 0-1 range (Clamp or Repeat) |
Authoring checklist
Before publishing a map with batching enabled, confirm the following:
- [ ]
Batching_Version: 2is set in Config.json - [ ] Batching has been tested in single-player across all map areas
- [ ] Exclusion logs have been reviewed and fixable exclusions have been addressed
- [ ] All eligible materials use Clamp wrap mode
- [ ] UV validation passes with no out-of-bounds errors
- [ ] Atlas preview shows the expected renderers included
- [ ] Static batching preview shows a well-distributed material density
- [ ] Runtime-animated objects are excluded from batching
- [ ] Custom-shader objects are visually confirmed to render correctly
- [ ] Framerate comparison confirms batching provides a measurable improvement
- [ ] No graphical artifacts are visible in any location tested
Batching version compatibility
When updating an existing map that previously used Batching_Version 1, the change to Batching_Version 2 may cause visual differences because the atlas generator in version 2 includes additional shader types. Always verify the visual output after incrementing the version number and walk through every area of the map before publishing the update.
Document history
| Version | Date | Author | Notes |
|---|---|---|---|
| 1.0 | 2026-07-26 | 57 Studios | Initial publication. Complete level batching reference with atlas generation, material eligibility, UV validation, preview tools, and optimization guidance. |
Cross-references
- Curated Maps Guide - the previous article in the mapping section.
- Level Config Reference - the next article; covers the Config.json fields that include batching configuration.
- Custom Map Creation: Project Setup - the prerequisite map creation pipeline.
- Manual Object Culling Reference - the complementary optimization technique for culling objects outside view thresholds.
- Smartly Dressed Games modding documentation - official field reference.
- Unturned on Steam - game page and community hub.
