Q&A——资源管理(五)

资源管理

Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且我把图片都打成了Bundle,然后读取出来,图片的大小应该是超过了这个SerializedFile的大小的?
UWA Tech Doc

SerializedFile是AssetBundle加载时产生的序列化信息,一般为LoadFromCacheOrDownload、LoadFromFile和New WWW加载本地AssetBundle文件所致。如果AssetBundle中的资源已经加载,且后续没有依赖该AssetBundle的资源进行加载,那么可以通过Unload(false)将其删除。SerializedFile中记录的是AssetBundle的序列化信息,而不是其包含资源的内容,因此,其大小要小于或远小于资源的实际内存。


资源管理

Q2:我游戏里重复的特效较多,有些只是图案相同但改变了颜色参数,如果都打成独立AssetBundle,则内存里面会有多份Texture。关于这样的打包一般有什么推荐的方法呢?

如果是相同内容且仅是整体颜色不同的话,那么建议项目中只保留一份初始纹理资源,并通过Shader在运行时改变其整体配色,从而达到不同的效果。但如果是局部配色不同,那么可以在原始纹理的基础上加一种或几种Mask纹理,用来负责颜色的自适应调配,然后再通过Shader来达到不同的展示效果。


资源管理

Q3:我发现ScrollRect里有大量元素,在拖动的时候触发了很多onTransformChanged,能否提供一些优化思路?

OnTransformChanged是UI元素在移动时触发的,所以该回调的开销是不可避免的,但一般来说该回调本身耗时并不会太高。因此,当OnTransformChanged耗时很高时,有三种方式进行优化:

  1. 可以先查看是否有哪个或者哪些子函数占比较高,比如,当OnTransformChanged触发了OnDimensionChanged时,耗时会明显升高,而OnDimensionChanged则是在开启了Canvas的Pixel Perfect时才会出现的。那么就可以考虑是否在拖动时暂时关闭Pixel Perfect。

  2. 如果主要是其自身开销造成,那么很可能就是因为移动的UI元素数量太大引起的。那么就可以从策略上减少UI元素数量,比如,做成拖动翻页的界面,一次性只需移动两页的UI元素等。

  3. 如果使用的是Mask组件,那么可以尝试改为Rect Mask 2D组件,同样会有性能上的提升。


资源管理

Q4:是否有办法用RenderTexture直接生成PVRTC或者ETC格式的Texture2D贴图?

目前在Unity引擎中没有办法生成PVRTC或ETC格式的RenderTexture。RenderTexture具有固定的使用格式,可参考以下链接:
https://docs.unity3d.com/ScriptReference/RenderTextureFormat.html

资源管理

Q5:我们游戏用的是TM4,4层Tilling贴图+1层融合贴图,发现手机发热现象严重,影响性能的表现,请问有什么标准或者参考数据吗?

对于中低端机器来说,我们建议地形纹理所刷的层数要尽可能小于3层。在中低端设备中,纹理采样次数越多,则GPU的压力越大,发热效果也就越明显。

在UWA性能测评报告中,我们加入了针对Graphics.PresentAndSync的统计,从而让大家来看到项目运行过程中,GPU的压力情况。同时,在设备的温度显示中,建议大家关注温度的走势图,看看是否存在大幅向下回落的情况,如果存在,则很可能是设备因为过热而主动降频。

Graphics.PresentAndSync耗时统计
请输入图片描述

设备温度走势

请输入图片描述


资源管理

Q6:我们通过AssetBundle预加载Shader后,并没有卸载AssetBundle,但是发现后面加载的Object并没有引用到正确的Shader,这可能是由于什么原因呢?

很可能是项目中AssetBundle的依赖关系打包不正确。后续加载的AssetBundle都需要与Shader的AssetBundle文件进行依赖,这样Unity引擎才会在加载后续AssetBundle时,将Shader进行关联。

建议开发团队通过UWA资源检测来检测下AssetBundle文件的依赖关系。主要查看两处,一个是Shader是否被冗余打包;一个是其他的AssetBundle是否与Shader的AB进行正确的依赖。具体检测效果如下:

请输入图片描述

如下图红框所示,开发团队可以直接查看Shader以及其他资源在AssetBundle包中的冗余情况。
请输入图片描述


资源管理

Q7:Shader.Parse 和 Shader.CreateGpuProgram 到底是做什么的?他们什么时候执行?
请输入图片描述

Shader.Parse体现的是Shader的加载和解析, Shader.CreateGpuProgram 是将Shader传入GPU的一次提交,GPU驱动会对其进行编译,以适应于特定的设备或平台。在Unity 5.x版本中,Shader.Parse在Shader资源加载时进行执行,而 Shader.CreateGpuProgram在所在GameObject第一渲染时进行执行。

资源管理

Q8:我在UWA上提交了资源检测,资源打的是依赖包,报告显示Default—Particle这个资源存在大量冗余,这个是正常的吗?

请输入图片描述

Default—Particle 这个是粒子系统的默认资源。如果使用的是默认的粒子系统,没有对Material进行修改,且每个粒子系统都是打一个AssetBundle文件的话,那么该冗余问题是正常的。对此,我们建议开发团队把下图中默认的Material换成自己的资源,不使用Built-in资源,这样通过依赖关系打包,就不会出现该资源冗余的问题了。
请输入图片描述


资源管理

Q9:从点击应用到出现游戏画面,这个时间长短是不是和Resource目录大小有关系?

从点击应用到首次出现应用画面,其加载时间主要与两方面相关:

  1. Resources文件夹中的资源数量。在游戏启动时,Unity引擎会为Resources文件夹下的资源建立一个查找树来存放与其对应的索引,便于后续资源的加载。一般来说,Resouces文件夹下资源数量越多,其构建时间越长,应用的启动也就越慢;

  2. 首场景的资源加载和相关代码的初始化工作。如果首场景的资源量较多,其脚本初始化的任务较重,则应用的启动时间也会越慢。


资源管理

Q10:我用的是NGUI,本来已经打包图集了,输出时候是不是就不用理会那些原始2D Sprite图 ?粒子贴图需要Packing Tag吗?

在NGUI中使用Atlas后,原纹理是不需要进行打包或进行其他特殊处理的,因为理论上这些资源在运行时已不再需要。粒子系统所使用的纹理并不是Sprite类型的,因此不需要设置Packing Tag。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值