1)使用Post Processing导致帧率显著降落
2)RectMask2D是不是会频繁触发SendWillRenderCanvases
3)Unity3D Sence为何始终处于已批改状态
4)Sprite Atlas打Bundle的冗余问题
5)IL2CPP在Xcode下增量编译问题


这是第220篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。

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

Rendering

Q:我的项目中使用了Post Processing后,帧率降落微小。测试场景,模型面数2w,一般的Diffuse材质 ,没有物理,没有特效。没开后处理时,低端机30帧。开启后处理,帧率抖动,最低达到15帧。前面只用到Bloom和Color Grading。

A:如果Bloom用的不好,GPU性能耗时高是较为失常的事件。Bloom的高低采样次数、Filter滤波的Sample点个数、屏幕的分辨率等都是影响Bloom性能的重要因素。

倡议题主能够思考浏览《Unity引擎景深实现原理分析与优化》这篇技术课程,外面优化DOF的办法仍然能够用到Bloom上。

同时,也能够应用GOT Online中的Overview模式,间接查看我的项目在真机上(最好是高通芯片)的GPU耗时,看看GPU的具体超标状况:

该答复由UWA提供


UGUI

Q:RectMask2D是不是会频繁触发SendWillRenderCanvases?

A:是的,Rect Mask 2D会继续每帧计算子节点的裁剪区域。所以Rect Mask 2D上面的元素如果比拟多,耗时还是挺高的,这种状况能够换成Mask组件,尽管Mask的Overdraw会高一些。一个省GPU,一个省CPU,两个是须要衡量的。

感激Xuan@UWA问答社区提供了答复


Editor

Q:Unity 3D Sence始终处于已批改状态。刚切换过去也间接提醒已批改。切换Sence并未作出任何批改,如下图:

尽管没什么难题,但切换别的场景或者退出的时候就要提醒让保留了。

之前发现的一个起因是因为UI中存在套用的Layout组件呈正告状态。批改后Sence就恢复正常了。各位有遇到过这种问题吗?

A:所以说还是嵌套了Layout组件。这个会导致Sence始终处于批改状态。

感激刘旭杰@UWA问答社区提供了答复


AssetBundle

Q:游戏中UI用Sprite Atlas做合图,打Bundle貌似碰到了一个冗余问题:(Unity 2019.4.1 lts版本)。

Victory目录有四张散图,以及一个Sprite Atlas文件做合图。Bundle时把整个Victory为一个Bundle。最终进去的Bundle构造如下:

也在网上搜了一些信息,尝试去掉Sprite Atlas的Include in build选项(成果未验证,纯正验证Bundle),Bundle中少了一份冗余的Texture 2D,但仍旧有几个Sprite类型的散图。

疑难:
我了解是,Bundle中曾经有一个sactx-1024x2048的合图了,为什么还有Sprite类型的散图?这是否算冗余呢?

用去掉Include in build的形式,游戏中应用UI Prefab时,是否都须要用Late Binding能力应用图片(感觉很麻烦,UI拼每个界面,都要程序写配套代码)?

A1:最开始形容的问题中(依据第一张截图)并未看到冗余的存在,也并非图集模式的打包后果。

答复如下:
对于图集自身的Bundle必定是不算的,须要有各个散图的信息能力从整图中获取散图,不然就不晓得你要的那个图在哪里。

不勾选Include in build,Bundle中就不会存在显式的图集依赖,必须应用提早绑定传递信息(该图片从哪个图集中获取)给申请图片资源的对象。

感激Welkin_Totoro@UWA问答社区提供了答复

A2:形容下我的思路:

勾选了Include in build,Bundle中就会有一份冗余:既蕴含合图,又蕴含散图。但这种状况下,程序不须要做非凡逻辑,界面就能体现失常(具体Runtime是否合图,未抓帧验证)。

不勾选Include in build(正确做法):Bundle就会只蕴含Atlas,以及散图信息(不是残缺的散图)。游戏内应用Atlas Request Manager来确保图片能失常显示,否则会错乱。如果本人实现了资源加载的话,可能还要本人找机会做Atlas资源卸载。

感激james@UWA问答社区提供了答复


Build

Q:最近在钻研减速打包问题,发现IL2CPP生成代码之后每次Xcode都是全量编译(间接Build而不是Clean+Archive)。

我参考这里看了下,
https://forum.unity.com/threa...,
比照了下如果C#代码没有变动,生成的CPP代码的内容的确不变。然而从新生成貌似会导致文件批改工夫变动或别的属性变动,Xcode仍然是所有都编译了一遍。

A1:目前筹备用群里大佬说的办法绕开:
“Freshair 17:01:28 打出的Xcode用SVN同步到Xcode打包我的项目下”

我用Dnspy看了下IL2CPP.exe间接批改代价有点大,而且不好保护。用BeyondCompare比拟了下发现其实就Preprocessor.h和Native文件夹俩批改工夫产生了变动。心愿当前官网能留神这些细节。

感激钱康来@UWA问答社区提供了答复

A2:介绍一篇文章《Unity Xcode构建缓存》,外面写了一个程序解决Unity生成Xcode我的项目缓存问题。

WriteCache应用Rsync增量传输,会节省时间,ReadCache未做优化,实测用时37秒左右,1.5GiB大小Xcode我的项目——UnityXcodeCache

感激狂飙@UWA问答社区提供了答复

A3:我之前的做法是细化打包策略,资源打包细分为差不多10个步骤,对UI,特效,Lua(分三块,Core,模块,Luatable配置),C#层Config,角色,场景,编译工程,资源笼罩,疾速编译,生成APK/IPA,云真机测试,组织成不同的打包命令提供给CI。

如果是C#代码没变动,能够只做资源类的打包,对须要从新(此处可增量)打包的AssetBundle,Lua,Config等打包,打包后间接笼罩到Xcode工程,间接生成IPA包,跳过中间环节,构建过程能够细化到很细,如果你是Lua侧,那预计只须要打包Lua模块相干,1分钟内就能够出到IPA包。

如果是Xcode代码也发生变化,这个能够联合Ccache进行提速,资源打包能够做分布式打包,多台黑苹果去打包各个模块的资源。再传递到版本机上整合,这个过程也能够hook svn/git的资源提交,在提交后做一次打包,再次公布的时候能够增量解决。

其实能够脱离AssetBundle,把量产资源采纳非AssetBundle的形式进行组织。避开不必要的导入导出及打包。

感激debugger@UWA问答社区提供了答复

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

官网技术QQ群:793972859(原群已满员)