Hello!
We have been seeing the same landscape related PSO hitches discussed in this thread: [Missing Landscape [Content removed]
I had actually implemented the same fix in 5.7 before finding this thread and realizing it would be ‘fixed’ in 5.8. We haven’t moved our project to 5.8 yet, but AFAIK there is not a solution to the landscape pop-in / holes that the deferral strategy causes in 5.8. The pop-in is very prominent and means this change on its own doesn’t resolve the issue for us.
I have been investigating potential solutions here, the most promising of which would be delaying the hiding of the HLOD for the cell containing the landscape components that trigger the PSO precache. I have a prototype which works well but we have risk concerns due to the complexity of the surrounding systems, and haven’t determined the ‘correct’ implementation yet.
The current implementation works by having the landscape components (which could be genericized to UPrimitiveComponent) inform the UWorldPartitionHLODRuntimeSubsystem that the streaming cell containing them has a pending scene proxy creation (which is deferred due to the PSO precache). When the UWorldPartitionHLODRuntimeSubsystem is told that this cell is shown (and thus it should hide the HLOD), if there is pending scene proxy creation then it defers the hide until all the components in that cell have created the scene proxy.
This works but we’re not sure what the best injection point is for the component to tell the HLOD subsystem there is a pending scene proxy creation (and subsequently clear that flag). CreateSceneProxy can be called from multiple threads and takes place during the render update, so there’s potential for race conditions. We have also seen that UWorldPartitionHLODRuntimeSubsystem has a warmup system that (somewhat counter-intuitively) also has a warm-down delay for when the HLOD would be hidden (UWorldPartitionHLODRuntimeSubsystem::CanMakeVisible), so we’re thinking this could potentially check the PSO state of the cell’s components so CanMakeInvisible returns false until the precache has completed. But I haven’t looked into this route in detail yet.
I’m mainly asking what you think the best approach here is. Assuming there’s not already some solution in 5.8 that I’ve missed. What advice do you have on solving this problem? Thanks!