UE5.7的InstancedStaticMeshComponent,调用AddInstance后,如果Instance距离过远就会被剔除掉。5.6正常

[Image Removed]

看代码,5.7比5.6多了一些代码,断点调试了一下会发现在AddInstance后,会先更新NavMesh的Bounds,这时其他类型的Bounds都是有效的,因此会使用其他类型Bounds直接更新给NavMesh的Bounds。

之后​调用InvalidateCachedBounds让所有Bounds都设为无效,但因为前面更新过NavMesh的Bounds,所以又把NavMesh的Bounds直接设为有效。

之后其他Bounds在重新计算时,由于​NavMesh的Bounds有效,就用NavMesh的Bounds刷新了所有Bounds。

最后导致AddInstance之后,最终所有Bounds都还是老的Bounds,就相当于没有重新计算Bounds。​

5.6没有后面这段代码,表现是正常的不会被错误剔除,目前升级到官方5.7版(非源码版本),请问在不改引擎源码的情况下,应该怎样解决这个问题?

你好,看了您的描述,​我觉得有个细节可以再交流的清楚一点,您说之后其他Bounds在重新计算时,由于​NavMesh的Bounds有效,就用NavMesh的Bounds刷新了所有Bounds,这个我的理解在计算Hash的时候会把其type以及不同空间都包含进来,因此不应该出现NavMesh的Bounds会刷新所有Bounds的情况,您能否提供一个重现工程,视频什么的,我这边再根据具体情况来提交是navigation还是rendering的问题,最后如果不修改源码情况下,我觉得也只能把ISMC的bCanEverAffectNavigation关掉不走这块缓存处理流程来绕过这个问题,或者将视觉和导航拆开去处理

这是测试工程和测试视频的zip包,每秒会动态Add一个Instance,镜头向右看就可以看到Instance会被裁剪掉,同样的测试方法,在5.6版本就都是正常的。具体原因就如同上述问题所示。

感谢反馈,看上去​RenderUpdate时想要UpdateBounds,但却直接从CacheBounds里的navigation里拿了,并没有实际重新计算整体bounds,5.7中bNavigationCachedBoundsUpdated的引入也需要考虑RenderUpdate想要UpdateBounds的情况,我会提个Jira反馈并在后面的版本中修复。

这个Jira已提交后续会看到,该问题已在5.7.2上修复,谢谢反馈