技术分享连载(四十六)

技术分享连载(四十六)

本期话题:AssetBundle图集管理、如何降低Create VBO开销、FK & Statemachine 开销...精选5个性能优化问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

UWA QQ群:793972859


资源管理

Q1:我们用AssetBundle打包。A包里面有一个界面,C包里面也有一个界面,这两个界面用到了相同的图集,我把图集单独打成了B。游戏实例化的时候,我先加载B,然后加载A,然后手动LoadA里面的一个对象,实例化一个界面。然后释放A和B,后面当需要另外一个界面的时候,我又加载B,然后加载C,然后手动LoadC里面的一个对象,实例化一个界面。现在问题是,B里面的图集,我是不需要手动Load的,这个依赖关系是Untiy去做的,但是按照我之前的做法,B里面的图集会出现2份吗?

按照上述做法,如果之前从A中加载且实例化中的资源没有销毁并且没有调用UnloadUnusedAssets操作的话,B中的图集资源是会出现两份的。其主要的核心点是,AssetBundle B属于公用资源,在后续还有引用的情况下,它不应该被频繁加载和卸载。在第一次卸载A和B时,其由B而加载图集就已经变成了内存中的游离资源,第二次加载B和C时,Unity引擎并不会将B与之前的游离图集资源进行管理,而是再加载一份图集资源出来,这样内存中就形成了两份图集资源。因此,对于这种情况,我们的建议是:

  1. 对于公共依赖的AssetBundle,除非后续有较长时间不再使用,否则不建议加载之后立刻Unload;
  2. 对于由Unload AssetBundle而导致的游离资源,可尝试通过UnloadAsset/UnloadUnusedAssets API来进行清理,但后者需要该资源本身不再被引用;
  3. 通过UWA测评报告中的“资源管理界面”时刻关注每个公用AssetBundle的加载和卸载情况,以免出现频繁加载和卸载的问题。
    请输入图片描述

资源管理

Q2:如下图,在UWA性能报告中,我们发现Camera.Render下CreateVBO的开销较高,请问这个是如何引起的?
请输入图片描述

从图中可以看出,Mesh.CreateVBO是在半透明渲染的开销之下,说明这是半透明物体的渲染引起的。在我们目前测评过的项目中,仅使用NGUI的项目会在此处出现不同程度的CreateVBO的CPU开销。对此,建议研发团队首先确认其UI系统是否使用的是NGUI插件,如果是,则当前NGUI的CPU占用很可能较高,特别是UIPanel.LateUpdate的CPU占用较高。研发团队可在UWA性能测评报告中的UI模块性能页面看到。究其原因,是由于UI Mesh在频繁的重建,对于重建的Mesh,Unity引擎会将其重新传入GPU端进行渲染,这部分开销主要体现在Mesh.CreateVBO和Mesh.DrawVBO中。因此,如果你的项目中使用NGUI插件,并且半透明渲染下Mesh.CreateVBO的开销较高,那么需要研发团队对UI模块进行大力优化了。


资源管理

Q3:FK & Statemachine 状态机占用时间比较高,是否有优化的方法呢?

影响该项的因素较多,一般为:

  1. 是否开启Optimize GameObjects选项,如果没有,建议开启;
  2. 场景中Active的GameObject(使用并开启了Animator组件的)是否较多,数量越多,则该项目开销越高;
  3. GameObject的骨骼数越多、AnimationClip的采样次数越多,则该项开销也越高。
    因此,建议研发团队可从以上三种情况入手来优化FK & Statemachine的开销。

资源管理

Q4:伤害检测、还有靠近采集物品时触发可以采集的提示箭头等,我们都使用了碰撞,请问如果不使用碰撞,可以用什么方法代替呢?

使用Trigger也是较为合理的做法,如果想替代,可尝试根据距离、动画运行的时间点来进行判断。


资源管理

Q5:Fixed Timestamp的大小设置多少合理,对物理的开销影响大么?

默认情况下为0.02s,即每20ms会更新一下物理系统和FixedUpdate函数,因此它对物理的开销影响很大。具体设置没有统一的方案,需要根据自身游戏类型和物理系统的使用情况而定。如果项目中对物理系统的使用较小,那么可尝试将该项设置为0.033s,甚至为0.05s,然后在真机上查看这样物理模拟效果是否可以接受。

今天的分享就到这里。也欢迎热爱进步的你加入UWA的QQ群(793972859),也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。 比起闭门造车,我们更乐意与大家各抒己见,畅所欲言;比起形而上的泛泛而谈,我们更乐意与大家直击痛点,对症下药。