一些优化手段
1.UI贴图关掉MIPS,可以省掉3分之一内存,一般ASTC4x4压缩肉眼看不出变化,大色块图可以更激进
2.当布局开销过重时,可以使用无效盒或重绘盒,有额外内存开销
3.在逻辑很明确时,可以override对应函数,直接给出布局结果,避免递归子Widget
比如背包系统,能明确知道行列个数,每个ltem固定大小,可以在背包的容器层直接给出计算结果。
4.绘制的element也可以改为自定义绘制的方式,自行缓存顶点索引等数据,避免每帧重新计算
5.尽量保证同级layerid一致,打图集,为合批创造最大可能
必要时可以继承对应控件强行修改Layerld
InvalidationBox无效盒
1.优化布局开销的重要容器,减少CPU调用
2.缓存Paint产生的所有DrawElement,通过PaintFastPath快速完成绘制提交
3.标记了Volatile的Widget不会被缓存
4.CheckBox,滑动列表都可能有不刷新问题,需要手动刷新
5.Slate.InvalidationDebugging 可以显示出Volatile控件
RetainerBoX重绘盒
1.定时重绘的容器,内部会使用RT保存绘制的结果
2.有额外的内存占用
3.频繁更新的U不适合用
这两种缓存容器在播WidgetAnimation时都可能有问题
在UI上显示模型
SceneCaptureComponent2D+RT+lmage控件显示
1.先将场景中的模型Capture到一张RT上,再在UI上绘制RT贴图
2.优点:直接在场景中绘制,有全部的光影,材质效果
3.缺点:有额外的Capture,drawcall,RT内存消耗,分辨率对帧率影响非常大
SMeshWidget
1.UMG的一个用于直接显示Mesh和Instance的组件,支持多pass
2.优点:直接在UI上绘制模型,没有额外RT内存消耗,也没有额外Capture消耗
3.缺点:需要封装UMG才可以在蓝图使用,只能用UI材质
虚幻商城和github都有第三方封装过的UMG组件,包括网格,粒子,Niagara等版本
从性能角度考虑,推荐项目使用SMeshWidget方案或参考源码,自行实现绘制
将Slate控件导出到UMG使用
0verride四个函数,并用共享指针引用对应Slate控件
1.SynchronizeProperties,当属性改变时触发,同步数据给Slate控件
2.RebuildWidget,创建Slate控件
3.ReleaseSlateResources,释放Slate控件
4.GetPaletteCategory,UMG蓝图中控件面板需要显示的文字