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

资源管理

Q1:请教个问题,我用Unity 5 里提供的Sprite Packer把A.png,B.png打进一张图集,在运行时我怎么方便地加载这两张图呢?使用场景:某个Image控件根据不同的条件显示A,或者显示B。

目前通常是在脚本序列化信息中保留这两个Sprite的引用,在切换时直接通过对Image.sprite进行赋值来切换。


资源管理

Q2:在UWA性能报告中,你们建议我们选中Optimize GameObject来提升Mecanim动画模块的运行性能,但是这个功能会隐蔽角色骨骼,那么要挂载该骨骼上的这个点就无法查询了,有什么办法可以解决这个问题吗?

是的,开启Optimize GameObject默认情况下会将动画网格下的所有骨骼结点隐藏,但是,你可以通过“Extra Transform to Expose”查看你想通过脚本获取的骨骼结点,这样既可以提升该角色的动画模块性能,又可以达到获取某个关键结点的需求。

请输入图片描述

资源管理

Q3: 我在Profiler中看到Other下System.ExecutableAndDlls的内存很大,请问这个是什么东西,对我们游戏的性能影响很大吗?
请输入图片描述

一般来说,在移动游戏中,该选项经常在iOS真机运行时会看到,System.ExecutableAndDlls该项显示的是执行文件和所调用的库(物理、渲染、IO等系统库)的总和。开发团队不用太担心该选项的数值,因为很多应用均在共用这些库,并且它对于真实项目的内存压力非常小,几乎没有影响,而且OS也不会因为该内存而杀掉游戏或应用。


资源管理

Q4:我们发现材质实例数量特别多,想问下这个对性能的影响如何,有没有什么建议?

Material的内存占用一般很小,所以大量的Material资源对于内存的压力其实很小的。但是,它本身对于场景的切换时间是有影响的,即资源冗余得越多,切换场景时,UnloadUnusedAssets的开销越大,进而增加了场景的切换时间,同时也会影响DrawCall的拼合。所以,建议研发团队尽可能定位资源冗余的原因,并对其进行修复和完善。这一点,我们在UWA性能测评报告中的“分析和建议”中都有详细说明。
请输入图片描述


资源管理

Q5:现在Unity还不能将场景和 NavMesh数据或者Lightmap数据分离,是吗?我是想先加载一个干净的场景,然后再动态切入不同的光照贴图和NavMesh网格数据,有什么办法吗?

Lightmap是可以与场景分离的,并且可以通过AssetBundle进行动态加载。建议将Lightmap作为普通的资源进行打包,动态加载后,通过LightmapSetting接口整体替换场景的Lightmap。目前,Navmesh确实是无法与场景分离的。但是在Unity 5.x版本以后,引擎已经允许通过LoadLevelAdditive加载多个场景的方式来加载NavMesh,因此,研发团队可以尝试预先将NavMesh在多个场景内烘焙好,然后通过LoadLevelAddtive或类似API来进行加载,从而达到动态加载NavMesh的效果。


资源管理

Q6:判断怪物是否在相机视野范围有没有什么好方法?

方法有很多,但一般推荐研发团队尝试将怪物身上的中心点(或包围盒的顶点)向屏幕做投影,根据UV值来判断是否在相机视野范围之内。

开发团队可以在脚本中添加 OnWillRenderObject 或者 OnBecameVisible/OnBecameInvisible 的回调函数,这些函数分别会在对应的Renderer可见或者变为可见/不可见时被调用,具体的信息可见:
http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnWillRenderObject.html
http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnBecameVisible.html

资源管理

Q7:我们现在为了美观,需要同时使用2套字体。但是每增加一套字体,就会内存增加50MB左右。请问你们在优化其他Unity游戏时,怎么处理类似情况的?

如果美术字不多的话,建议使用单独的字体贴图来进行实现,从而来达到特定美术字显示的效果;如果美术字较多的话,那么仅能建议使用另外一个套字体来进行实现。一般来说,字体的内存量应该也是完全可以控制在10MB以下的。

开发者可以直接在Unity Profiler中查看字体的内存占用,也可以通过UWA网站上测评报告中的具体资源信息页面查看对应的字体资源使用情况。
请输入图片描述


资源管理

Q8:我在UWA测评报告中看到该项CPU耗时很高,请问这是什么引起的?可以优化掉吗?
请输入图片描述

图中红色框中选项说明该项目在UI界面上文字较多,进而在Instantiate或Active时带来了较高的字体创建耗时;
蓝色框中选项,则说明了项目运行时存在大量的Log输出,我们建议尽可能在项目发布后将非关键Log信息进行屏蔽。如果该Log是系统打出的Warning或Error Log,则建议在“项目运行日志”界面通过Log堆栈对其进行详细检测和修复。

我们非常希望看到大家的项目在“项目运行日志”界面能够达到下图中的效果,即除了UWA的Start Log外,没有任何其他消息。
请输入图片描述


资源管理

Q9:请问这个Loading.UpdatePreloading是什么东西,为什么会突然那么高?一般情况下有没有什么优化的办法?
请输入图片描述

这是Unity引擎最主要的加载函数。该项一般在切换场景时或主动动态加载资源时较大。 一般来说,加载资源越多、越复杂,则其反映的Loading.UpdatePreloading耗时则越大。

优化之前,必须先定位该函数的CPU占用瓶颈。下图则为我们的案例项目,Loading.UpdatePreloading函数在UWA测评报告中的总体CPU分配情况。通过这个堆栈信息,开发团队就可以对函数的耗时分配一目了然,从而有的放矢地进行优化。
请输入图片描述

资源管理

Q10:我在UWA报告中看到大量的n/a资源,其格式的高度和宽度等信息都无法获取,并且存在大量重复,请问我该如何定位这些文件?能否优化解决呢?
请输入图片描述

图中n/a资源是我们在项目运行时检测到的无名称资源,一般来说,该类型资源并非Asset文件夹中的美术资源,而是项目通过脚本动态生成的资源,比如new Mesh、new Texture等操作,即会生成这种类型的无名称资源。

对此,我们建议研发团队详细检测逻辑代码/第三方插件中诸如New Mesh/Textue等此类操作,同时,在脚本动态生成该类资源后,为其赋上一个名字,这样即可在后续测试中看到对应名称的资源使用情况。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值