这是第130篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
资源管理
Q:我们项目采用了AssetBundle打包方式,本地加载使用WWW,有进度条,并且有提示框和加载的数据以及总数据提示。提交iOS审核之后,被拒绝表示4.2.3:
Guideline 4.2.3 - Design - Minimum Functionality
Your app did not include sufficient content in the binary for the app to function at launch, and we were required to download or unpack additional resources before we could use it.
We were required to download or unpack additional resources to continue using your app; however, the size of the download was not disclosed, and we were not prompted to choose to download additional resources. If your app requires additional resources, you must disclose the size of the download and prompt users before doing so.
已确认内部没有下载任何东西,只是加载本地的资源,而且已经提示。不知道为什么被拒绝?
A:有以下几个注意事项:
1)不要用压缩的资源,随包资源用未压缩或者LZ4的压缩格式,如果包体大小敏感,用LZ4, 如果用LZ4则需要注意,加载Asset时会做解压,这个会导致加载Asset时需要更多时间,如果是在帧率敏感的时候加载Asset, 需要考虑用LoadAssetAsync。
2)iOS不要用WWW, 用LoadFromFile, WWW需要更多的内存,特别是你用了www.bytes这个属性, 就算没有用也会比LoadFromFile多2倍, 如下图,(有同学反馈说WWW会被检测到认为需要下载(未确认) )。
3)我公司原来用7z压缩资源被拒,然后改为不压缩,顺利过审。
感谢xmzyl@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ba1e28df31d7a33f3469a5d
内存
Q:遇到一个奇怪的问题,只要反复进出副本,总内存就一直在增加(1次10MB左右),而这时候的各项资源内存、Mono堆内存、Lua内存都基本没变化,应该是说有某种被Unity统计到的内存,但是又不在详细信息里。请问这部分可能是什么?
UWA:从题主提供的截图来看,很可能是AssetBundle的驻留导致的。每次进出场景,资源加载是使用AssetBundle加载吗?AssetBundle的数量是否有变化?同时,第三次、第四次后,内存是否依然每次提升10MB?如果使用AssetBundle加载,那么其实有一部分AssetBundle加载内存,是Detailed模式看不到的。建议题主从这方面先进行排查。
该问答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ba3514d1a1e9733ee033058
IL2CPP
Q:问个关于减IL2CPP体积的问题。对照官方文档:
https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html
我的理解如下:
但实际测试似乎不太对,2018.2.7f1, 下面左边开了Strip Engine Code, 右边没开。
有几个问题:
1)可以看到开Strip Engine Code后,少了一些xx_Module cpp文件,但是按理说这些cpp是从C#、Dll转换过来的,在Byte Code Strip这步就应该Strip掉,不应该受Strip Engine Code参数影响才对(官方文档说这个参数只影响对Engine Native Code的Strip)。何解?
2)Link这一步Strip是我自己的推测,对XCode不熟,不确定哪些Compile和Link参数可以用来在Link时移除无用的Symobls,这块有研究过的确切结论吗?
3)Package Manager里明确Disable掉无用的Engine Builtin Moudele,比如AI、XR,IL2CPP时依然会生成cpp源码,感觉这里有点违背常识啊,这块最终会在某一步咔擦掉吗?
4)Strip Engine Code大家是开还是不开?我们之前为了避免裁剪带来的问题(特别是热更),选择了不开,现在为了减体积很想开启,所以问问这块有没有什么坑。
UWA:查了一下源码:https://github.com/Unity-Technologies/UnityCsReference
在CodeStrippingUtils.cs和AssemblyStripper.cs里有关于Strip Engine Code的内容。如果勾选这个选项,会对Modules进行Strip(这一步没有完全看懂,大概是先筛选出Root Assembly使用的Class,再记录这些类用到的Module,也跟这些Module自身的属性有关)。这里具体是哪些Module和Class被保留了,会在UnityClassRegistration.cpp这个文件里记录。
我的理解是这样的:Strip Engine Code影响的就是Byte Code Strip这一步是否要把Unity Engine Code也进行Strip处理。至于PackageManager里的设置,我尝试用Mono的方式打包,不管是Strip Byte Code还是Strip Assemblies,都仍然生成Disable的built-in Module对应的dll文件。猜测这里Disable和打包的Strip操作没有关系。
以上其实都是对Unity build的个人理解了,最关键的问题是开不开Strip Engine Code。
我之前的项目是开的,由于项目里没有用到反射,目前来说没出什么问题,有问题踩了坑再修呗。从Unity官方文档写的是“开了能减代码量,但是如果出问题你还是关了”,只能建议题主根据自身项目情况而定了。
该回答由UWA提供,欢迎大家转至社区进一步交流:
https://answer.uwa4d.com/question/5b9b38c2a711f261c1677ec0
资源管理
Q:最近准备将项目安卓端改为IL2CPP的方式打包,但是却发现导出的apk内的il2cpp.so文件有40MB这么大,对比libmono.so 3MB的大小来说大了不少,导致apk变大很多,请教各位有没有解决方案。
UWA:libli2cpp.so是包含了逻辑代码的,直接比较libil2cpp.so和libmono.so的大小没有意义。一般来说IL2CPP方式打包导致包体变大的原因是C#代码经过编译转换成C++代码后,代码量剧增。这一点Unity的新版本也一直在优化。
不知道题主用的是什么版本的Unity,Strip Engine Code选项有没有开启?
据说是越新的Unity版本,在这方面的优化效果越好。官方也提到了这一点:
https://docs.unity3d.com/Manual/dotnetProfileLimitations.html
网上有一篇15年的文章,也提到了优化代码量的方法,题主可以参考一下:
https://www.cnblogs.com/bodong/p/4804240.html
该问答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b9cc499f31d7a33f34699ea
资源管理
Q:我的项目在异步加载预制体的时候会有峰值, 仔细一看是这个函数导致的。请问是什么原因? 如何避免?
UWA:这就是异步加载资源时的加载耗时,加载资源总是要有耗时的,并不一定需要去避免。建议题主先关心你们的资源异步加载过程中是否有频繁加载的问题,如有则需要尽可能将其完善。
该问答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b9397e6670c1a61c64d6cea
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
图片来自网络
领取专属 10元无门槛券
私享最新 技术干货