首页 TG成品账号购买内容详情

如何降低Animator的调用次数

2026-03-20 4 纸飞机账号购买

1)如何降低Animator的调用次数

2)为什么UI相关堆内存对象和纹理资源都占用了较大内存没有释放

这是第467篇关于UWA技术知识分享的推送,它精心挑选了UWA社区的热门话题,这些话题包含了UWA问答、社区帖子等这样一些技术知识点,能帮助大家更加全面地去掌握并学习。

UWA社区主页:community.uwa4d.com

UWA QQ群:793972859

From 问答社区

Q:当下动画的Culling Mode是Cull Update Transforms,然而从Scene窗口去看,处于屏幕外的那个动画居然依旧在动,这种情况还需进行别的什么样的设置吗,又或者是我的理解存在偏差呢?

接着,先前Camera未曾勾选Occlusion Culling,这存在关联吗?

为什么报告里Animator的调用次数那么多呢?

先来说,Scene当中确实是会产生影响的,要是想要做到准确无误的话,是需要将Scene窗口给关闭掉的。

紧随着,Camera并未勾选Occlusion Culling,这并无丝毫关系的。

最终,于Profiler之中挑选那个Animator.ApplyOnAnimatorMove函数,随后开启Related Data,是能够瞧见具体究竟是哪些对象的:

欢迎大家转至社区交流:

此为一个网址内容,地址是https://answer.uwa4d.com/question/69b7a2f392894f1c4f0c2354。

From UWA AI 问答

Q1:在项目里,察觉到一些UI图片被众多UI对象引用着,然而这些对象理应在代码当中已经借助调用进行销毁操作了,可是看上去RUUA以及GC似乎都没能起到成效,这最终致使在我的项目里,诸多与UI相关的堆内存对象以及纹理资源都占据了较大的内存,且没有被释放。这有可能是何种原因呢?

A:此问题通常由隐性引用、资源标志位或原生资源未释放导致。

排查代码引用链,在Lua或者C#里,静态变量、事件监听以及闭包有可能持有UI对象引用,进而致使GC没办法回收。查看GOT Online报告的Mono引用对象统,要是“Destroyed对象数量”持续地上涨,那就表明存在Lua端未解引用,需要及时去释放引用链。查看资源标志位,要是纹理或者对象被标记成 HideFlags.DontUnloadUnusedAsset,那么 Resources.UnloadUnusedAssets 就没有办法卸载它们,还要查看代码是不是错误设置了这个标志,在有必要的时候用 DestroyImmediate 手动清除。还要确认 AssetBundle 与图集依赖,要是引用图集的 AssetBundle 没有卸载完毕,图集会停留。要保证AssetBundle.Unload(true)的调用无误,或者去尝试Resources.UnloadAsset。对原生资源展开排查:RenderTexture不会自行进行垃圾回收,在用完之后一定要调用Release去释放硬件资源,不然的话会导致显存以及内存出现泄漏。思索内存碎片的问题:堆内存高并不一定就是对象没有卸载,有可能是碎片数量过多。排查频繁分配的对象比如byte、MemoryStream等,利用对象池进行优化。

提议将内存快照予以结合之后,对具特定占用对象展开分析,去定位引用源,在必要之时,以手动方式对资源生命周期加以管理,以此避免过度依赖自动卸载机制。

问题二:我瞧了瞧UWA报告之中那个Mono引用对象统计页面,Destroyed对象的数量的确是比较高的,而且还存在着上涨的情况,那么这个具体而言究竟是什么样的含义呢?

甲指出,被销毁对象数量处于较高状态并且持续攀升,这乃是Mono堆内存出现泄漏情况时的重要预警信号,其具体所蕴含的意义如下:

定义说明

被销毁对象是那种即指在C#端已经调用了Destroy进行销毁操作,然而Lua端的Mono层对象却依旧持有引用的对象,这些对象虽然在场景当中已经被移除的了,但是因为Lua端没有解除引用,所以仍然占据着堆内存,并且无法被垃圾回收机制回收,其产生的原因是什么。

在Lua访问Unity对象之际,会借助Wrapper代码把对象引用放置到容器当中,以此来保证C#端的GC不会过早进行回收。要是Lua端没有及时去释放这些引用,那么C#端的Destroy操作就无法完全清理内存,进而致使对象驻留,存在持续上涨的风险。

要是Destroyed对象的数量持续地往上涨,那就表明Lua端的引用链并没有被正确地清理掉,Mono堆内存那就会不停地累积起来,最终会致使:

• 内存占用持续增长

• GC频率升高,引发卡顿

• 极端情况下导致内存溢出闪退排查建议

看下GOT Online报告里头的Mono对象引用柱状图,去确认Destroyed对象的趋势。

• 对比不同采样帧,定位对象数量激增的时间点

• 结合Lua堆内存分配堆栈,查找高分配函数

检查Lua代码里的事件监听,查看闭包,确认静态变量有没有持有UI对象引用,找出解决方法。

• 在Lua端及时释放不再使用的对象引用

• 移除不必要的静态引用和事件监听

• 使用弱引用管理长期持有的对象

• 定期调用GC强制回收

倘若Destroyed对象的数量,在稳定于某一个水平之后,不会再出现上升的情况,通常来讲风险是可以得到控制的;要是其数量持续呈现上升态势,那么就需要优先对Lua引用链进行仔细排查,以此来防止内存泄漏朝着恶化的方向发展。

如何降低Animator的调用次数

相关标签: # Animator # 内存泄漏 # UI对象 # 资源管理 # CullingMode