Q&A——资源管理(十四)

Find-Unity-ManagedStaticReferences:查找Unity ManagedStaticReferences Find-Unity-ManagedStaticReferences 当我们使用 Unity Profiler 查看内存时,经常有些贴图等资源的引用只有一个 ManagedStaticReferences() 引用,怎么都卸载不掉。 使用 Memory Profiler 也查找不到谁引用的。现在终于找到方法,开心,分享给大家。 具体思路: 维护一个 key 是 物件 Hierarchy 路径, value 是 WeakReference 的字典,收集所有可能会泄漏的组件 在需要 Check 的物件挂靠的脚本里 添加该 Componet 的 弱引用到字典 查看 Alive 状态,Alive 为 true ,但 target 为空的即为泄漏者,打印他的路径 如果单纯查找 UI 贴图的内存泄漏,例如 NGUI 可以只在 UIWidget 的 Awake 里添加弱引用到字典, UGUI 的话需要 立即下载

资源管理

Q1:我的游戏运行一段时间之后,已经切换到一个空场景了,然后手动调用了System.GC.Collect(); Resources.UnloadUnusedAssets();为什么还是会有这么多贴图资源被引用呢。我猜可能是由于一些脚本中的静态变量引用导致,请问有办法查出来是哪些静态变量吗?

很大可能是这些资源直接或间接被其他Container缓存了,这种情况在我们进行内存泄露分析时经常遇到。如果是Unity 5.3以后版本,建议尝试在iOS版本上在Memory Profiler中进行查看具体的引用信息。


资源管理

Q2:在UWA性能测评报告中,为什么同样分辨率、同样格式的纹理资源,其内存相差一倍?表格中Mipmap的数量是怎么计算的?
请输入图片描述

一般来说,在开启Mipmap的情况下1024x1024的ETC2纹理应该是1.3MB的,但YYS_02_buildling002_2为2.7MB,所以很有可能是开启了Read/Write选项,建议在Editor中查看该纹理的具体设置。

Mipmap的数值表示该纹理Mipmap的层数,其与纹理的分辨率相关,具体建议阅读:https://en.wikipedia.org/wiki/Mipmap。

资源管理

Q3:关于资源冗余,我从AssetBundle中加载一张贴图后,即使Unload(false),是否还会在内存中保留一个没有被任何资源引用的贴图呢?是否非得UnloadUnusedAssets()才能把这个“僵尸”资源给卸载掉?

是的,从AssetBundle中加载资源并执行Unload(false)后,其加载出的资源如果没有被引用,那么会处于“游离”状态,即问题中所谓的“僵尸”资源。除Resources.UnloadUnusedAssets()外,Resources.UnloadAsset和AssetBundle.Unload(true)均可以将其进行卸载。

资源管理

Q4:请教Lightmap相关的优化问题。我现在的场景中有N个GameObject共用一个Prefab,烘培Lightmap时,会生成出N个Lightmap贴图。有没有办法把这些生成的Lightmap合成一张?

如果场景中某些物件在Lightmap纹理中占据的空间较大,但实际上并不需要较高的精度,那么可以选中该物体,并在Lighting面板的Object子面板中将其Scale in lightmap数值调低,从而可以降低其在Lightmap纹理中的空间,甚至减少Lightmap纹理的数量。

资源管理

Q5:Unity里的Shader能不能用关键字#ifdef #endif把整个pass包起来?

#ifdef 和 #endif 并不能写在Pass之外,如果有动态开关Pass的需求,可以通过Shader Lod来实现,即设置两个Level不同的SubShader分别包含1个和2个Pass,直接通过改变该Shader的局部Lod值,即可实现SubShader的切换。关于Shader Lod的细节,可见官方文档:
http://docs.unity3d.com/Manual/SL-ShaderLOD.html

资源管理

Q6:我把多个AssetBundle打成一个大包,会出现部分粒子特效贴图丢失的问题。参数设置为CollectDependencies | DeterministicAssetBundle | UncompressedAssetBundle时,贴图是对的,但是脚本、Shader又出错了。由于Unity 4.x下AssetBundle的问题比较多,想知道打大包可行性如何?

在Unity 4.x的版本中我们并不建议将资源打成一个超大的AssetBundle包,一般情况下,单独发布的AssetBundle文件应尽可能小于1MB。这主要是因为Unity 4.x版本中AssetBundle文件压缩格式为LZMA格式,而不是LZ4格式(Unity5.3版本以后推荐格式)。所以,如果一个AssetBundle文件较大,则在加载时很可能会出现较高的WebStream占用,从而造成项目运行时局部时刻内存过高的情况,进而影响运行的稳定性。

