关于ui:如何优化UI中大量使用SetActive的问题

1)如何优化UI中大量应用SetActive的问题
​2)ASTC压缩和ETC2压缩打出的APK包的问题
3)PNG图片格式与TGA图片格式问题
4)游戏运行的解体问题
5)对于AssetBundle加载形式的实用环境


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

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

UI

Q:在UI的日常开发中为了显示或者暗藏某些GO应用了大量的SetActive(true)/(false)代码。然而SetActive的开销过大,所以不想应用SetActive,是否有其余解决办法?

A1:这种状况下Active/Deactive的开销次要有几个方面:

1.C#层到Native层的穿梭调用速度比C#层内的速度慢。
2.UI元素的变动导致所在的Canvas变动,触发函数Canvas.SendWillRenderCanvases()与Canvas.BuildBatch()造成高耗时。
3.UI元素的网格顶点数组扭转会造成堆内存调配,触发GC,导致耗时(不过对UI元素进行地位挪动不会造成堆内存调配)。

因而,优化也能够从以下几点思考:
1.在C#层设置变量来标识相应的GO处于Active还是非Active状态,防止对Active的对象进行SetActive(true),防止对非Active的对象进行SetActive(false)。

对Active进行SetActive(true)时,“底层”会进行判断,但调用的时候,就曾经是从C#层调用底层,导致开销较高。在C#层判断好,就防止了让底层判断。

2.将要频繁变动的UI元素与不频繁变动的UI元素放在不同的Canvas中,缩小UI元素变动时的耗时。

3.通过将UI元素的坐标挪动到Canvas的范畴之外的办法来显示与暗藏,防止SetActive的耗时以及SendWillRenderCanvases的耗时。

4.经测试,对Component进行enabled = false的操作比对GO进行SetActive(false)的操作耗时低。

5.通过增加CanvasGroup组件设置透明度的形式来进行显示与暗藏。

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

A2:最近做优化,也发现了这个问题,尤其是挂Image和TMPText的在SetActive的时候耗时更差。我筹备从以下方面做优化:

1.对于挂UICanvas的间接批改Layer层。

2.对于不挂UICanvas的,改成挂CanvasGroup来管制Alpha.
这个中央有个麻烦的点。因为咱们我的项目开了很久,让拼界面的同学去到须要管制的节点上挂CanvasGroup不太事实。在运行时动静挂组件,对性能有些担心。所以打算改成运行时遇到批改Active的节点,到对应的Prefab下减少一个CanvasGroup控件,这样Prefab就补全CanvasGroup控件了。在正式上线之后,如果有脱漏不存在的,间接应用SetActive。

3.应用CanvasGroup形式有个毛病,只是扭转了Alpha,仍然会占有布局,所以父界面是Layout的,不能采纳CanvasGroup。初步打算是比照SetScale0和SetActive的耗时,两者应该都会引起重绘。

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

Texture

Q:在一个空工程外面,我放了几张大图2048*2048的,采纳ETC2 4bits的格局压缩的时候单张大小为2MB,采纳ASTC 6X6压缩的时候单张大小是1.8MB。

依照我的了解:采纳ASTC压缩格局打出的APK应该更小才对,可是事实和我料想的相同:采纳ETC2压缩打出的APK为21.1MB;采纳ASTC压缩打出的APK为25.7MB。

为什么采纳ETC2压缩的包体反而更小呢?ASTC打出的APK更大呢?

A:占用包体的大小和在Editor下的Preview界面看到的大小是两回事。

Preview界面看到的大小是ASTC或者ETC2格局的资源的大小,而打包后,会对资源进行进一步的压缩(LZ4或LZMA)。只能阐明ETC2压缩成LZ4后占用的包体大小的确比ASTC压缩成LZ4后占用的大小更小,至于起因就要看具体压缩算法的实现了。

能够用AssetBundle来验证,如果打AssetBundle包时抉择NoCompression,那么的确ASTC格局的比ETC2格局的AssetBundle包更小。如果抉择LZ4或LZMA压缩,那么ETC2格局的AssetBundle包比ASTC格局的AssetBundle包要小。

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

Texture

Q:美术说有一张带通明通道的图,必须出TGA格局,不能出PNG格局的图,短少通明通道。请问为什么PNG格局在Unity中有些是有通明通道的?该怎么让美术在PhotoShop中出一张PNG格局图,又能满足成果的?可否具体说下这两者图在Unity中的区别原理?

A1:在PhotoShop中针对PNG并没有通明通道这一说。导出也只能导出RGB3个通道。想要批改PNG像素的通明信息须要用到蒙板。

你和美术同学说“这块的信息画在蒙版上,黑透白不透”,他就明确了。

感激张首峰@UWA问答社区提供了答复

A2:选TGA美术比拟好解决,也不必关怀PNG那几种格局的区别,PhotoShop里也不必解决Alpha的事,毕竟在引擎里都要依据不同平台进行压缩解决。不在乎工程大小的状况下,流程更不便才是要害。

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

Android

Q:游戏运行过一段时间后某些机器会呈现以下所示的解体,具体Log可戳原问答查看,请问有遇到过相似的问题吗?

JNI ERROR (app bug): global reference table overflow (max=51200)

我看Unity 2018.3外面有一个是相干内容,咱们当初用的版本是2019.4.10,按说应该曾经修好了,望各位大佬领导迷津,谢谢!

A1:是不是JNI调用次数太多了?我之前试过,有个腾讯语音的API始终在调用JNI,运行到肯定工夫后就解体了,日志如同跟你一样。

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

A2:应该是AndroidJavaClass和AndroidJavaObject只频繁New没调用Dispose导致的。

感激上山打野@UWA问答社区提供了答复

A3:参考以下信息:

2019.4.21f1 Release Notes
Fixes

  • Android: Fixed Java local reference leaking when using AndroidJavaClass/Object. (1283209)

在 https://unity3d.com/unity/whats-new/2019.4.21 的Fixes里。

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

AssetBundle

Q:对于AssetBundle加载形式的实用环境中,AssetBundle.LoadFromMemory以及AssetBundle.LoadFromStream实用环境别离是什么?

A1:AssetBundle.LoadFromMemory
1.应用UnityWebRequest下载的AssetBundle资源并且应用后不存到本地;
2.有加密需要的AssetBundle资源。

AssetBundle.LoadFromStream
1.有加密需要的AssetBundle资源(内存值实践上比AssetBundle.LoadFromMemory小);
2.Android下须要Copy出StreamingAssets目录外,创立流。

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

A2:当资源有加密需要时,可先把AssetBundle读取到内存当中,进行解密后再调用该AssetBundle.LoadFromMemory进行加载。该办法耗费的最大内存量将至多是AssetBundle的两倍。可参考《AssetBundle的原理及最佳实际》。

AssetBundle.LoadFromStream可进行流式加载,不须要将AssetBundle全副读到内存中再解密、加载,而是能够通过每次像Buffer中读一部分,解密一部分的形式进行加载,不会多占用一份很大的内存。如果应用该接口,须要自定义一个继承FileStream类,而后在Read和Write办法内对Byte数组进行异或加密解密解决。

具体用法可参考:https://www.xuanyusong.com/archives/4607

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

封面图起源:UiFaderPro
一组使Unity引擎中的UI(4.6b + uGUI)的淡入淡出变得容易的脚本。
https://lab.uwa4d.com/lab/5b5d2aaad7f10a201feadf62


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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理