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-1024×2048 的合图了,为什么还有 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(原群已满员)