如何理解UGUI Atlas合批时的 Include in Build选项?

如何理解UGUI Atlas合批时的 Include in Build选项?

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

UWA 问答社区:answer.uwa4d.com
UWA QQ群:465082844(仅限技术交流)


UGUI

Q1:关于UGUI的合图我有如下几点疑惑:
1)UGUI的合图是在什么时候发生的?如果说合图是在Editor下合出来的大图,那么打AssetBundle的时候似乎只打了图集文件与相关的小图,并没有看到有合成的大图出现,那是不是Unity在运行时执行Late in binding时候进行了合并呢?

2)Include in Build到底是包含了什么?我的理解是如果勾选了就会包含生成的大图,如果不勾就不包含,那就又回到了问题1 ,如果不勾的话,那大图是不是在运行时生成的呢?

3)小图的大小会影响性能么?首先小图图源肯定是会影响包体的大小。
基于问题1与问题2 ,如果是运行时生成的大图,那么在生成大图的时候,I/O是否以字节流的形式往空白大图内进行写入合并的?如果这样,运行时生成大图的瓶颈应该是源文件的大小与格式吧?(假如图集和图源的压缩格式不一致)

回答如下:
1、Unity合大图的时机是根据设置来的。
2727(0).png
如上图,可以在打包的时候合,也可以编辑器运行的时候就合。Editor中合成的大图是放在缓存目录里:LibraryAtlasCache。
2、可以参考 About “Include in Build” behaviour
我的理解是,勾选了Include in Build后,图集资源会被打进App包体里(不是AssetBundle包)。如果图集是AssetBundle包管理的,最好不要勾选它,会造成资源双份。至于哪些资源会双份,需要实验下看看。
3、小图源文件的大小不直接影响性能,因为Unity最终只用合并的大图,小图本身不会进入发布的App或AssetBundle包中。但通常,小图的大小和Sprite的设置会影响合并后的图集,所以会对最终性能能产生间接作用。

针对Sprites Atlas在不同Sprite Packer Mode选项下打包,做了个实验,结果分享下:
请输入图片描述
1、前三个选项(Disabled和两个Legacy Sprite Packer)结果是一样的:
请输入图片描述
打出的AssetBundle包里没有任何内容,估计这种情况下散图都没有,是完全加载不到资源的。
另:发现了疑似Unity的Bug,新创建的Atlas,和已经打包过的Atlas在禁用选项下,打包的结果不同。
2、后两个结果相同:
生成AssetBundle包的时候,图集就创建了
请输入图片描述
感谢Walker@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b9f99a41a1e9733ee03300b


制作

Q2:材质的Shader,或者GameObject组件的Monobehavior,在开发过程中可能会删掉一个Shader的Property或者代码的序列化参数。这些参数被删除后,材质或者GameObject Prefab文件中,该参数的序列化数据并未被删除。

比如下图中名为TestGetDependency的组件。参数 testSubject已经从代码中删除。
请输入图片描述
但是这个GameObject的Prefab文件中,testSubject记录仍然存在。

请输入图片描述
这样会导致使用类似AssetDataBase.GetDependencies之类方法获得资源依赖时,取得testSubject 引用的物体,导致打包时包入不需要的资源。用脚本扫描SerializedObject的方式是可以清除这些引用的,但是这样需要对应每一种类似情况单独写脚本(当前只想到Shader对应材质,代码文件对应Prefab),可能有遗漏或者处理不当。

所以我希望知道,有没有一个Untiy原生的清洗方法,或者业界通用脚本来处理这类序列化引用问题。

重新保存下就好。
比较麻烦的是材质球,需要自己分析下然后清理serializedObject。

感谢钱康来@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5bade8deafd2174f6fe94675


渲染

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

UWA:这本质上是你的网格重建导致的,多见于非UGUI的UI重建、Textmesh的重建等等,其重建时的CPU耗时主要受你的网格重建量大小影响,如果只是一帧其实问题不大,但如果是频繁开销,则需要特别注意了。
请输入图片描述
该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b966858a711f261c1677e36


制作

Q4:如图,要实现一个界面迷雾效果。应该用UI实现还是要做一个这样的场景呢?现在我们的星图是3D的Prefab,我打算在上面盖一层黑色底图,根据势力范围修改底图显示亮的区域,有没有相关的插件可以使用?要实现的话应该从哪方面入手?
请输入图片描述

可以创建一个RenderTexture,像素点和地图一一对应,通过修改RenderTexture颜色值,在Shader中进行对应的计算,达到效果。Unity 5.4以后,可以通过向Shader中传递数组的方式实现效果。

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


内存管理

Q5:不同内存的安卓与苹果机型上(1G、2G、3G、4G...),游戏内存的峰值一般最高多少能保证不闪退。

这里有人会持续更新ios上的内存峰值,帖子下面还有人发了一个测试峰值的工具,用过还挺好用,大家可以参考。
https://stackoverflow.com/questions/5887248/ios-app-maximum-memory-budget.

请输入图片描述
请输入图片描述
感谢dra@UWA问答社区分享了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b8e2f5f339d267d357c6eda

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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:465082844(仅限技术交流)