Unreal Engine 5.8 · Plugin

ButterNet Multiplayer Voxel

32 players digging
12.53ms game-thread cost at the 99th percentile on a desktop CPU, all of them digging at once
Per edit on the wire
~60bytes for a replicated edit op — payload plus replication overhead, not a full chunk resync
Dig at radius 3
~0.05ms on a desktop CPU, including debris detection into attached ground
Persistence footprint
~530bytes for an eight-chunk edited volume saved to disk

What it is

ButterNet Multiplayer Voxel adds editable, replicated, persistent smooth-voxel volumes to Unreal Engine. Players dig, fill, paint and smooth the world; every machine sees the same result; edits survive restarts; and pieces that lose their footing break off and fall.

It is a plugin with no dependency on any game code, driven from Blueprint or C++ through a small set of functions, events and interfaces.

In motion

The demo map that ships with the plugin, captured from a client in a networked play session: projectiles carve a voxelised structure, disconnected pieces break off and fall, and the server’s edit events tick by in the corner naming the material each shot hit.

What you can build

Volumes and generation

Volumes are actors with a definition asset; chunks of 32 × 32 × 32 voxels at any voxel size you choose. A volume is either a Blob — a free-standing shape built by a generator — or Terrain, which takes its ground from a landscape instead. Generators include layered noise terrain with seeded caves, splines you draw in the viewport and extrude, primitives, and runtime voxelisation of static meshes with exact surface normals. Surfaces come from Surface Nets for smooth terrain, or Dual Contouring to keep mesh edges sharp. Per-voxel material index reaches your material through vertex colour.

Terrain mode

A volume can take its ground from a landscape. Nothing renders until the first dig; from then on the dug columns render as voxels and collision is lowered underneath. Choose how the landscape surface is hidden: Material Mask (per-column holes via MF_VoxelHoleMask in the landscape material), Hide Landscape Components (whole components hidden, no material setup), or None (landscape stays visible). Heights come from a pristine snapshot, so PIE sessions and reloads always rebuild the same ground. See the installation guide for setup.

Top-Down Mode

For fixed overhead and isometric cameras, where a cave roof would otherwise hide the player entirely. When the local player moves under solid ground, the volume re-meshes the chunks above them with the roof cut away, and an optional floor plane fills in beneath — so an excavation stays readable from outside.

Client-side

Nothing replicates

Purely visual and entirely local. Collision is untouched, other players see the volume unchanged, and a dedicated server skips the work — it has no camera and nothing to hide.

Dug only

Procedural caves keep their roof

Only voxels that were solid in the baseline and are air now count as excavated. Caves the generator authored stay roofed and dark, so a cave system is not unroofed across the whole map.

The transition animates rather than blends: the cut slides down from the surface over a configurable number of steps, each one ordinary opaque geometry, so nothing is ever dithered or drawn twice. Two Blueprint events fire as the local player enters and leaves, for swapping ambience or post-process. See the installation guide for setup.

Editing

Replication and prediction

Small ops

Edits replicate as compact ops rather than full chunk payloads. Late joiners catch up from compressed chunk snapshots under a byte budget.

Client prediction

Dig and fill predict locally with server rollback when an edit is rejected. Range and rate limits apply per player on the authority.

Both drivers

Works with the legacy replication driver and Iris. No game code required beyond calling the subsystem from your input.

Thirty-two players, digging at once

One dig on its own is cheap. The case that decides whether a sandbox holds up is every player on the server digging continuously — ten times a second, for a solid minute, into the same 256-metre volume. Nobody idles, nobody pauses, and nothing is amortised away.

At thirty-two simultaneous diggers that is 2.7 million voxels destroyed in sixty seconds — about 45,500 every second — and the cost grows roughly in step with the player count rather than running away with it.

Cost at the 99th percentile

Game-thread CPU time per frame on a desktop Ryzen 9 7900X, measured with rendering switched off. The marker is Unreal’s 16.7 ms budget for a 60 fps frame: it shows how much of that budget voxel work claims, and is not a frame rate — your rendering cost sits on top of these figures.
8 players 4.74 ms 16 players 9.20 ms 32 players 12.53 ms 16.7 ms budget 0 game thread, ms
99th-percentile frame 60 fps frame budget
All measurements
PlayersEdits appliedMeanMedianp95p99
84,7961.91 ms1.66 ms3.36 ms4.74 ms
169,5893.33 ms2.99 ms6.50 ms9.20 ms
3219,1765.70 ms5.05 ms10.55 ms12.53 ms

Median of three repeat runs. The edit counts are not rounded and not averaged — all three runs applied exactly 4,796, 9,589 and 19,176 edits. Identical input, identical result, run after run: that is the determinism the replication model depends on, showing up in the measurements rather than being asserted.

What it costs to send

An edit crosses the wire as a compact op of roughly 60 bytes — the changed fields plus the replication overhead Unreal wraps around them — rather than a chunk resync. What that totals on your server depends on how many players dig at once and how hard, so measure it against your own population rather than scaling ours.

Arriving late

A player joining a world with 9,591 edits already in the ground pulls 160 KB and is current 2.5 seconds later, at the default snapshot budget. No pause, no half-built world.

Untouched ground is free

A 1,024-chunk volume loads with zero chunks in memory — ground nobody has dug stays procedural and costs nothing. After 4,792 edits only 180 chunks had materialised, for 11.25 MB of voxel storage.

Test conditions

AMD Ryzen 9 7900X (12 cores, 24 threads, 4.7 GHz boost), 63 GB RAM, Windows 11, Unreal Engine 5.8. A single 1,024-chunk volume, 256 m square at 50 cm voxels. Each simulated player issues ten digs per second for sixty seconds with no idle time, and every figure is the median of three repeat runs. Rendering was disabled for the capture, so these are game-thread CPU costs and not frame rates. Debris and LOD were not exercised by this suite and no claim is made about them here.

Scale and debris

Performance

LOD and streaming

Three LODs with seam snapping between them, far regions that batch distant chunks into one mesh, async meshing and collision on worker threads, and World Partition streaming per volume. Meshing a 32³ chunk costs ~0.3 ms on a worker; dedicated servers build collision only.

Physics

Breaking debris

After a dig, pieces no longer connected to the volume are detected, removed on every machine and spawned as physics actors with a convex hull, replicated movement, mass from their volume, and a lifetime. Detection costs ~0.3 ms on the game thread; meshes and hulls build on workers.

Editor tools

Voxel Sculpt mode lets you drag in the viewport to dig, fill and paint placed blob volumes; each stroke is one undo step and the result is saved with the level. Live preview of blob volumes, a bounds wireframe, a cave preview toggle, and a debug-draw console variable show chunk states, LODs and terrain columns.

Known limitations

Landscape grass and foliage are not removed over holes; listen to edit events and clear them in the game. The sculpt editor mode works on blob volumes; terrain volumes are edited in play. Debris uses one convex hull per piece. Static-mesh features thinner than two voxels disappear at that voxel size.

Requirements

Unreal Engine 5.8. Blueprint or C++ project. No third-party libraries and no other plugins required. See the installation guide for setup, every parameter, and troubleshooting.

Try it on your own world

The timings above come from one machine and one content setup, and yours will not match. Drop a volume in your map, wire dig input from your PlayerController, and tune voxel size, LOD and snapshot bandwidth against your own hardware and player count rather than these — stat ButterNetVoxels and the debug draw commands show the costs live.