← blog
Dec 24, 2022

Hierarchical LODs and Culling

Have you ever wondered how games like PUBG and Fortnite, with such massive open worlds and enormous numbers of objects, still run at 60fps on a mobile device? These games employ various optimization techniques. Two of the most important are based on the same fundamental principle: don't render what the player can't meaningfully see.

Hierarchical LODs

Hierarchical Level of Detail (HLOD) divides a 3D scene into hierarchical levels of detail. Each LOD represents a group of objects that are displayed at a certain level of detail depending on the distance of those objects from the viewer.

The technique organizes scenes into clusters at the highest hierarchy level. As the viewer approaches a cluster, the detail level increases and more objects get rendered individually. This allows the renderer to prioritize important nearby objects while representing distant areas as simplified merged meshes.

In Unreal Engine, this is implemented as HLOD proxies — entire clusters of actors merged into low-poly stand-ins that swap in when the player is far enough away. The visual difference is imperceptible at distance, but the performance savings are significant.

Hierarchical Culling

Hierarchical culling reduces the number of rendered objects by eliminating those that the player cannot see. While similar in spirit to HLOD, it emphasizes reducing object count rather than adjusting individual object detail levels.

Implementation commonly uses spatial data structures — octrees or quadtrees — to create hierarchical region boundaries. The renderer only processes objects within regions that are currently in view. If the bounding volume of an entire region fails the visibility test, everything inside is skipped without examining individual objects.

This is closely related to Bounding Volume Hierarchy (BVH), which takes the same idea and applies it to ray-object intersection tests in ray tracing and ray casting scenarios.

The Core Principle

Both techniques share the same insight: the cost of rendering scales with what you actually render, not with what exists in the scene. A world with a million objects can run fast if only a few thousand are ever processed in any given frame. The challenge is building the data structures and heuristics that make those decisions cheaply and correctly.