同时,需要说明的是,Unity 4.x版本在制作AssetBundle文件时,应尽可能开启CollectDependencies | CompleteAssets | DeterministicAssetBundle选项。如果开启后出现资源丢失,则一般是由于依赖关系所致,相关资源被打包到其他AssetBundle文件中。对此,我们建议在UWA资源检测的结果中,查看所丢失的资源是否存在于AssetBundle中,以及存在具体哪个AssetBundle文件中,从而来进一步解决AssetBundle的打包正确性问题。
请输入图片描述

资源管理

Q7:我们的游戏中,相邻关卡资源很相似。现在涉及到切换场景,每次都要卸载资源又加载资源,很耗时;但是如果先加载再卸载,内存峰值又会涨。请问UWA有什么建议么?

UWA建议研发团队可以将共用资源剥离出来,与其他场景进行依赖关系打包。这样当相邻副本切换时,其共用资源常驻内存,可以避免频繁加载和卸载所带来开销。如果研发团队想更准确地定位到底是哪些资源在频繁加载和卸载,那么可以通过UWA性能报告中的“资源管理”界面进行查看。如下图所示,多种不同资源被不同场景所共用,存在频繁加载和卸载的情况。对此,建议研发团队在内存允许的情况下,将此类资源进行缓存。

0.png


资源管理

Q8:在AssetBundle打包的时候,我们是一个文件一个AssetBundle,基本不存在冗余的情况了。但这种做法是否可取?UWA有什么建议?

这种做法是不足取的,因为这会造成Assetbundle文件非常细碎,进而带来两点不足:
(1)加载IO次数过多,从而增大了硬件设备耗能和发热的压力;
(2)在我们测试过的Unity 5.3 ~ 5.5 版本中,Android平台上在不Unload的情况下,每个AssetBundle的加载,其每个文件的SerializedFile内存占用均为512KB(远高于其他平台),所以当内存中贮存了大量AssetBundle时,其SerializedFile的内存占用将会非常巨大。

下图为我们获取的游戏运行时AssetBundle在内存中的贮存数量,在某一副本中,AssetBundle可以达到160个,那么其在Android设备上的SerializedFile内存也将达到80MB。该问题为目前Unity项目开发团队特别需要注意的地方。

请输入图片描述


资源管理

Q9:BuildAssetBundleOptions.DisableWriteTypeTree这个选项的实际用处是什么?

在Unity 5.x版本中,AssetBundle在制作时会默认写入TypeTree信息,这样做的好处是可以保证AssetBundle文件的向下兼容性,即高版本可以支持以前低版本制作的AssetBundle文件。所以,如果开启DisableWriteTypeTree选项,则可能造成AssetBundle对Unity版本的兼容问题,虽然关闭TypeTree会使Bundle更小,但我们一般都不建议研发团队在制作AssetBundle文件时开启该选项。


资源管理

Q10:我用DestroyImmediate 和 Resource.Unload 来进行卸载Prefab,在卸载前我获取Prefab下所有的材质,发现有些文件无法卸载,类似下图中的MangedStaticReferences(),怎么卸载这些资源呢?

请输入图片描述

从图片上来看,这个是资源被逻辑代码缓存的问题。图中YangCheng纹理之所以无法卸载,是因为它被YangCheng材质所引用,而YangCheng材质又被UIAtlas脚本所引用,ManagedStaticReferences表示此资源最终是被逻辑脚本所引用,即可能某个脚本中的变量或者Container对其仍有索引。从该图来看,很可能是使用到该Texture的某个UI GameObeject没有被释放所致。建议研发团队可以检测一下具体使用YangCheng材质的索引情况,定位其被索引的原因。一般主要有两种可能,一是它自己本身被储存于脚本变量中,二是引用它的GameObject被储存于变量中。研发团队可先从以上两方面入手,对该资源进行检测和排查。


YOLO学习笔记 | YOLOv8与卡尔曼滤波实现目标跟踪与预测(附代码) YOLOv8采用改进的CSPDarknet骨干网络和动态标签分配策略,提供高精度、实时的目标检测能力。使用IOU(交并比)或马氏距离作为代价矩阵,通过匈牙利算法匹配预测框与检测框,解决多目标ID分配问题。卡尔曼滤波通过状态方程和观测方程对目标运动建模,结合预测与观测数据优化状态估计。完整代码需结合具体场景调整参数,并补充匈牙利算法实现(可参考。匈牙利算法(Hungarian Algorithm)是解决。的高效方法,常用于目标跟踪中的。),作为跟踪的输入观测值。(将检测框与预测框匹配)。 阅读详情

相关推荐

汽车电子电气架构演进:从分布式ECU到域集中与中央计算

