资源管理
Q1:我们游戏用的是TM4,4层Tilling贴图+1层融合贴图,发现手机发热现象严重,影响性能的表现,请问有什么标准或者参考数据吗?
对于中低端机器来说,我们建议地形纹理所刷的层数要尽可能小于3层。在中低端设备中,纹理采样次数越多,则GPU的压力越大,发热效果也就越明显。
在UWA性能测评报告中,我们加入了针对Graphics.PresentAndSync的统计,从而让大家来看到项目运行过程中,GPU的压力情况。同时,在设备的温度显示中,建议大家关注温度的走势图,看看是否存在大幅向下回落的情况,如果存在,则很可能是设备因为过热而主动降频。
Graphics.PresentAndSync耗时统计
设备温度走势
资源管理
Q2:我们通过AssetBundle预加载Shader后,并没有卸载AssetBundle,但是发现后面加载的Object并没有引用到正确的Shader,这可能是由于什么原因呢?
很可能是项目中AssetBundle的依赖关系打包不正确。后续加载的AssetBundle都需要与Shader的AssetBundle文件进行依赖,这样Unity引擎才会在加载后续AssetBundle时,将Shader进行关联。
建议开发团队通过UWA资源检测来检测下AssetBundle文件的依赖关系。主要查看两处,一个是Shader是否被冗余打包;一个是其他的AssetBundle是否与Shader的AB进行正确的依赖。具体检测效果如下:
如下图红框所示,开发团队可以直接查看Shader以及其他资源在AssetBundle包中的冗余情况。
资源管理
Q3:Shader.Parse 和 Shader.CreateGpuProgram 到底是做什么的?他们什么时候执行?
Shader.Parse体现的是Shader的加载和解析, Shader.CreateGpuProgram 是将Shader传入GPU的一次提交,GPU驱动会对其进行编译,以适应于特定的设备或平台。在Unity 5.x版本中,Shader.Parse在Shader资源加载时进行执行,而 Shader.CreateGpuProgram在所在GameObject第一渲染时进行执行。
UI输入
Q4:动静分离或者多Canvas带来性能提升的理论基础是什么呢?如果静态部分不变动,整个Canvas就不刷新了?
在UGUI中,网格的更新或重建(为了尽可能合并UI部分的DrawCall)是以Canvas为单位的,且只在其中的UI元素发生变动(位置、颜色等)时才会进行。因此,将动态UI元素与静态UI元素分离后,可以将动态UI元素的变化所引起的网格更新或重建所涉及到的范围变小,从而降低一定的开销。而静态UI元素所在的Canvas则不会出现网格更新和重建的开销。
UI输入
Q5:关于UI的Mask遮挡特效,能否提供一些解决思路呢?
目前由于UI与粒子系统是两个相对独立的模块,因此两者的Mask遮挡并没有简单直接的方法。我们建议从以下几种方式来考虑实现:
- 将粒子系统转为序列帧,通过纯UI的方式来实现;
- 通过RenderTexture,添加一个相机来实现方形的“裁剪”;
- 参考UI的内置Shader,编写一个受Stencil Buffer影响的Shader,同时通过给粒子系统以及UI的SortingLayer,OrderInLayer设置适当的值,从而实现Mask组件对粒子系统的遮罩。
今天的分享就到这里。
原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。