UI节点对运行效率的影响

UI节点对运行效率的影响

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


这是第204篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ec4d3d24d93790618e0eda3


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提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ec4b37a979400061e545323


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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ec619534d93790618e0edc7


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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ec4a5f6979400061e545322


Build

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

A:这是Android的规则:

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

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

感谢黄程@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5ec4d445979400061e54534b

封面图来源:
https://unity.com/madewith/praey-for-the-gods


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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)