Skip ancestors level of detail when loading tiles

We are using Cesium3DTilesSelection::Tileset::updateViewGroup() and Cesium3DTilesSelection::Tileset::loadTiles() to load the tiles in our camera view. What we would like is to only load the final tiles for our current view and not load ancestor tiles which will be replaced by more detailed tiles anyway. In our use case we don’t care about giving the user visual feedback that tiles are loading but rather want to load the absolute minimum of tiles.

Is it possible to achieve this behavior only by configurating Cesium3DTilesSelection::TilesetOptions properly?

We have been experimenting a bit with the settings we believe are relevant (maximumSimultaneousTileLoads, loadingDescendantLimit, mainThreadLoadingTimeLimit) but have not gotten the desired behavior. If it’s not possible simply by configuration in Cesium3DTilesSelection::TilesetOptions any guidance to our best options would be very helpful.

In CesiumJS there seems to be “skipLevelOfDetail” which does what we want but I have not been able to find any configuration corresponding directly to it in Cesium Native.

Hi @Axel_Blackert, welcome to the community!

There are several variables on TilesetOptions (beside the ones you listed) that can prevent extraneous tiles from fully loading:

  • preloadAncestors = false (most relevant, otherwise it loads ancestors to improve appearance when zooming)
  • preloadSiblings = false (otherwise loads siblings to improve appearance panning the camera)
  • enableFrustumCulling = true (culls everything outside the camera frustum)
  • renderTilesUnderCamera = false (otherwise loads tiles under camera to stop a player from falling through terrain, for instance)

It’s possible that some ancestor tiles will still get loaded, because the tile selection algorithm inherently tries to balance level-of-detail with quick visual feedback. But hopefully those options will give you more success. Let us know how it goes!

Hi @Axel_Blackert,

I just want to add a bit to what Janine said. The most important setting for this purpose is one that you already mentioned, loadingDescendantLimit. If you set that to a large number, like 10000, and change no other settings, then only the tiles required for the current view will be loaded, with no visual feedback, and then they will all appear at once. Turning off the preload options may help too, but the preloads only happen after the tiles needed for rendering are loaded, so it’s unlikely to make much difference. enableFrustumCulling=true is indeed important, but that should be the default.

One subtlety to mention if you’re using certain tilesets, notably Google Photorealistic 3D Tiles. Some tilesets use what’s called “external tilesets”, which means that the complete tile tree isn’t stated up front. In Google’s case, it would be far too big. Instead, a partial representation of the tile tree is provided, and then the client loads further subtrees as required. This structure may interfere with attempts to exclusively load the visible tiles, but Cesium Native will do its best.