1)TMP耗时较高的优化问题
2)Unity重载Object后,如何断定物体是否为空
3)SRP Batch在增加unity_SpecCube后的问题
4)堆内存会持续上升,如何用UWA报告来剖析


这是第326篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

TextMeshPro

Q:咱们我的项目中UGUI的Canvas.SendWillRenderCanvases耗时高时常常看到子节点TMP.GenerateText和TMP Parse Text耗时高。根本能定位到是角色对话字母跳字的时候,然而这是硬需要不好改。大佬们有没有什么思路优化一下?

A1:倡议独自给这块开Canvas。

感激欧月松@UWA问答社区提供了答复

A2:角色对话时字幕上一个一个字蹦出来的确是比拟常见的需要了,都是在一个Text组件里变动,而且字越多顶点数就越高,耗时就比拟可观了。

我想到的一个思路还是改用动态字体图集。
可参考:https://answer.uwa4d.com/question/63e30f3b0638540599016732

我之前也遇到这个问题,所以做了下试验:
在一个Text组件里用代码管制间断输入3000个中文字符集中各不相同的文字。在Profiler中察看到:

  1. 当应用动静字体时,每输入一个字符都会在相应的TMP动静图集纹理资源中新画入一个字符,在Unity 2021、TMP 3.0.6版本环境下,输入到最初几个字符时,Canvas.SendWillRenderCanvases耗时来到24ms左右。
  2. 过后在用动态字体时,同样的输出形式和环境下,输入到最初几个字符时,Canvas.SendWillRenderCanvases耗时升高到14ms左右。

在还有一些补充测试中,耗时差距在真机上被进一步放大;而且在一些较低的稳固版本的Unity和TMP环境中试验后果也差不多。这里就不一一列进去了。总之,足以阐明应用动态字体计划在耗时层面也是具备优越性的。

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

Script

Q:Unity重载Object的 == 后,如何真的断定物体是否为空?

Unity中还找不到除了Try Catch外,去辨别Destroyed的物体和null的区别。一些资源追踪操作,能够查看Destroyed的物体,比方:取得Destroyed物体的InstanceID,去辨认到底具体出问题的货色是什么。然而如果应用真null的物体调用这类接口,就会出现异常。

当初想找一个,不触发异样的洁净办法,断定一个物体是被捣毁,还是真null。

A:简略的写法:
真null的判断:(go as object) == null;
如果不是真null,能够持续判断是不是Destroyed:(go as UnityEngine.Object) == null。

该答复由UWA提供

Rendering

Q:SRP Batch在增加unity_SpecCube相干参数后,呈现 "builtin property offset in cbuffer overlap other stages"。

其实是之前问题的具体情况。在反对SRP Batch的Shader增加反射探针相干参数后:
如果把探针参数放在UnityPerDraw外面,测试多种参数程序,都会呈现 "builtin property offset in cbuffer overlap other stages"问题;
然而放在UnityPerDraw外,又会呈现提醒要求把相干参数放进外面去。

当初集体想法是,这些参数应该放进UnityPerDraw内,然而具体程序有问题。不晓得有没有胜利植入测试的例子。或者是对源码有了解的兄弟能够给出一个可行的程序。

具体呈现问题的版本是2020.3.16f1。

我的项目现有问题倒是通过将相干参数放在CBuffer外,外加强制裁减变体,在测试到的环境中解决了。然而还是心愿可能解决这个深层次的坑。

A:明天也遇到这个问题了,看了下源码,这些Built-in Feature,例如反射探针或者Motion Vector,Unity是有一个Feature List来解决的,每当你开启一个Feature,会在UnityPerDraw调配一个Block,而后你新退出的参数必须跟这个Block大小匹配。

我的问题是Motion Vector只用到了一个矩阵和一个float4,然而Unity给调配的大小就是两个矩阵+一个float4,所以如果要不影响合批,就得这么申明。

你的状况感觉能够增加到probeVolume这个Feature的Block里,Catlike教程里也有提过,测了下程序不要紧,大小统一就行,3个float4和一个矩阵。

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

Memory

Q:大佬们问一下,咱们我的项目的堆内存会持续上升到400多MB,这个值太高了,而UWA报告中无论是平均分配值乘以帧数还是泄露剖析中的驻留量尽管也很高,然而离400MB还有一些差值。到这里不晓得怎么持续剖析了,有没有好的倡议?

A:2022年底帮一个我的项目解决了内存始终涨的问题,起因也是内存碎片。刚开始认为是资源出的问题,始终用Memory Profiler在定位问题,只能看到Empty Heap Space始终在涨,到最初发现这个工具找不到起因,然而大略确定了是内存碎片太多。最初通过GC Allocated的变动定位了局部性能。

在这个过程中发现了Profiler里的波形和数值有时候是对不上的,明明有一个很大的波峰,但数据显示基本不对,这时通过这条波峰是定位不到性能代码的。

总结几个容易呈现碎片的关键字:

  • byte[]
  • MemoryStream
  • ReadPixels
  • DeflateStream

解决办法:大部分状况能用对象池解决。

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

封面图来源于网络


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

官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:465082844