技术分享连载(四十二)

技术分享连载(四十二)

本期话题:AssetBundle场景打包、纹理格式、UI图集管理、Serialized File卸载...精选5个性能优化问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:793972859


资源管理

Q:请教一下,大家把UI做Alpha分离以后,会把分离前的图删掉吗?我这边把分离前的图删掉了,但是美术反映他们无法使用分离后的图了,因为在预览窗口看不了图。但是我又不想让他们用原来的图,否则还要花精力去维护。大家都是怎么处理的呢?

建议将原图保留(但不与任何资源产生依赖,以免打入发布包中),同时提供给美术一个一键更新的工具,如PSD For UGUI,就能够自动化地处理Alpha的拆分和图片的替换,从而在减少程序的工作量的同时,保证美术的快速迭代。但具体的目录安排、替换规则等,则需要根据项目自己的需求来定。


资源管理

Q:在加载场景依赖的所有AssetBundle 后调用LoadLevelAsync,在LoadLevelAsync调用完成后, 对所有的AssetBundle调用unload(false),不知这样是否可行。主要想减少Webstream占有的内存。 现在有个问题,场景中的特效,在几次进入视野后会丢图。 场景景物是正确的,可能是什么原因导致的呢?

这种方式是可行的,不过需要注意的是,场景加载后使用Unload卸载的AssetBundle是否以后还会被其他加载的资源所依赖,如有,则不建议进行卸载,否则会出现后续资源丢失的情况。场景中的特效纹理丢失,极有可能属于这种情况。建议研发团队首先判断纹理特效的资源均在哪些AssetBundle中,然后试验在这些AssetBundle不卸载的情况下,多次切换场景,看其特效纹理是否还会丢失,从而来判断该问题是否由AssetBundle的卸载所导致的。


资源管理

Q:公共AssetBundle太大会不会影响更新包的大小?这个公共包不unload会不会导致SerlizedFile太大,卸载的话会不会导致公共AssetBundle的Asset冗余?

公共AssetBundle的大小主要根据项目的内容和需求定。如果是担心单个AssetBundle较大,那么自行拆分即可。同时,根据Unity 5.3以后版本中新的LZ4压缩特性,单个AB的大小对加载速度已经影响很小。内存中AB中加载得越多,理论上SerializedFile越大,这是天平的两端,需要视自身情况而定。


资源管理

Q:iOS下PVRTC格式对Alpha通道的支持不是很好,凡是有渐变的图集,失真都很严重。是否把Alpha分离出来,图片的品质就会有所提升? 但是内存会比PVRTC大一倍。

PVRTC格式其实是有损压缩格式,图片压缩确实会出现一定的失真,且过渡范围较大的区域也会出现“色阶”问题,这其实是由其底层算法导致的。将Alpha通道分离出来,从理论上来讲并不会消除上述问题,但目前国内团队中确实有进行如此操作且视觉效果有所改善,所以建议研发团队不妨尝试一下,来看问题纹理的视觉效果是否有所改善。


资源管理

Q:请教一下,SerializedFile的卸载规则是什么呢?会跟随这AssetBundle一起卸载么?
请输入图片描述

绝大部分的SerializedFile均由AssetBundle产生,当AssetBundle被卸载时,与其对应的SerializedFile也将销毁。

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