如何优化包体大小

如何优化包体大小

这是第145篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


本期目录:

  • 如何优化包体大小
  • 如何去除打包自带的UnityAds文件
  • 不透明物体的渲染排序
  • Shadows.CullDirectionaShadowCasters的开销分析
  • PC版本如何获取显示器分辨率

资源管理

Q:目前,在项目前期打出来的APK已经好几个GB了,已知有一些废弃资源还没有做整理。想咨询下,一般在优化包体方面大家都是怎么做的?看到有些游戏是用小包+下资源包的方式,作为备选方案。请问一下单纯优化包体有什么系统性的经验吗?包括与资源相关和其他的都可以。

A1:我最近也在处理包体的问题,可以谈谈几个自己的经验:
1)常说的去掉冗余资源+设置资源格式,这个就不说了,论坛里也比较多,这部分影响也是最大的。
2)合理规划图集,尽量少留大量空白,可以挪一下从而把尺寸降一个级别,有用TexturePacker打包的团队,在特殊场景可以激进点采用带旋转和Trimming的方式打包图集。
3)合理看待UI尺寸,因为一般UI不开Mipmap,所以你最好自己控制下UI尺寸,对于大块的背景图和图标,采用九宫或对称等方式去生成剩余部分。
4)ABI可以根据项目需求去除X86架构,对于IL2CPP的项目减少比较明显(一般一份IL2CPP代码多大就减少多少),另外合理控制工程里C#代码总量包括导入的插件这些,可以有效减少生成的IL2CPP代码的大小。
5)在固定视角的情况也可以直接关闭3D模型贴图的Mipmap,直接选择合适的贴图尺寸就好。美术层面也可以剔除不可见部分,减少模型大小。

其实项目中每个地方或多或少都会对包体产生影响,要是细说的话可以说一天,包括策划表格都同样会影响包体,所以最好根据80/20原则来找出影响最大的部分,然后全力解决,这样效果也最明显。
感谢Enak@UWA问答社区提供回答

A2:单纯的包体优化,我认为需要做好3个基本点:
1)排除所有冗余资源;
2)设置合理的资源压缩格式;
3)合理地制作资源(例如UI的九宫格纹理)。

以上在UWA官方的博客(blog.uwa4d.com)里面都能搜索到不少文章,这里就不展开叙述了。
基础包+动态下载资源包的方式,本质上只是为了让玩家能够尽快进入游戏。
感谢张锐@UWA问答社区提供回答

A3:你可以把所有AssetBundle包压缩下,用UWA的资源检测与分析看一下是不是有很多冗余文件/未压缩的文件之类的。
感谢deviljz@UWA问答社区提供回答

A4:除了资源检查冗余,可以尝试 Android App Bundle , 参考:https://developer.android.com/platform/technology/app-bundle,Unity2017.4.17f1已经支持.
感谢xmzyl@UWA问答社区提供回答

该问答来自UWA问答社区,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c32d25c9efb1b001255ddd4


构建

Q:如图所示,BuildReport里面有portrait.jpg和landscape.jpg这两个文件,好像是UnityAds带的,但是我并没有使用UnityAds,也找不到这两个图在哪,文件还非常大,请问有谁知道如何去掉这两个文件吗?万分感谢。

请输入图片描述

A:找到Unity安装目录DataResourcesPackageManagerEditormanifest.json,将manifest.json文件的dependencies清空,保险起见顺手也删掉文件夹内若干个压缩文件。这样也能解决Unity 2017.4.1版本在导入资源时卡死在portrait.jpg和landscape.jpg两张图片的问题。

感谢张迪@UWA问答社区提供回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c3483109efb1b001255de35


渲染

Q:不透明物体在渲染的时候到底是怎么排序的,为什么有时候不是完全按照前后顺序?之前一直以为是完全按照前后顺序来排列的,今天仔细看发现好像并不是,但是不理解为什么,希望某大神能帮我解答下,下面是测试场景截图:

请输入图片描述

场景中有3个Cube(红色有缩放),从右到左name依次是1、3、2,相机在最右边,两个绿色物体是同一个材质,红色的是另外一个材质。两个材质球只是颜色不同,其他都一样,Shader是Standard。现在红色物体位置靠右的时候,渲染是完全按照从前到后(也就是1-3-2)的顺序渲染的。

