TL;DR
Get the latest gadgets delivered free — and shop member deals
- Fast, free delivery on millions of items
- Access to Prime Big Deal Days deals on October 6–7
- Prime Video, Amazon Music and more included
Solo developer Eniko Fox implemented a CPU-rendered depth-based occlusion culling system for the in-development ‘Block Game’, cutting at least 50% of chunks that survive frustum culling and reaching 400+ FPS on weak integrated graphics, especially underground. The system renders cube occluders into a low-resolution software depth buffer on a background thread.
Solo developer Eniko Fox has published a technical report detailing a software-rendered occlusion culling system for the in-development voxel sandbox “Block Game,” a technique that culls at least 50% of the chunks that survive standard frustum culling — and up to 95% in caves and interiors — enabling framerates above 400 frames per second even on modest hardware. The report matters because it demonstrates a conceptually simple CPU-based approach that avoids both complex culling algorithms and GPU stalls, a relevant trade-off for developers targeting low-end machines using game development tools.
Fox develops Block Game using FNA, a reimplementation of older .NET graphics APIs, which the report says rules out leveraging modern GPU occlusion-query features. Reading back the GPU depth buffer was possible, according to the report, but only synchronously, which “would necessarily involve some kind GPU stall which isn’t great.” The chosen alternative: render occluders entirely on the CPU into a 256×128-pixel depth buffer stored as a simple array of floats.
Because the game world consists of axis-aligned cubes, Fox’s system renders cubes into that buffer and tests other cubes — candidate chunks — against it. When a chunk is rebuilt after world changes, the system builds a five-level hierarchy of occluding subchunks, from an entire 16x16x16 chunk down to individual blocks, marking as occluders any fully opaque cube of blocks with a visible face. Occluders are gathered based on distance from the camera, with individual-block occluders limited to a 20-block radius, and each occluder’s cube is shrunk by one pixel horizontally and vertically to avoid false positive occlusions.
The culling work runs on a background thread that completes, per the report, “in half a frame at 60 FPS or less.” Thread safety is achieved by having the occlusion culler copy each candidate chunk’s position, size, and index before the background work begins, so it never touches live chunk data during processing.
What This Means for Low-End Game Performance
The results directly address Fox’s stated goal of making the game “run well even on a potato.” According to the report, above ground looking toward the horizon the system culls roughly 50 to 60% of chunks, while indoors and underground in caves it can cull upwards of 95%, producing framerates of 400+ even on the developer’s weak test system — an integrated Radeon Vega 8 in a Ryzen 7 5700G, which Fox notes benchmarked only 48% faster than a 14-year-old laptop GPU on UserBenchmark.
Beyond the raw numbers, the approach is a case study in trading sophistication for simplicity. Fox explicitly avoided hierarchical Z buffers, motion-vector reuse, and asynchronous GPU readback — techniques Fox acknowledges exist — in favor of a system simple enough to implement, debug, and run on a background thread without GPU interaction. For other indie developers on older graphics APIs, the report suggests that block games’ uniform cube geometry makes a stripped-down software culler practical where more general scenes would require heavier machinery.
How Depth Occlusion Culling Works
Depth-based occlusion culling, as the report summarizes it, takes a scene’s depth buffer and checks each cullable object against it: if none of an object’s pixels would be visible in that buffer, the object is culled rather than rendered. Established implementations often extend this with hierarchical Z buffers (rendering at higher resolution and conservatively downsampling using the farthest depth), GPU-driven queries, motion vectors that reuse the previous frame’s buffer, or asynchronous readback that moves a GPU-rendered depth buffer to the CPU without stalling the graphics pipeline.
Fox’s system uses none of these. Block Game’s chunks are 16x16x16 cubes, and Fox notes that block games “tend to have a ton of hidden geometry in the form of underground caves” — geometry that alternative culling algorithms could remove only at the cost of what the report calls “fairly complex” implementations. The report describes the outcome as “a resounding success,” while acknowledging failure cases it says are addressed at the end of the full post, portions of which were not included in the material summarized here.
“It runs in half a frame at 60 FPS or less (threaded, of course) and generally culls at least 50% of the chunks that survive frustum culling.”
— Eniko Fox, developer of Block Game
Known Limitations and Unreported Details
The report itself flags that the system “has some cases where it breaks down,” which Fox says are covered at the end of the original post — those failure cases were not included in the material summarized here and are not detailed in this article. The reason level-0 occluders of full 16x16x16 chunk size “never seem to” exist, as the report phrases it, is presented as an observation rather than a fully explained finding, and Fox notes such occluders could theoretically be added anyway.
Performance figures are self-reported on a single development machine with specific conditions (fixed resolution, particular scenes) and have not been independently verified. The 48% UserBenchmark comparison comes with the developer’s own caveat about that site’s contested accuracy. Block Game is a working-titled project still in development, and the report does not state whether the system’s behavior will hold across all world types or on the actual 2012-era hardware Fox cites as the low-end target.
Remaining Work on the Culler
According to the report, potential extensions include adding full 16x16x16 chunk-sized occluders at the top of the occluder hierarchy, which Fox says never currently occur but could be supported. Readers interested in the implementation process can consult the original report on Fox’s website and a development thread the developer posted on Mastodon and Bluesky. No release timeline for Block Game or further milestones for the culling system were stated in the available material.
Key Questions
What is software occlusion culling?
It is a method of deciding which objects to render by checking them against a depth buffer maintained on the CPU. Objects whose pixels would all be hidden behind already-rendered geometry are skipped entirely. In Block Game’s case, that buffer is a 256×128 array of floats rendered by the CPU rather than the GPU.
How much performance does the system actually save?
Per Fox’s report, it culls at least 50% of the chunks remaining after frustum culling, 50–60% when looking at the horizon above ground, and upwards of 95% in caves and interiors, yielding 400+ FPS on integrated graphics in those best-case scenes. These are self-reported figures from a single machine.
Why render the depth buffer on the CPU instead of the GPU?
Because Block Game uses FNA, GPU depth-buffer readback would be synchronous and cause a GPU stall, according to Fox. A CPU-rendered buffer avoids the stall and keeps the culling work safely on a background thread.
Does the system have weaknesses?
Yes. Fox states the system “has some cases where it breaks down,” described at the end of the original report; those details were not part of the summarized material. Occluder cubes are also deliberately shrunk by one pixel to prevent false occlusions, which causes distant occluders to stop contributing.
What hardware is Block Game targeting?
Fox cites a 2012-era laptop as the low-end target and develops on a machine with an integrated Radeon Vega 8 GPU, stating the goal that the game “run well even on a potato.” No release date or minimum specifications have been announced.
Source: hn
Fall Picks
fall essentials
As an affiliate, we earn on qualifying purchases.
