1)Lua全局变量代码标准
2)AssetBundle LockPersistentManager开销
3)Unity内置字体在资源检测报告中不算冗余资源
4)特定Android设施上,Adreno产生冻屏问题
5)Mask和RectMask性能上的区别


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

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

Lua

Q:应用Lua语言作为脚本辅助开发曾经十分风行了,然而Lua语言中的全局变量是一个令人头疼的问题,因为无需申明就能够应用、编译器编译不会针对重命名和笼罩进行报错,稍不留神就会笼罩掉全局变量导致Bug,而且全局变量援用GameObject有可能会造成泄露。

大家在开发过程中,对于Lua全局变量会制订什么代码标准吗?例如:什么时候能够应用全局变量?如何申明?如何躲避笼罩等问题,谢谢。

A:能够在Lua虚拟机启动当前,在适当的机会执行一下luaGlobalCheck.lua文件,这个文件外面会设置一下_G的元表和元办法,通过重写_newindex和 _index元办法的形式来做到禁止新建全局变量和拜访不存在的全局变量时提醒谬误。这样能够做到防止随便新建全局变量污染环境和笼罩的问题。

luaGlobalCheck.lua代码如下:

setmetatable(_G, {    -- 管制新建全局变量    __newindex = function(_, k)        error("attempt to add a new value to global,key: " .. k, 2)    end,    -- 管制拜访全局变量    __index = function(_, k)        error("attempt to index a global value,key: "..k,2)    end}) 

感激马三小伙儿@UWA问答社区提供了答复

AssetBundle

Q:察看性能曲线,发现某一帧AssetBundle加载中,LockPersistentManager耗时比拟大。请问这块是否可能优化?

A1:这阐明以后帧或前几帧中存在较大量的资源在通过LoadAsync来进行加载,其本质是所加载的资源过大所致,对本身资源进行正当优化可升高Loading.LockPersistentManager的开销。另外,将异步加载换成同步加载,LockPersistentManager就不会呈现了,但其总加载耗时是没有变动的,因为总加载量没变。

对于次要资源的加载优化,可参考如下链接:
《Unity加载模块深度解析(纹理篇)》
《Unity加载模块深度解析(网格篇)》
《Unity加载模块深度解析(Shader篇)》
《Unity加载模块深度解析之动画片段》
《移动游戏加载性能和内存治理全解析》

该答复由UWA提供

A2:Unity 2019.4.1版本下,其实是bundle.LoadFromFileAsync在主线程的Integrate Asset中执行,和PreloadManager线程的LoadAssetAsync不能同时进行,必须要锁,也就呈现LockPersistentmanager,始终锁到一方完结。

实质还是这块实现不欠缺,能够用Spin Lock始终锁到Application.backgroundLoadingPriority规定的工夫再到下一帧就行了,不必始终锁到一方开释。

Unity 2019.4.11和2019.4.16批改了主线程读Bundle和等锁的问题:

我在Unity 2020.1.17版本出的iOS上测试是根本解决了:

然而还有个别异步加载主线程等锁的景象,预计是资源太大收集依赖工夫太长触发的:

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

AssetBundle

Q:咱们的我的项目工程中返现两个界面的Prefab,都是用Unity本人的Arial字体生成的Bundle,上传到资源检测,然而在报告中并未看到内置的字体是冗余资源。

A1:这个Arial是属于Unity内置资源,打包APK的时候是会被打进unity default resources外面的,所以AssetBundle中应用到了这个Arial字体都是援用关系,并不会打包进对应的AssetBundle中,因而看不到冗余是失常的。

应用AssetStudio关上APK包中的assets/bin/Data/目录下的unity default resources就能够看到了,如下图:

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

A2:不倡议应用Arial字体,在某些低端机上中文无奈显示,次要还是默认字体在不同机型上的不一样。

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

Rendering

Q:特定Android设施上,Adreno产生冻屏(GPU挂起)的问题。

