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(原群已满员)