然后我把红色物体的位置网左边调了一点,如下图:

请输入图片描述

还是位于两个绿色Cube之间的,渲染顺序就变成了1-2-3(也就是先渲染最前面的Cube,再渲染最后面的Cube,最后才渲染中间的红色Cube),不是完全按照前后顺序了。

更奇怪的是,在这种位置关系下,如果我把红色Cube的材质换成跟绿色Cube一样的,渲染顺序又会编程从前到后。

请输入图片描述

实在是不明白了,所以想咨询下。

A1:几个原则:
1)如果你自己定了,就按你自己定的来(Camera Depth、Render Queue等);
2)先保证结果正确;
3)再保证性能尽可能好。

对于不透明物体,因为有z test,所以随便以什么顺序渲染,结果总是正确的,所以看3,主要是两点:

1)对(硬件)early-z友好,对于相互遮蔽的对象,通常先画距离相机近的,再画距离相机远的,这样 early-z的时候后渲染的对象可以直接被Culling掉(被前面先渲染的遮住了);相互不遮蔽的就随便来了。这个也和GPU相关,对于有更高级硬件Culling的,比如TBDR的powerVR,不需要自己做排序,硬件会自动处理(HSR),做完美Culling。
2)尽可能减少渲染状态切换,ABCD,假设AD渲染状态(Mesh、Shader、Texture、Uniform、Blend Setting等)一样, BC渲染状态一样,那么ADBC更好,渲染状态只切换一次(AD -> BC),否则两次(A->BC->D);不同的渲染状态切换开销也不同,所以通常又会按FBO、Shader、Texture、Uniform等开销从大到小的顺序排。

如果1和2冲突,要看Unity怎么去评估哪种排序性能更好。
感谢gx@UWA问答社区提供回答

A2:不透明的渲染排序不单单是根据距离从前往后,跟挺多东西相关,大的层级就是Camera的Depth, Sorting Layers,SortingOrder,RenderQueue。

还有很多方面影响渲染顺序,比如会优先渲染第一个Pass, 烘焙的话LightMapIndex也会影响, 再一个Material是否相同, 如果Material相同,Pass又有影响,如果开了合批,合批也有影响。
感谢赵林@UWA问答社区提供回答

该问答来自UWA问答社区,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c2df41f74f78a31e53388c6


渲染

Q:QualitySetting将Shadow Type也改成No Shadow后,为什么Shadows.CullDirectionalShadowCasters还有开销产生?

A:按照常理。应该是没有Shadows.CullDirectionalShadowCasters开销的。怀疑是Unity的BUG。

解决方案就是:如果是QualitySetting里面Shadow Type改成No Shadow,那么将场景里面的Directional light的Shadow type设置成No Shadow。观察Profiler,的确消失了。Unity版本2017.4.15f1。

感谢qingfeng@UWA问答社区分享了该问答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c381a1e9efb1b001255de92


分辨率

Q:PC版本如何获取显示器分辨率?我的PC版本想:
1)初始分辨率不要超过显示器分辨率;
2)支持玩家拖动边框并且保证窗口比例。

不知道可不可以:启动的时候根据显示器分辨率强制设置一下,监听分辨率变换的事件,然后每次固定设置成16:9。

A:以上题主的回答是可行的:
1)在游戏的初始化脚本里面,通过调用Screen.SetResolution设置想要的分辨率。
2)通过WM_DISPLAYCHANGE来监听分辨率变化的消息,然后再次调用Screen.SetResolution。

如果怕监听Windows事件麻烦,还有个不优雅的办法,可以用一个定时器来检测屏幕分辨率是否改变。这里需要自己实现一下WndProc,具体可以参考下:
http://www.waffle-maker.sakura.ne.jp/wordpress/?p=122
感谢张锐@UWA问答社区提供回答

该问答来自UWA问答社区,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c34053b9efb1b001255ddfd

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)

封面图来源:Realtime Celestial Rendering
请输入图片描述
https://lab.uwa4d.com/lab/5b857e0302004fb6597651d5