今日学习
UE4 UWorldComposition 理解
UE4中WorldComposition代表了世界的构成结构,UE4不存在传统引擎中严格的Scene和SceneManager的概念,对于UE4的场景和场景管理的实现是散落在许多类中的。UE4中GameThread中的UWorld类和RenderThread中的FScene类实现了渲染的世界,他们一般有一一对应的关系。UWorld用于游戏线程,用于用户的主动操作(如创建、删除世界中的物件等);而FScene则隐藏于渲染线程,由UWorld和世界中的对象被动操作。
UE4和其它支持大世界的引擎一样支持游戏场景中的物体动态加载和卸载。但它对于大世界的拆分方式是比较独特的——UE4的场景的划分模式不是基于物件级而是基于子关卡级来做。 在UE4中,一个UWorld由一个一直存在的持久关卡(ULevel类)和多个动态加载卸载的子关卡组成。UE4中这种动态加载卸载的子关卡叫做流关卡(StreamingLevel ,ULevelStreaming类),且场景中的具体物件都是放置在关卡或流关卡中而不是直接位于UWorld中。
UE4中的流关卡的加、卸载策略实现是由UWorldComposition类来负责的。这是一个基于视点距离和流关卡卡包围盒的简单的加载策略实现。
(以上源自知乎)
World Composition设计初衷就是为了简化大世界的管理。目标之一是避免使用持久关卡存储流信息。持久关卡不存储任何流信息,而是扫描文件夹将找到的所有关卡视为streamingLevel流关卡。每个流关卡都存储在程序包头(package header)中,WorldComposition可以读取信息,无需将这个关卡加载到内存中。 初始化时,除了持久关卡之外的关卡都会在WorldCompsition中卸载掉。我们可以随时手动加载或卸载世界的任意部分。
(需要理解持久关卡概念 流的概念)
具体使用
Enable之后选择确定
此时可以在关卡页签下查看所有加载的子关卡(可以不开)(开了之后运行项目现在我卡了 不动了 有点慌)大概就是这么个意思
文档中说显示蓝色的是当前关卡,显示白色的是已加载关卡,显示灰色是已卸载关卡
Layers 的概念是设置Level的加载距离相关的,streamingLevel Load distance60000 = 600米 单位应该是厘米。Layer无法删除或编辑,因此,如果您想更改流距离设置,请使用所需的设置创建一个新图层并为其指定Level。 下次打开关卡时,没有分配关卡的图层将被自动删除。您可以通过单击小地图上方的图层名称来按Layer过滤级别。 您可以使用Control +鼠标单击来切换多个Layer。 如果没有启用任何Layer,则不会执行过滤。
粗看代码
第一眼就看到这个方法 看来就是生成当前package的所有streamingLevel方法拉(RescanNewLevels还有个这个)
(两者执行时机并不是完全同步)
/** Scans world root folder for relevant packages and initializes world composition structures */
void Rescan(bool bPopulateLevelStreaming = true