Level streaming with continuous landscape

So I looked at how EG did level streaming in boy-kite and for some of it makes sense (overall it’s mind-blowingly complicated and i wished there was some kind of step-by-step breakdown of how the whole thing is built; the youtube videos EG posted just cover a lot of theory about the assets they made, and don’t really give a tutorial on how they actually put all of it together). For example, I see there’s a “cave” section, and since you can’t see any the internals from the outside, it seems they just used SM assets (boulders, etc) to stitch the cave opening with the interior level, and none of it gets rendered until you actually get near the cave.

What I’m not clear on is: does that same concept work for a single, large continuous landscape? Case in point, I imported a single large non-tiled heightmap which I then tile by selecting sections of the landscape and moving them to separate levels. From a resource management, that part makes sense because I can do foliage, lighting, etc. all within a level by itself, though I’m not sure how to handle things like sky lighting and such that i would assume to put on the top persistent level. Do they overlap? Looking at the cave interior in kite, all the lighting is interior and you can see there’s no sky light and looking through any openings you just get black space. But I don’t want to double up on exterior lighting, or have the sky sphere appear twice, etc.

Also, does streaming distance control the loading of the different landscape sections, like how LOD controls the resource usage by loading in lower-quality versions at far distances? and if there’s something that would be visible by line-of-sight but is farther away than streaming distance, does that mean it won’t be visible? For example, if i place trees really far away but on landscape that’s in the same level, I see billboards, even though the trees are like 10km away (because i have the foliage cull distance disabled). if those trees were on a separate level and were further away than the streaming distance, would they just not appear, and then “pop” into view as I approached the level bounds?

Basically I’m looking for tips, info, and/or explanations for how level streaming works with continuous landscape.


Well by it’s other names level streaming in other applications is called x-referencing so from a theory part you can break an environment into blocks so as to make environment management much easier as well make use of optimization features such as persistent loading possible. As in most things in game development goes thou is the context in which a feature is used that at times it can get confusing as to what is assumed is best practice.

For example your lighting solution does not need to be in the persistent level but placed in a level stream, aka x-referenced, and by switching the streaming method to always loaded it’s always visible to the projects persistent level.Another option is you can make the level a Lighting Scenario where the lightmaps generated are stored with in that level. This way you can switch between night and day with out having to resort to dynamic lighting.

LS also helps to break down the environment into individual parts so groups of individuals can work on the same project at the same time with out the problems usually associated with the much larger project (I’m looking at you shader compiles). Lets say Bob is working on the caves he can load in the cave level as a persistent level, included the landscape and Lighting Scenario and is able to quickly build shaders as well compile lighting at production level with out having to included the complete project. Once done save the level as normal with out the additional levels and when the main persistent level is loaded it will included the updates.

The Platformer example is also done in blocks.