景象是屏幕冻住不刷新了,然而音乐和点击UI的音效还能够播放。用Unity Profiler看CPU也没异样和闪退。冻屏时抓到的谬误日志可戳原问答查看,麻烦大家帮看下有什么启发,谢谢!

A1:不确定堆栈是不是跟你一样。之前用Mono包在小米手机上呈现过一样的状况,前面改成IL2CPP就没复现了。

感激剑影蒙残@UWA问答社区提供了答复

A2:楼上这个方法对于局部机型的确无效,不过有些MTK的手机还是会有相似的问题。咱们我的项目也有相似的,花屏或者屏幕画面卡死。感觉像是Unity合批出的问题,动静合批或者是GPU Instance。咱们尝试着把单个批次的GPU Instance数量升高会有所缓解,这个数量最好依据手机GPU型号做个适配。

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

A3:应用了Unity官网提供的GPU Instance计划来实现的。
https://github.com/Unity-Technologies/Animation-Instancing

开始应用的是这个计划默认的Shader渲染了战斗单位,导致了奇怪的闪退和解体,默认的Shader如下:

在这个Shader中的loadMatFromTexture函数调用了9次,loadMatFromTexture的实现如下:

能够确认这里的问题大概率是采样次数太多导致,而后批改了就应用以后帧,不进行Lerp操作,且每个顶点只受两根骨骼的管制,而后测试没有解体,目前还正在和美术确认成果损失的接受程度,起初的代码大略是这样:

感激卢永平@UWA问答社区提供了答复

UGUI

Q:在Unity UI中,Mask和RectMask性能上有什么区别吗?

A1:RectMask2D:不须要依赖一个Image组件,其裁剪区域就是它的RectTransform的rect大小。

性质1:RectMask2D节点下的所有孩子都不能与外界UI节点合批且多个RectMask2D之间不能合批。

性质2:计算Depth的时候,所有的RectMask2D都按个别UI节点对待,只是它没有CanvasRenderer组件,不能看做任何UI控件的bottomUI。

Mask:组件须要依赖一个Image组件,裁剪区域就是Image的大小。

性质1:Mask会在首尾(首=Mask节点,尾=Mask节点下的孩子遍历完后)多出两个Draw Call,多个Mask间如果合乎合批条件这两个Draw Call能够对应合批(Mask1的首和 Mask2的首合;Mask1的尾和Mask2的尾合,首尾不能合。)

性质2:计算Depth的时候,当遍历到一个Mask的首,把它当做一个不可合批的UI节点对待,但留神能够作为其孩子UI节点的bottomUI。

性质3:Mask内的UI节点和非Mask外的UI节点不能合批,但多个Mask内的UI节点间如果合乎合批条件,能够合批。

从Mask的性质3能够看出,并不是Mask越多越不好,因为Mask间是能够合批的。得出以下论断:

  • 当一个界面只有一个Mask,那么RectMask2D优于Mask;
  • 当有两个Mask,那么两者差不多;
  • 当大于两个Mask,那么Mask优于RectMask2D。

感激你如暖阳@UWA问答社区提供了答复

A2:从多个Mask合批思考楼上的论断是能够的,这里补充一下:Mask写Stencil会有额定的OverDraw,Mask2D没OverDraw,但每个Item都要和MaskRect比拟,有肯定的CPU开销(Mask实用于Item很多的状况,Item少倡议Mask2D)。

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

A3:从UI合批的角度看,在同一层级中:

Mask是一个具备高优先级的非凡组件,会优先进行操作。Mask会扭转本人和其中UI的Material,两者不同。

RectMask2D是一个裁剪器,没有非凡权限,其合批规定与其它一般组件雷同。RectMask2D会扭转其中UI的Clip Rect。故不在同一个RectMask2D下的UI组件不能合批。

在UI是否合批的起因中,猜想:

Different Rect Clipping是指从RectMask2D到一般组件,或反之Different Clip Rect是指两个RectMask2D之间切换。

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


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

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