UGUI*个人笔记

五道题为一组,手动回答。后期复习再语音回答

1.介绍一下UGUI的核心组件和原理?

2.说一下meshRender中material和sharedmaterial的区别?

3.说一下image和rawimage的区别?

4.如何在不同分辨率下保持UI的一致性?

5.再说一下UGUI的常用组件和具体实现?

6.描述一下UGUI的事件传递流程是怎么样的?

7.什么是UI的动静分离?如何进行优化?

8.为什么要拆分过大的UI?如何进行拆分?

9.为什么要进行UI的预加载?如何进行UI的预加载?

10.UGUI图在改变颜色或者alpha后,会导致mesh重构和增加Drawcall吗?

11.UI展示与关闭如何优化?

12.UI对象池如何运用?

13.如何针对高低端机型进行优化?

14.UI图集拼接如何优化?

**15.说一说Mask合批怎么处理 和rectMask2D?

手动答题:

1.介绍一下UGUI的核心组件和原理? 

核心组件包括三个canvas ,canvas scaler, canvas raycaster...canvas很重要的优化是可以对画布上,相同层级,相同材质球进行合并,减少系统开销,还有一个render mode渲染模式也很重要,有基于camera的screen camera模式,不基于camera的overlay模式,还有以世界为基准的world space模式,都有不同作用。canvas scaler则是缩放比例组件,constant pixel size ,scale with screen size,constant physical size以物理大小为基准的适配准则,像手游中适配通常使用scale with screen size 。  graphic raycaster就是输入系统的图形碰撞测试组件,检测的都是画布下的元素,通过射线碰撞测试来检测碰撞的元素。

原理:UGUI是3D网格下建立起来的UI系统,每个显示的元素都是以3D网格构建的,所以UI实例化时,首先就是构建网格,然后网格绑定材质球,放入图片。优化时候主要涉及图集的概念,把相同图片相同shader的材质球进行合并,但是合并和拆分都会消耗CPU,UI要做的就是节省CPU让位给项目逻辑达到优秀性能开销。

2.说一下meshRender中material和sharedmaterial的区别?

sharedmaterial会改变所有物体使用这个材质的外观,包括工程文件,所以一般如果想改渲染器的材质都使用material替代。

3.说一下image和rawimage的区别?

1.image主要是进行一些裁剪平铺旋转,有操作的方便,rawimage则用于单独展示图片

2.因为image比rawimage的性能开销更高,

3.另外image只能使用spirte属性的图片,但rawimage都可以使用。

4.如何在不同分辨率下保持UI的一致性?

不同分辨率主要考虑的是布局元素的位置和布局元素的尺寸

位置使用 rect Transfrom 组件   尺寸使用canvas Scaler组件,

canvasscaler主要使用scale mode三种模式,1/2/3根据屏幕分辨率进行缩放最常用。

5.再说一下UGUI的常用组件和具体实现?

UGUI是在3D网格下建立起来的UI系统

canvas   canvas scaler  graphic raycaster  eventTrigger  image/rawimage  mask  rectMask2D 

其他

6.描述一下UGUI的事件传递流程是怎么样的?

事件体系由四部分组成(MCDR):监测器,采集器,派发器,响应器

具体实现每个功能模块都有对应的实现类,

监测器是eventSystem ,在每一帧挂载是否要激活

采集器是baseinputmodule,和baseraycaster,前一个激活模块,然后射线点触,返回baseraycaster中能点到的物体并返回信息由派发器过滤

派发器也是baseinputmodule,完成实际事件的生成,其中派发器需要借助采集器,但需要监测器来驱动

响应器是IEventSystemHandler 例如最终把事件派发到鼠标onclick的代理上,完成逻辑的执行。

7.什么是UI的动静分离?如何进行优化?

动是指元素移动,放大缩小,静是指不懂或者动的少的UI,

因为UGUI底层都做了对mesh的优化,不然会导致过多drawcall影响GPU消耗,所以要分开,把合并的范围缩小,只合并会动的UI元素,因为他们的重绘频率较高,让不动的不参与重新合并。

具体操作的话:以canvas为节点进行拆分,把会动的UI元素放入专门准备的合并节点上,不会动的留在原地。

8.为什么要拆分过大的UI?如何进行拆分?

UI界面功能不断增加,例如一个prefab里,装着两三个界面,最终消耗的CPU过大

拆分方法的话,可以把隐藏的UI界面调出来,成为独立运作的界面,只在需要的时候实例化,2次显示内容也可以单独调出来成为独立界面,但主要权衡加载速度和内存,小个体频繁加载和销毁也会消耗过多CPU。

9.为什么要进行UI的预加载?如何进行UI的预加载?

预防打开界面卡顿,在游戏开始前加载一些UI界面,让实例化的消耗在游戏前平均分摊在等待的时间线上。

如何进行:可以在游戏开始前加载UI资源到内存里,但不实例化,这样具体操作的时候就只会把CPU消耗放在实例化和初始化上。如果还是卡顿,把实例化和初始化也提前,只是对界面进行隐藏,不用的时候也只是隐藏,这样CPU只需要处理展示和隐藏。

所有的预加载并没有改变游戏要加载的数量和速度,只是集中和提前了。

10.UGUI图在改变颜色或者alpha后,会导致mesh重构和增加Drawcall吗?

原理是修改了顶点色,会重构,但是材质不变,所以不增加drawcall

可以采用自定义材质球进行优化,提前通知UGUI使用这个材质球渲染,直接修改这个材质球,避免mesh的重建带来的计算量。

11.UI展示与关闭如何优化?

通过碎片时间预加载,让展示速度变快,关闭时只是隐藏节点,打开时再显示节点(隐藏CPU消耗少,但是显示需要CPU的mesh重构,消耗挺多的),或者关闭时候直接移出屏幕(用坐标做摄像机的渲染排除),或者打开关闭时,设置UI界面为其他层级的layout(摄像机排除),这都是用内存换CPU。

12.UI对象池如何运用?

这也是用内存换CPU的方法,减少不断销毁和实例化的过程,需要重复实例化和销毁的对象可以放入对象池

记得调用使用频率高的对池子优化,然后结束场景的时候进行全销毁。

13.如何针对高低端机型进行优化?

UI贴图质量压缩/ /整体贴图渲染质量  /特效使用情况 /阴影使用情况/ 抗噪声LOD像素光数量区别对待

14.UI图集拼接如何优化?

充分利用图集空间,控制图集的大小和规范,图片的拼接进行归类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值