I’ve been diving into the CesiumJS for about one month now, and I’m absolutely blown away by the technology. However, as a beginner, I’ve run into a performance “wall” that I’m struggling to overcome regarding the rendering of many complex models.
My Project Context:
I need to render about 800+ high-poly buildings at specific coordinates. Each building is a GLB model with a complex internal Node Hierarchy (it’s not just a single mesh; it has nested parts, sub-meshes, etc.).
Since I’m starting fresh, I went straight to 3D Tiles 1.1 because I wanted to use the latest features like Implicit Tiling and GPU Instancing (EXT_mesh_gpu_instancing). But I feel like I’m stuck between two bad options.
The Struggle:
- Hierarchy vs. Instancing: I learned that EXT_mesh_gpu_instancing works at the Node level. To instance my “entire building,” it seems I have to flatten the hierarchy into one mesh. But doing this destroys my model’s structure.
- Performance: When I don’t use instancing (to keep the hierarchy), my Draw Calls go through the roof, and my FPS drops significantly on the web browser.
- LOD Confusion: I’ve tried a hybrid approach (using simple Billboards/Quads for far distances and full models for close-up), but I’m not sure if I’m implementing the Implicit Tiling correctly to swap these out efficiently without losing the hierarchy at the final level.
I would love some guidance on:
- Is there a “standard” way to instance complex hierarchical objects in 3D Tiles 1.1 without breaking them?
- Can I somehow “re-use” the same hierarchical GLB resource across many tiles in an Implicit Quadtree (like how the old.i3dm used to point to a URL)?
- Am I overcomplicating things? Should I stick to 3D Tiles 1.0, or is there a specific 1.1 feature (like Structural Metadata) that handles this better?
I’ve been reading the documentation and trying to use
@gltf-transform for my pipeline, but I feel I might be missing
a fundamental concept here.
Here is the node structure of one building:
This is how I structured my Implicit Tileset:
{
"asset": {
"version": "1.1",
"generator": "Implicit-Hybrid-Generator"
},
"geometricError": 4096,
"root": {
"boundingVolume": {
"region": [
1.8448277673901856,
0.35906409119196303,
1.845137039733639,
0.3592540179211651,
-100,
1000
]
},
"geometricError": 2048,
"refine": "REPLACE",
"content": {
"uri": "content/{level}/{x}/{y}.glb"
},
"implicitTiling": {
"subdivisionScheme": "QUADTREE",
"availableLevels": 5,
"subtreeLevels": 5,
"subtrees": {
"uri": "subtrees/{level}/{x}/{y}.subtree"
}
}
}
}
Technical Setup:
- CesiumJS 1.115+ (1 month experience)
- 3D Tiles 1.1 (Implicit Tiling)
- Models: High-poly GLB with nested nodes.
Any advice, patterns, or tips would be immensely helpful!
Thank you so much for your patience and help!

