问答 UI 节点对运行效率的影响

侑虎科技 · 2020年06月04日 · 1244 次阅读

1)UI 节点对运行效率的影响
2)Crunched 压缩的贴图大小
3)iOS 提审被拒原因排查
4)关于 Post Processing 移动端使用异常的问题
5)下划线开头的文件无法打进 APK


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


UGUI

Q:Canvas 下的 UI 节点数量过多会影响运行效率吗?

A:Canvas 在 CPU 方面的消耗主要是 Rebatch 和 Rebuild。

Rebatch 发生在 C++ 层面,是指 Canvas 分析 UI 节点生成最优批次(渲染指令)的过程,节点数量过多会导致算法(贪心策略)耗时较长,关于 Batching 的过程可以参考:《Guess Into UGUI》

Rebuild 发生在 C# 层面,是指 UGUI 库中 Layout 组件调整 RectTransform 尺寸、Graphic 组件更新 Mesh 和 Material,以及 Mask 执行 Cull 的过程,耗时和发生变化的节点(动态节点)数量基本呈线性相关。

Canvas 下 UI 节点数量较多时,如果节点都是静态且不怎么变动,那么问题不大,Rebatch 之后结果会进行缓存复用直到下一次节点变化;如果某些节点经常变动,会引起 Canvas 的 Rebatch 和 Rebuild,CPU 耗时就会相应增加。

Unity 5.2 之后 Rebatch 的过程进行了优化,会根据设备 CPU 核心数量多线程执行,但是如果每隔几帧就要 Rebatch/Rebuild 一次,耗时还是比较可观的。例如 UI 元素含有 Animator 动画,频繁缩放、修改 Sprite 等等。这时候就建议将 Canvas 进行拆分,进行动静分离等策略,详细可以参考 Unity 官方优化 UGUI 的文档:《Optimizing Unity UI》

感谢张迪@UWA问答社区提供了回答


Texture

Q:请问为什么 Crunched 压缩的贴图在 Unity Editor 上显示时,看起来比普通 ETC 格式小很多,但是在 UWA 报告中却和普通 ETC 格式大小一样呢?

A:Crunch 压缩是在 ETC 的基础上的再次压缩,在运行时会解压为 ETC 格式。在没有开启 RW 的情况,在内存中的大小和普通 ETC 是一样的。但是当开启了 RW 之后,情况就会稍微有些不一样,内存中会保存两份数据,一份是原始的 Crunch 的大小的占用,一份是 ETC 的占用。

举例子来说,1024x1024 的 ETC2 8 bits 格式的纹理,没有开启 RW,在内存中占用 1MB,开启 RW,在内存中占用 2MB。1024x1024 的 Crunched ETC2 格式的纹理,没开启 RW,在内存中占 1MB,开启了 RW,在内存中占 1.137MB,其中 0.137MB 是原来的 Crunch 的大小,也是在 Editor 中看到的大小。所以使用 Crunch 可以减少包体大小,在开启了 RW 的情况下也会降低内存的占用。

该回答由 UWA 提供


Script

Q:我们线上运营着产品一代,最近 iOS 提交了二代,但是却被 4.3。请问大家是如何做二代三代产品的呢?难道完全重写代码吗?

我来描述一下我们的情况:
一代和二代的美术资源是完全不一样的,但是目录结构是一样的;
一代是纯 C# 实现,二代是 C#+ILRuntime;
假设一代有两万行代码,那二代有大概四千行(因为逻辑代码都是 ILRuntime 脚本)。这四千行代码包括:ILRuntime 生成的两千行,一千五百行代码是和一代重复的,五百行完全不一样的代码。

这里的代码行数不包括插件的部分,例如:NGUI、USequnce、Protocol Buffers 等。难道苹果会因为这一千五百行代码判定重复应用吗?只能彻底重写这些代码?我申诉了几次但仍然维持了原判。

A:刚好最近公司某新项目提交也遇到了类似题主描述的 4.3 问题,分享下我们的解决方案。首先,最好判断一下是机审还是人工审核发出的 4.3。这个很好区分,看服务器是否有登陆日志就好。没有登陆就是机审,否则就是人工。

对于机审 4.3,一般是元数据相似度造成的,主要包括代码、资源等 IPA 元数据内容的相似度。对于这种情况,题主可以针对自己项目的实际情况,选择市面上各种混淆的技术对代码、资源层面进行加密混淆,以提高元数据差异性。

对于人工审核 4.3,那就要根据服务器相关日志,定位审核人员体验的游戏内容做针对性地修改和回复了,回复主要需要向审核人员表明相关功能设计的思路以及独特性。

以上就是我们对 4.3 问题的改进的分享,总的来说,还是要根据苹果审核时的具体反应和自己项目的实际情况做出相应地修改,积极回复才有可能解决。

感谢 Jerry@UWA 问答社区提供了回答


Rendering

Q:场景使用 Post Processing 后,打 AssetBundle 包,PC 平台是正常的,但在移动平台会报错:Kernel ‘KGenLut3D_AcesTonemap’ not found。按照官方的解决方法还是不行,请问大家有遇到类似的问题吗?有没有解决的办法?

A:这是 Compute Shader 的问题。先把 Unity 的平台切换到你所需要的移动平台,比如 Android,然后删除所有的 Compute Shader,再重新更新下来,这样就不报错了。

经过上面的操作后,如果打包的时候还是报这个错误,就看下 Player Setting 里面的 Other Setting,需要将 Graphics APIs 设置成 OpenGL ES3,打开 Require ES3.1,因为 ES3.1 才支持 Compute Shader。

这里的 Compute Shader 属于 PPSv2 的 Color Grading,我建议用 Color Grading 的另外一个不用 Compute Shader 的模式,因为 Compute Shader 在手机上支持的并没有那么好。

感谢王烁@UWA问答社区提供了回答


Build

Q:文件或文件夹名字是下划线开头,放在 Assets 里面用 Gradle 打包 APK 后解压发现找不到。有没有选项可以设置把_开头的文件都打进去?

A:这是 Android 的规则:

可以尝试在 build.gradle 里面作如下修改,相当于去掉这个规则:

android {
    ...
    defaultConfig {
        ...
        aaptOptions {
            ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~'
        }
    }
}

感谢黄程@UWA问答社区提供了回答


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册