【厚积薄发】如何理解UGUI Atlas合批时的 Include in Build选项?

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

UWA 问答社区:answer.uwa4d.com

UWA QQ群:465082844(仅限技术交流)

 

UGUI

关于UGUI的合图我有如下几点疑惑:

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

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

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

A:回答如下:

1、Unity合大图的时机是根据设置来的。

如上图,可以在打包的时候合,也可以编辑器运行的时候就合。Editor中合成的大图是放在缓存目录里:LibraryAtlasCache。

2、可以参考 About “Include in Build” behaviour

https://forum.unity.com/threads/about-include-in-build-behaviour.481433

我的理解是,勾选了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

 

制作

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

比如下图中名为TestGetDependency的组件。参数 testSubject已经从代码中删除。

但是这个GameObject的Prefab文件中,testSubject记录仍然存在。

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

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

A:重新保存下就好。

比较麻烦的是材质球,需要自己分析下然后清理serializedObject。

感谢钱康来@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5bade8deafd2174f6fe94675

 

渲染

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

UWA:这本质上是你的网格重建导致的,多见于非UGUI的UI重建、Textmesh的重建等等,其重建时的CPU耗时主要受你的网格重建量大小影响,如果只是一帧其实问题不大,但如果是频繁开销,则需要特别注意了。

该回答由UWA提供,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5b966858a711f261c1677e36

 

制作

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

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

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5b977889a711f261c1677e39

 

内存管理

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

A:这里有人会持续更新ios上的内存峰值,帖子下面还有人发了一个测试峰值的工具,用过还挺好用,大家可以参考。

https://stackoverflow.com/questions/5887248/ios-app-maximum-memory-budget.

感谢dra@UWA问答社区分享了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/5b8e2f5f339d267d357c6eda

### Unity UGUI 静态与动态的区别及用法 #### 一、静态 (Static Batching) 静态是一种通过预处理减少 Draw Calls 的技术。它适用于场景中位置固定的对象,这些对象不会频繁移动或改变。 - **原理**: 静态会将标记为静态的游戏对象并到单个网格中,在运行作为单一绘制调用执行[^1]。这意味着即使多个游戏对象共享相同的材质和着色器,它们也会被组成一个次进行渲染。 - **优点**: - 减少 Draw Calls 数量,从而提高性能。 - 对于不经常变化的 UI 元素非常有效。 - **缺点**: - 如果对象的位置发生变化,则需要重新计算整个次,这可能会带来额外开销。 - 不适频繁更新或动画化的对象。 - **启用方式**: 在 Inspector 窗口中选中目标 GameObject 并勾选 `Static` 复选框即可将其纳入静态范围。 ```csharp // 设置物体为静态以便参与静态 GameObject gameObject; gameObject.isStatic = true; // 使用脚本设置静态标志 ``` --- #### 二、动态 (Dynamic Batching) 动态则针对那些可能随发生变换的小型对象设计了一种实优化方案。 - **原理**: 动态会在每帧自动检测符条件的小尺寸模型并尝试临性地把他们打包在一起提交给 GPU 渲染管线完成一次性的顶点数据传输操作。注意这里强调的是“小型”,因为超过一定大小限制(通常约等于 900 vertices)之后就无法再加入此过程之中了。 - **优点**: - 自动化程度高,开发者无需手动干预太多细节配置工作就能享受到一定程度上的效率提升效果; - 更灵活适应各种复杂情况下的需求变更响应速度较快。 - **缺点**: - 受限于硬件能力以及软件内部实现机制约束等因素影响较大——比如当涉及到过多不同纹理贴图资源切换候可能导致实际收益下降甚至适得其反的情况出现; - 单独依赖该功能而不考虑其他方面综因素的话也可能造成整体架构臃肿难以维护等问题存在风险隐患需要注意规避措施落实到位才行哦! - **条件要求**: * 所有要一起做dynamic-batch的对象都必须共用同一个Material实例(即完全一致而不是仅仅看起来相似而已); * 它们的Transform矩阵也应当保持相对简单结构形式才有利于算法高效运作发挥最大潜力价值所在之处体现出来呢! --- ### 总结对比表 | 特性 | Static Batching | Dynamic Batching | |--------------------|------------------------------------|-----------------------------------| | **适用对象** | 场景中的静止不动物件 | 小规模可变位移实体 | | **初始化成本** | 较高 | 极低 | | **运行期间消耗** | 很低 | 中等至较高 | | **灵活性** | 差 | 好 | 以上就是关于Unity引擎下UGUI系统的两种主要类型的Batching介绍及其各自特点分析说明啦~希望对你有所帮助吧😊 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值