汽车电子电气架构(EEA)是整车电子系统的顶层设计框架,定义了计算、通信、供电等核心要素的组织方式。其演进遵循从分布式到集中式的技术路径,旨在解决传统架构下ECU数量膨胀带来的成本、复杂度和协同难题。通过域控制器(DCU)整合功能域,以及向中央计算+区域控制架构发展,实现了硬件资源池化、软硬件解耦与高速通信。这一变革的核心技术价值在于提升算力利用率、简化线束布局、支持软件定义汽车(SDV)与持续OTA升级。在智能电动汽车时代,新架构为智能座舱、自动驾驶等复杂应用提供了可扩展的平台基础,推动了汽车产业从硬件导

weixin_30326741的博客 387

AssetBundle.Unload(false)的作用

一直不太明白AssetBundle.Unload(false)的作用,官网的解释是这样的: When unloadAllLoadedObjects is false, compressed file data for assets inside the bundle will be unloaded, 说是当参数是false时,会释放掉assetbundle里面的关于资源的压缩文件数据,还

tyzxhxl的专栏 7083

非标准包 game.rgss3a 的打开方法 | 2023 年实测

生活笔记

陌雨’的博客 1万+

AssetBundle.Unload(false/true)

AssetBundle.Unload(false/true)

Mediary的博客 1409

FPGA和USB3.0通信-USB3.0 PHY介绍

可以和FPGA搭配使用的USB3.0 PHY芯片通过之前的介绍<FPGA和USB3.0通信-USB3.0协议介绍USB3.0 PHY简介首先我们需要了解PHY具体完成哪些工作以及我利...

OpenFPGA的博客 4941

【DRAM存储器六十八】DDR5介绍--DQS Interval Oscillator—动态时序校准利器

DDR5内存采用DQS间隔振荡器(DQSIntervalOscillator)技术应对高速数据传输中的时序漂移问题。该技术通过测量DQS信号在可编程时间窗口内的振荡次数(16位计数值),动态监测温度/电压变化导致的DQS-DQ延迟偏移。控制器通过MPC命令启停振荡器,读取MR46/MR47寄存器获取计数值,并与基准值对比来调整DQS相位,确保数据采样窗口始终处于最佳位置。该机制使DDR5在8400MT/s高速率下仍能保持数据可靠性,有效补偿±0.48tCK的时序偏移。

highman110的博客 157

【Unity】Asset资源加载详解

目录 一、资源加载种类 二、AssetBundle使用 三、大世界实现方案 四、大世界优化 一、资源加载种类 1.Resource.Load() Resource.Load是Unity加载Resources文件夹的加载方式,Resources文件夹会随着打包一起被打到游戏包内。 2.UnityEditor.AssetDatabase.LoadAssetAtPath()...

PA_的博客 2万+

【CUDA Runtime】第一个“Hello World“程序

CUDA(Compute Unified Device Architecture)是 NVIDIA 提供的一个并行计算平台和编程模型,旨在通过利用 GPU 的强大计算能力来加速计算密集型应用。对于许多开发者而言,开始学习 CUDA 编程的第一步通常是编写一个简单的“Hello World”程序。尽管 CUDA 的实际应用远远超出一个简单的例子,但这个初步的示例能帮助开发者快速入门,理解基本的 CUDA 编程流程。

m0_62599305的博客 1508

Unity中,AssetBundle.Unload(bool)的用法

Unity AssetBundle Unload(false)和Unload(true)的区别和用法

qq_37801252的博客 682

个人量化系统的策略集合与赚钱之道:全栈深度解析 + 与主流开源框架对比

前三篇把系统的"骨架"拆完了——架构、工程化、部署。本篇回答最关键的问题:一句话:别人的系统是"程序员的系统"(写代码才能加策略),daily_stock_analysis 是"股民的 YAML"(写中文就能加策略)。这个差异决定了它能在多大程度上真的帮你赚钱。如果你用过 、、,加一个策略的流程是: 问题在哪?在 daily_stock_analysis 里,“策略” = 一个文件。每个 YAML 是一个自然语言描述的交易策略,包括: 看到没? ——整个策略就是一段中文,零代码。任何会写字的人都能加新策略

shiter编写程序的艺术 160

Unity之如何接入NPOI 快速读取Excel

NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目

TxNet 4397

AssetBundle中Unload()方法的作用

AssetBundle.Unload(false)的作用: 官网的解释是这样的: WhenunloadAllLoadedObjectsis false, compressed file data for assets inside the bundle will be unloaded 说是当参数是false时,会释放掉assetbundle里面的关于资源的压缩文件数据。 A...

ddry47579的博客 770

畅游Diffusion数字人(0):专栏文章导航

畅游Diffusion数字人(0):专栏文章导航

沉迷单车的追风少年 1425

Q&A——资源管理(十)

