技术分享连载(五十五)
- 作者:admin
- /
- 时间:2017年03月14日
- /
- 浏览:5613 次
- /
- 分类:厚积薄发
本期聚集话题:AssetBundle打包后资源丢失、频繁SetActive(true/false)对性能的影响、资源卸载方式、动画裁剪方式...
精选5个性能优化问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:793972859
资源管理
Q1:我把多个AssetBundle打成一个大包,会出现部分粒子特效贴图丢失的问题。参数设置为CollectDependencies | DeterministicAssetBundle | UncompressedAssetBundle时,贴图是对的,但是脚本、Shader又出错了。由于Unity 4.x下AssetBundle的问题比较多,想知道打大包可行性如何?
在Unity 4.x的版本中我们并不建议将资源打成一个超大的AssetBundle包,一般情况下,单独发布的AssetBundle文件应尽可能小于1MB。这主要是因为Unity 4.x版本中AssetBundle文件压缩格式为LZMA格式,而不是LZ4格式(Unity5.3版本以后推荐格式)。所以,如果一个AssetBundle文件较大,则在加载时很可能会出现较高的WebStream占用,从而造成项目运行时局部时刻内存过高的情况,进而影响运行的稳定性。
同时,需要说明的是,Unity 4.x版本在制作AssetBundle文件时,应尽可能开启CollectDependencies | CompleteAssets | DeterministicAssetBundle选项。如果开启后出现资源丢失,则一般是由于依赖关系所致,相关资源被打包到其他AssetBundle文件中。对此,我们建议在UWA资源检测的结果中,查看所丢失的资源是否存在于AssetBundle中,以及存在具体哪个AssetBundle文件中,从而来进一步解决AssetBundle的打包正确性问题。
性能优化
Q2:请问,反复对一个GameObject调用SetActive(true),是否会很耗性能?
频繁SetActive(true/false)会有一定的CPU开销占用。其少量次数并不会带来很高的CPU占用,但是在我们检测过的很多项目中,其每帧都可能存在大量的SetActive调用。究其原因,是因为挂载在GameObject的脚本上,其Update或LateUpdate等函数中每帧都会调用SetActive操作,从而造成了其每帧几十甚至上百次的调用操作。
正因如此,我们在报告中将SetActive的具体GameObject信息、频率和耗时都详细展示出来,以方便大家在几分钟之内,就可以将SetActive调用过量的问题进行修复。
资源加载/卸载
Q3:如下图,通过纹理图片通过文件流形式加载到内存,
这样的资源还可以使用Resources.UnloadUnusedAssets()和Resources.UnloadAsset(m_Asset)进行资源卸载吗?
如果是自己载入内存并初始化为Unity的Texture2D,则还是要重点查看Texture2D对象的创建方式。一般来说,会用new Texture2D的方式创建,并用LoadImage的接口将一块内存载入,那么这样就要用DestroyImmediate来销毁这个纹理对象了。
动画
Q4:我们有些特效的动画开始是在相机外的 , 动作的裁剪使用的AnimationCullingType.BasedOnRenderers,这样会导致特效之后在相机内也显示不出来了,除了更改如下这个选项还有其他做法么?
理论上来说,是不应该出现这种情况的。建议用户可以提交一个具体案例给我们进行研究。同时,研发团队可以通过Unity的Culling Group功能来进行自定义的裁剪操作,该种方式较之动画系统的Culling功能更为灵活。
UI 输入
Q5:发现一个可能是NGUI的Bug:在某些情况下UISprite不显示,或显示的位置不符合localPosition数值Bug。 如: 在UISprite.spriteName不变,对UISprite.gameObject.localPosition或UISprite.gameObject.SetActive设置新值时无效或显示不正确,请问是什么原因?相关例子已经提交给UWA。
经UWA检测用户提交的实例,发现代码中存在逻辑问题,下图红框中原先是ItemList,应为ItemNoUse,所以这个不属于NGUI的Bug。
PS:在我们与研发团队的交流过程中,我们发现比起大一统的、有规律性的经验总结,更多开发问题都隐于代码背后,这不能仅靠语言描述或者经验推测可以解决,而需要我们深入现场,在代码中挖掘问题的原因。这也是我们UWA真正想帮助大家解决问题的方式。因而,我们强烈欢迎大家就自己的具体问题具体交流。请记得:比起闭门造车,我们更乐意与大家各抒己见,畅所欲言;比起形而上的泛泛而谈,我们更乐意与大家直击痛点,对症下药。
今天的分享就到这里。也欢迎热爱进步的你加入UWA的QQ群(793972859),也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。