虚幻Slate基本绘制流程主要包含两步:
预处理(SlatePrepass):预计算Slate绘制所需的信息。
绘制(Paint):为渲染层填充绘制数据。
由于每帧都计算这些信息,会造成额外开销,因为UE4.25进行了重构,进行了按需绘制。
为了减少每次递归迭代的开销,UE4.25将Widget树存储到一维数组中(FastWidgetPathList),构建了快速查找树结构,每次变化时才重新构建该列表。
新增WidgetProxy代理类,SWidget的Paint或Tick等操作由代理类转调。
BuildFastPath构建快速查找树,存储至列表FastWidgetPathList。
预处理阶段:
调用BuildFastPath构建快速查找树,存储至列表FastWidgetPathList中。
将需要更新的Widget索引记得至WidgetsNeedingUpdate列表中。
遍历WidgetsNeedingUpdate,查找FastWidgetPathList需要更新的代理,调用其ProcessInvalidation方法,里面调用对应SWidget的CacheDesiredSize方法。
绘制阶段:
在预处理阶段会将需要更新的Widget索引,存储至FinalUpdateList中。
在Paint阶段,遍历FinalUpdateList,查找FastWidgetPathList需要更新的代理,调用对应SWidget的Paint或Update。