如何降低Animator的调用次数

如何降低Animator的调用次数

1)如何降低Animator的调用次数
2)为什么UI相关堆内存对象和纹理资源都占用了较大内存没有释放


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

From 问答社区

Q:现在动画的Culling Mode是Cull Update Transforms,不过从Scene窗口来看,在屏幕外的动画还是在动,这个还需要做其他的什么设置吗,还是我理解的不对?

然后,之前Camera没有勾选Occlusion Culling,这个有关系吗?

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

A:首先,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等频繁分配对象,使用对象池优化。

建议结合内存快照分析具体占用对象,定位引用源,必要时手动管理资源生命周期,避免过度依赖自动卸载机制。

Q2:我看了UWA报告中的Mono引用对象统计页面,Destroyed对象数确实较高且有上涨,这个具体是什么含义?

A:Destroyed对象数较高且持续上涨是Mono堆内存泄漏的重要预警信号,具体含义如下:



1. 定义说明
Destroyed对象指在C# 端已调用Destroy销毁,但Lua端仍持有引用的Mono层对象。这些对象虽在场景中已被移除,但因Lua端未解引用,仍占用堆内存无法被GC回收。



2. 产生原因
Lua访问Unity对象时,会通过Wrapper代码将对象引用存入容器,以确保C# 端GC不会提前回收。若Lua端未及时释放这些引用,C# 端的Destroy操作无法彻底清理内存,导致对象驻留。



3. 持续上涨的风险
若Destroyed对象数量持续上涨,说明Lua端引用链未正确清理,Mono堆内存会不断累积,最终导致:内存占用持续增长GC频率升高,引发卡顿极端情况下导致内存溢出闪退

4. 排查建议查看GOT Online报告中Mono对象引用柱状图,确认Destroyed对象趋势对比不同采样帧,定位对象数量激增的时间点结合Lua堆内存分配堆栈,查找高分配函数检查Lua代码中的事件监听、闭包、静态变量是否持有UI对象引用

5. 解决方法在Lua端及时释放不再使用的对象引用移除不必要的静态引用和事件监听使用弱引用管理长期持有的对象定期调用GC强制回收

若Destroyed对象数稳定在某一水平后不再上涨,通常风险可控;若持续上涨,需优先排查Lua引用链,避免内存泄漏恶化。

分享链接:
https://www.uwa4d.com/main/uwa-shared.html?shareId=1d682f3a-b8eb-49d9-a00b-07f0813dddc0

无论是社区里开发者们的互助讨论,还是AI基于知识沉淀的快速反馈,核心都是为了让每一个技术难题都有解、每一次踩坑都有回响。本期分享分别来自UWA AI问答和UWA问答社区,希望这些从真实开发场景中提炼的经验,能直接帮你解决当下的技术卡点,也让你在遇到同类问题时,能更高效地找到破局方向。

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
 

Read more

深入剖析:按下 F5 后,浏览器前端究竟发生了什么?

深入剖析:按下 F5 后,浏览器前端究竟发生了什么?

文章目录 * 概述 * 一、关键前提:三种导航方式的本质区别 * 二、核心概念:强缓存 vs 协商缓存 * 1. 强缓存(Strong Caching) * 2. 协商缓存(Revalidation Caching) * 三、F5 刷新全景流程图 * 四、F5 刷新的完整生命周期详解 * 阶段一:主文档(HTML)的缓存验证与获取 * 阶段二:HTML 解析与渲染流水线(Critical Rendering Path) * 阶段三:子资源(CSS/JS/IMG)的缓存处理 * 五、对比总结:F5 与其他操作的本质差异 * 六、给前端开发者的实践建议 * 七、结语 概述 在前端开发中,

By Ne0inhk

Webots R2023b 完整安装配置教程

Webots R2023b 完整安装配置教程 声明:本教程由豆包、ChatGPT等AI工具协助完成。 本教程讲解如何安装 Python3、包管理器 Micromamba、必要依赖包(如 opencv-python),以及 Webots 仿真软件,并完成 Micromamba Python 环境与 MATLAB 地址的配置,适用于 Windows、macOS 双系统。 一、前置说明 1. 适用场景:需要使用 Webots 进行仿真开发,同时依赖 Python 进行脚本编写、OpenCV 进行图像处理,通过 Micromamba 管理 Python 环境,并关联 MATLAB 路径用于联合开发。 2. 版本约定(兼容性最优): * Python:

By Ne0inhk
35道常见的前端vue面试题,零基础入门到精通,收藏这篇就够了

35道常见的前端vue面试题,零基础入门到精通,收藏这篇就够了

来源 | https://segmentfault.com/a/1190000021936876 今天这篇文章给大家分享一些常见的前端vue面试题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 对于前端来说,尽管css、html、js是主要的基础知识,但是随着技术的不断发展,出现了很多优秀的mv*框架以及小程序框架。因此,对于前端开发者而言,需要对一些前端框架进行熟练掌握。这篇文章我们一起来聊一聊VUE及全家桶的常见面试问题。 1、请讲述下VUE的MVVM的理解? MVVM 是 Model-View-ViewModel的缩写,即将数据模型与数据表现层通过数据驱动进行分离,从而只需要关系数据模型的开发,而不需要考虑页面的表现,具体说来如下: Model代表数据模型:主要用于定义数据和操作的业务逻辑。 View代表页面展示组件(即dom展现形式):负责将数据模型转化成UI 展现出来。 ViewModel为model和view之间的桥梁:监听模型数据的改变和控制视图行为、处理用户交互。通过双向数据绑定把 View 层和 Model 层连接了起来,而View

By Ne0inhk
【前端实战】从 try-catch 回调到链式调用:一种更优雅的 async/await 错误处理方案

【前端实战】从 try-catch 回调到链式调用:一种更优雅的 async/await 错误处理方案

目录 【前端实战】从 try-catch 回调到链式调用:一种更优雅的 async/await 错误处理方案 一、问题背景:async/await 真的解决了一切麻烦吗? 二、真实业务场景下的痛点 1、错误需要“分阶段处理” 2、try-catch 的引入打破了 async/await 的链式范式 三、借鉴 Go、Rust 语言特性,错误也是一种结果 1、错误优先风格替代 try-catch 2、封装一个 safeAsync 工具函数 四、进阶版 safeAsync 函数设计 五、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“

By Ne0inhk