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

7次阅读

共计 3897 个字符,预计需要花费 10 分钟才能阅读完成。

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(原群已满员)

正文完
 0