1)2D 我的项目大量物品图标 Draw Call 优化计划
2)UGUI SpriteAtlas 的热更新问题
3)iOS 平台忽然有一帧 UI 渲染开销很高
4)iOS 上频繁 Crash,堆栈很奇怪
这是第 288 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Rendering
Q:咱们有个 2D 我的项目,大抵布局如下图:
1. 场景按格子划分,玩家能够在每个格子下面摆放物品,物品品种十分多(700+)。
2. 局部物品还有动画成果,动画会扭转该物品的材质属性。
3. 物品图标的大小不是严格一个格子大小,因而会有局部物品图标间的重叠。
4. 场景的视角可拖动,最远视距下能够看到超过 100 个物品。
5. 场景上除了物品,还有云雾、水波、发光粒子等各种特效。
具体实现:
1. 场景底图采纳美术宰割形式,每张 2048*2048 大小,由 16 张组成,间接应用 SpriteRenderer 摆放渲染。
2. 物品图标每张 256 以内,同样采纳 SpriteRenderer 摆放渲染。
3. 应用 Unity 内置渲染管线。
通过一番 Profile,发现目前次要性能问题在于 Drawcall 数量十分大,没摆满的状况下都靠近 300,次要耗费点在于特效跟物品图标的渲染。
1. 因为物品数量微小(后续还会减少),目前采纳 SpriteAtlas 形式把所有物品图标进行合图,会产生 3 张 2048*2048 尺寸的图集,各个物品可能会随便扩散在这 3 张图里,加上物品交叉显示,导致无奈合批。
2. 物品有状态,不同状态会对材质属性进行变更,扭转灰度亮堂度等成果,导致无奈合批。
3. 场景上的粒子特效是 3D 的,会随便在物品图标中挪动交叉,导致图标无奈合批。
曾经思考过,但否决了的计划:
1. 把图标放大,使生成的图集在一张 2048 以内。
=> 询问过策动,物品品种目前还不是全副的,残缺的配置里有超过 1000+ 物品,都合成到一张 2048 里不事实。
2. 图标不合图集,间接散图集成,采纳运行时动静合图形式对场上物品进行合图。
=> 游戏次要玩法会导致不停拖动物品图标以及旧物品的删除跟新物品的生成,操作会十分频繁,动静合图形式耗费微小。
鉴于下面所形容的情况,各位大佬有没有什么举荐的优化计划?
A1:能够从以下形式动手:
- 首先图片和图集缩小 Draw Call 没问题,图集也应该做分类,把能组合的类型调配并归类。图集不是谋求少就好,应该是动静拆散,还有按我的项目分类。做到图集数最优,这个就要联合本人的项目分析了。
- 而后合批的问题要解决。重写一个 Shader,挂载到 SpriteRenderer 上,扭转这个材质上的属性能够防止导致无奈合批。
- 格子布局应该防止元素重叠,这个在设计就要防止的。粒子特效尽量用 2D 成果来做体现,粒子的发射数量与粒子数量也要做衡量。
感激廖武兴 @UWA 问答社区提供了答复
A2:倡议动静图集,动态图集在这种状况下,根本是负优化。
感激 uwa 菜鸡奶泡泡.@UWA 问答社区提供了答复
A3:这个问题,其实挺好解决。<br/>
1. 背包的物品组件做一个循环动静列表性能,这样同屏加载不会很多。
2. 物品的同一个组件进行拆分,比方 bg 一个图集,icon 一个图集,数字图片一个图集,特效纹理一个图集。<br/>
这样下来 DrawCall 个别在三四个能够搞定。
感激郑佳宇 joe@UWA 问答社区提供了答复
Atlas
Q:UGUI 图集切换后,图集中的图片名称不变,只是扭转该图片为其余图片,然而为什么在加载 UIPrefab 的 AssetBundle 之后,UI 上对应批改的图片会呈现白图?会发现 SpriteAtlas 的 CanBindTo 返回 false。
A:替换图片时,不批改原 GUID 则能够防止这个问题。
感激题主 Austin@UWA 问答社区提供了答复
UGUI
Q:iOS 平台通过 Profile 定位性能,偶现某一帧 UI 开销异样高,通过 Timeline 看到是 Render 引起的,然而不晓得后续应该如何定位。
这里能够看到这一阵 Render 开销达到了 12.35ms,其余帧只有不到 2ms。
A:EmitWorldScreenspaceCameraGeometry(图中紫色)这个函数是 UGUI 的 Canvas 网格重建生成 UI Draw Call 的开销,次要工作在 Native 子线程进行,主线程体现为该函数的期待开销,倡议排查该时刻是否有较为简单的 UIPanel 创立(联合 Profile 的 UI 模式)。
感激羽飞 @UWA 问答社区提供了答复
iOS
Q:在线上 FireBase 收集到不少的 iOS Crash。Crash 的栈有很多种,但共同点是通过 Il2CppInvokerTable.cpp 的第 4336936768 行(一个不合理的行号)指到了某个函数,之后可能会调用本身若干次,再跳转到一个不确定的地位 Crash 掉。咱们尝试过给该函数做过爱护修复,但公布后还 s 会 Crash,调用又全副换成了另一个函数。所以狐疑并不是某个函数自身的问题。
大部分是后盾触发,但也有前台触发的。大部分零碎残余内存不多(<100MB),但也有残余超过 1GB 的。零碎版本次要是 iOS 15,咱们有接入一些 iOS 原生的 SDK。
版本信息:
Unity 2018.4.30
IL2CPP
只有 iOS
狐疑有某个函数指针的指向谬误导致,但如何持续定位问题呢?
A1:FireBase 上面对 IL2CPP 局部的堆栈还原是有 Bug 的,根本看不出来是哪个堆栈,能够尝试下通过增加自定义事件和 Log 查看大略在哪解体的,而后再尝试重现和修复。
这个从 Unity 的堆栈下面来看,是挂在某个线程了。<br/>
我年前给 FireBase 团队提的 Bug,对应的 issue 在这里:https://github.com/firebase/q…
感激梅辰 @UWA 问答社区提供了答复
A2:倡议增加一下 Unity 的符号表。
感激郑佳宇 joe@UWA 问答社区提供了答复
封面图来源于:Simple inventory system for unity
Unity3D 的背包零碎。
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)