资源管理 Q1:关于定位游戏中冗余资源引用的问题。UWA的报告中能定位到具体的引用代码么? 在Profiler只能看到ManagedStaticReferences但是具体不到引用的位置。比如Static ClassA引用一个ClassB,ClassB上引用了一个资源,就定位不出这个引用的过程。请问这种情况下有没有比较好的方法找到引用关系呢? 该问题在Unity 5.3 之前的版本

起个名字好难啊 1352

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Q&A——资源管理(十一)

资源管理 Q1:怎么去掉Mesh中的Colors属性?我把FBX里的LayerElementColor字段都删了,这个Colors还是存在。 默认情况下,在3d建模软件中并不会导出Color属性。以3ds max为例,Color通常是通过modifier添加的,因此只需要在导出前将其删除即可。另外也可以通过fbx sdk来直接对文件进行处理,但这种做法就需要查看官方的文档了。

起个名字好难啊 935

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

咱们一起学C++ 第三百一十四篇C++异常安全与资源管理实战

大家好!在C++编程学习的道路上,我们不断接触到新的知识和挑战。今天我们聚焦在C++异常安全与资源管理这个关键领域,希望通过分享和交流,能让大家更好地理解和掌握这些知识,一起在C++的学习中取得进步。

wj_rdk的博客 1050

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Q&A——资源管理(三)

资源管理 Q1:StreamingAssetPath 和 PersistantDataPath下可以不Load AssetBundle ,直接放资源Load吗? 这是可以的,但非常有限。因为不通过 AssetBundle 加载,只能通过 Unity 提供的有限的接口来直接加载外部资源,如通过 WWW.audioClip 直接加载 mp3文件,通过 WWW.texture 直接加载

起个名字好难啊 472

Q&A——资源管理(七)

资源管理 Q1:我想请教一下,下图这个函数中,每次我都申请了一个List temp = list();在这里存放6KB的数据,但是如果不做GC处理,这6KB是否就一直累加,直到做GC处理了才会释放掉,是这样么?如果调用次数很多,每次都调用一点点,也会推高内存占用吗? A:是的,这个6KB堆内存会随着Update的执行一直分配内存,所累积的堆内存会在GC触发时进行销毁。一般来说,研发

编程小生的专栏 884

Q&A——资源管理(六)

资源管理 Q1:请教个问题,我用Unity 5 里提供的Sprite Packer把A.png,B.png打进一张图集,在运行时我怎么方便地加载这两张图呢?使用场景:某个Image控件根据不同的条件显示A,或者显示B。 目前通常是在脚本序列化信息中保留这两个Sprite的引用,在切换时直接通过对Image.sprite进行赋值来切换。

起个名字好难啊 1200

Q&A——资源管理(十二)

资源管理 Q1:我们在做依赖打包改进,比如UIAtlas这种脚本,AssetBundle包里脚本没有做依赖,每个包里都有这个脚本,会导致Mono堆内存增大么?对于“脚本也是资产”这一点理解的不是很透彻。脚本在AssetBundle里是不会启动,但是会出现脚本丢失。本身没有做依赖打包的话脚本是冗余在AssetBundle中吧? 首先,需要说明的是,脚本本身的内容是不会被打包到Asse

起个名字好难啊 1100

【Cocos Creator UI资源管理】

ui资源管理框架

Javaigood的博客 1611

Q&A——资源管理(五)

资源管理 Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了。而且我把图片都打成了Bundle,然后读取出来,图片的大小应该是超过了这个SerializedFile的大小的? SerializedFile是AssetBundle加载时产生的序列化信息,一般为LoadFr

起个名字好难啊 817

Q&A——资源管理(八)

资源管理 Q1: 我使用Shader.WarmupAllShaders操作,在后续加载资源还是有CreateGPUProgram出现。(Shader都在一个AssetBundle文件中,都是常驻内存的,不会删掉)是必须使用ShaderVariantCollection来加载Shader吗? A:以上这种问题的较大可能是:Shader被打包到不同AssetBundle中了,WarmupA

编程小生的专栏 786

Gameframework资源管理适配其他资源管理方案

由于我们实际使用的过程中只会使用上面定义的接口,所以可以直接return了。两个版本由于是单独构建的,因此无法实现一次打包,两个版本互用的情况。使用mono来实现这个接口,在启动应用的时候注册到GFAdapterResourceManager 中,操作和ufg的editor资源加载方案相似。实现CustomResourceManagerBase,简单的把ugf中的editor相关的移植过来。在做之前,我们需要研究一下,常用的几款资源管理方案。此处的接口是按照ugf的接口进行提出的,方便适配。

zweiluan的博客 1071
上一篇: Q&A——UI性能
下一篇: Q&A——渲染优化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值