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

Infor_Query_and_Analysis_10_1_6_SunSystems Infor Q&A 相信很多相关人士使用过的吧,这次特把安装程序上传上来.希望对大家有帮忙,.由于安装程序大于240,只能分开两个上传了. 程序内容包括如下: Infor_Query_and_Analysis_10_1_6_SunSystems.part1.rar 链接地址 https://download.youkuaiyun.com/download/snuff_914/10357595 Infor_Query_and_Analysis_10_1_6_SunSystems.part2.rar 链接地址 https://download.youkuaiyun.com/download/snuff_914/10357609 立即下载

资源管理

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

首先,需要说明的是,脚本本身的内容是不会被打包到AssetBundle文件中的,AssetBundle文件储存的仅是脚本的索引信息。因此,即便有多个AssetBundle中都存在UIAtlas这一脚本索引,对堆内存也几乎是不产生影响的,且不会产生冗余问题。其次,脚本被当做资源且会产生依赖这一现象,仅在Unity 4.x版本中出现,而在Unity 5.0以后,脚本之间将不会产生依赖关系。因此,如果你目前还在使用Unity 4.x版本进行开发,那么依赖关系打包时确实需要注意这个问题,即依次Push A和B进行打包时,如果AssetBundle之间存在相同脚本,那么B会对A的脚本产生依赖。关于更为详细的分析,请查看我们之前的推送:揭秘AssetBundle 4.x 。


资源管理

Q2:我们正在权衡是否对纹理资源进行Alpha通道分离。现在发现,Android低端机上(OPENGL ES 2.0)使用Alpha分离,内存相当是两个ETC1的大小(相对RGBA32是小了很多),但是Shader中纹理采样会执行两次,这个采样其实对低端机消耗还是蛮大的吧?在iOS上分离是没有意义的,而且分离之后使用上会变麻烦,这样权衡之下,分离Alpha只是改善内存的话,优势看起来感觉不太明显,是否有更好的说法来说明分离的优势?

在Android平台上实施Alpha分离操作,是我们非常推荐的做法。如果项目中RGBA32、ARGB32格式的纹理较多,那么研发团队确实需要考虑尽可能将这些纹理转换成两张ETC1格式的问题。不仅内存占用可以降低为之前的1/4,同时加载效率上也会大幅提升。对于不同格式的纹理资源加载效率对比,可以查看我们之前的技术文章:加载模块深度解析之纹理篇。现在纹理的Alpha通道分离操作并不麻烦,网上已经有很多现成的代码可以使用,比如Unity一键图集生成工具。同时,分成两张ETC1纹理确实会增加一次纹理采样操作,但经过大量项目的真机实测,我们并未发现在运行时会出现性能波动。对于iOS平台来说,其PVRTC格式本身已经支持Alpha通道,所以RGBA32/ARGB32格式纹理直接转成PVRTC格式即可。但目前也有不少团队为了使Android和iOS版本开发统一,其在iOS版本上也将其Alpha通道拆开,变成两种PVRTC进行处理。这种做法会增大内存,但好处是开发环境可保持一致,因此研发团队可根据自身情况来考虑是否采用。


资源管理

Q3:如果有一个AssetBundle A内容全是UI用的图片,另外一个AssetBundle B是一个UI的Prefab,在加载UI B的时候我为了节约加载时间,自己手动加载一下AssetBundle A,但是我发现UI B的加载速度并没有加快。所以想请教一下,当从AssetBundle里把这个Prefab GameObject拿出来的时候,它的初始化过程中是从哪儿读这些图片?

这是研发团队平时遇到的较为常见的问题。首先说明一下,如果AssetBundle B和AssetBundle A产生依赖,那么在仅仅加载AssetBunde B中的Prefab B_prefab时,其本身开销仅为B_prefab的加载开销,对于AssetBundle A中的依赖资源并无影响。但是在实例化B_prefab时,Unity引擎会去检查AssetBundle A中的依赖资源是否已经被加载好,如果没有加载好,则先加载AssetBundle A中相关资源,然后再实例化B_prefab。这其实就是大家经常遇到的初次实例化一个技能、角色时出现卡顿的主要原因。因此,如果大家想加快B_prefab的实例化效率,那么对于其依赖关系AssetBundle A中的相关资源,可提前进行预加载,从而减少B_prefab实例化时的相关资源加载时间。


资源管理

Q4:求教Mesh导入后这里的uv3和uv4是怎么回事?有的模型只有uv和uv2,有的有四套。
请输入图片描述

如果在模型导入时就存在 uv2,uv3,uv4,那么这是因为在建模软件中添加了这些顶点属性。一般来说uv3和uv4的使用较为少见,通常是用来配合特殊的Shader实现特殊的效果。而uv2通常被用于Lightmap,uv2可以在建模软件中添加,也可以在Unity中通过Generate Lightmap UVs的选项来生成。

资源管理

Q5:我从UWA的报告中看出我们的GC比较严重,里面有我们自己GC的地方(切换场景的时候),然后就是系统GC的。这个我们无法控制,那么有什么办法优化吗?我发现一个很尴尬的地方,如果我们不自己去GC,内存好像不会返回,但是GC又会引起卡顿。

一般来说,手动调用GC都不太必要,而切换场景时多数情况下会因为堆内存的大量分配导致系统GC的自动触发,但这里的卡顿相对可以接受(只是稍微增加了切场景的时间)。但在非场景切换的时间里,如果系统GC也频繁出现,那么就需要对脚本的堆内存分配进行严格的控制,可以通过查看堆内存分配的TOP10函数,逐个进行分析和优化,减少各个函数的累积堆内存分配量。另外,内存的下降与GC并没有十分的关联。开发者需要注意两点:首先,在Android平台上,GC无法降低Mono部分的总内存(只是把空闲内存变大);其次,Unity部分的内存是通过Resources相关的接口来释放的,GC的操作对这部分内存也没有直接影响(理论上只要引用某资源的GameObject被销毁,那么该资源就能被Resources.UnloadUnusedAssets卸载,因此和GC也没有直接关系)。


资源管理

Q6:场景切换完了后,我们发现上个场景的内容并没有卸载完毕,所以我们调用了Assetbundle.Unload(true)这个函数,紧接着我们调用了UnloadUnusedAssets+GC操作帮我们清理资源(如果不调用后续两个操作的话,我发现内存曲线并没有得到明显下降),而这个时候GC次数又高了,GC次数高了CPU降低,不去GC内存得不到完整释放。我在你们网站上看到说不要开发者频繁去使用UnloadUnusedAssets+GC这个操作,所以希望得到一些帮助。

通过LoadLevel等API来切换场景时,Unity会自动触发Resources.UnloadUnusedAssets的操作,但在切换完成后再次调用Resources.UnloadUnusedAssets来确保卸载完全的做法也是较为常见的,而我们网站上主要是建议开发者不要在其他的时间点来手动调用Resources.UnloadUnusedAssets,在切换场景时还是可以酌情调用一次的,另外对于大场景的MMO类型的游戏,因为切换场景的频率较低,也可以考虑每隔几分钟来手动触发一次Resources.UnloadUnusedAssets来降低内存。而GC的话,则不建议手动调用,即使是在切换场景时。


资源管理

Q7:我们没有使用AssestBundle的方式,使用的都是在Resources路径下的Load,请问Resources目录下的所有内容都会加载到内存里吗?如果里面东西多,是不是会导致占用内存过高?

不会,Resources.Load也是即用即加载,但就目前我们统计的结果来看,Resources文件下的资源越多,其生成的ResourceManager内存占用也越大,研发团队可在Unity Profiler中通过Take Sample来进行查看。


资源管理

Q8:请问下,Unity 5.3.3版本,Android用AssetBundle.LoadFromFile读取Application.streamingAssetsPath目录下的AssetBundle文件,用什么样的地址?

在Unity 5.3之前,安卓上加载 StreamingAssets 目录下的 AssetBundle 时,可以直接使用 Application.streamingAssetsPath 作为目录路径,而Unity 5.3之后,通过新增的LoadFromFile接口加载AssetBundle时,则需要改为 Application.dataPath+"!assets。具体也可参考雨松的博客http://www.xuanyusong.com/archives/4033。


资源管理

Q9:Font Texture 资源是如何生成的,因为我发现好像有重复的出现,如何优化呢?

这是Unity为动态字体自动产生的纹理,一般来说不用特别关注。即使重复出现,里面的内容一般也是不一样的(内容即屏幕上显示的文字)。

资源管理

Q10:我们用AssetBundle打包。A包里面有一个界面,C包里面也有一个界面,这两个界面用到了相同的图集,我把图集单独打成了B。游戏实例化的时候,我先加载B,然后加载A,然后手动LoadA里面的一个对象,实例化一个界面。然后释放A和B,后面当需要另外一个界面的时候,我又加载B,然后加载C,然后手动LoadC里面的一个对象,实例化一个界面。现在问题是,B里面的图集,我是不需要手动Load的,这个依赖关系是Untiy去做的,但是按照我之前的做法,B里面的图集会出现2份吗?

按照上述做法,如果之前从A中加载且实例化中的资源没有销毁并且没有调用UnloadUnusedAssets操作的话,B中的图集资源是会出现两份的。其主要的核心点是,AssetBundle B属于公用资源,在后续还有引用的情况下,它不应该被频繁加载和卸载。在第一次卸载A和B时,其由B而加载图集就已经变成了内存中的游离资源,第二次加载B和C时,Unity引擎并不会将B与之前的游离图集资源进行管理,而是再加载一份图集资源出来,这样内存中就形成了两份图集资源。因此,对于这种情况,我们的建议是:

  1. 对于公共依赖的AssetBundle,除非后续有较长时间不再使用,否则不建议加载之后立刻Unload;
  2. 对于由Unload AssetBundle而导致的游离资源,可尝试通过UnloadAsset/UnloadUnusedAssets API来进行清理,但后者需要该资源本身不再被引用;
  3. 通过UWA测评报告中的“资源管理界面”时刻关注每个公用AssetBundle的加载和卸载情况,以免出现频繁加载和卸载的问题。
    请输入图片描述

冗余位技术在SAR ADC中的动态误差恢复机制解析 本文深入解析了冗余位技术在SAR ADC中的动态误差恢复机制,详细介绍了其基本概念、动态误差产生原因及冗余位的容错空间设计、时序松弛策略和数字校正算法。通过实际电路设计案例和数学建模,展示了冗余位技术如何显著提升ADC的精度和能效比,同时探讨了未来发展方向。 阅读详情

相关推荐

DAZ STUDIO 快速渲染技巧

DAZ STUDIO 快速渲染技巧: 本文将向您展示几个快速渲染技巧。您将学习如何使您的Daz Iray渲染和照明在Daz工作室内更快。 当你有一个大场景,这可能需要很多小时进行渲染。 但是如果你想大幅度降低渲染时间呢?这篇文章的提示应该能让你达到这个目标。 首先,我们需要弄清楚一件事——没有“完美的环境或设置”这样的东西。是因为渲染设置是高度个性化和主观性的东西,这主要取决于场景和硬件。如果你有一个功能强大的计算机,你可以允许更多的低渲染时间,反之亦然。因此,一切都取决于您尝试渲染的对象和机器。

DAZSTUDIO的博客 9652

Shader相关笔记

Shader中的texcoord –[[ texcoord取得是模型纹理的第一二三四等等纹理坐标 TEXCOORD(n)是指纹理坐标,float2, float3, float4类型。n是指第几组纹理坐标。 texcoord就是存在顶点里的一组数据, 我们可以通过这组数据在渲染的时候进行贴图采样 ]] Unity最多支持几套UV –[[ unity一共支持4套uv,在shader编程中,分别叫UV0, UV1, UV2, UV3,而在c#编程中分别叫UV, UV2, UV3, UV4 float2 ..

qq_25670983的博客 3640

用Bus Hound和MIDIOX抓包分析USB MIDI数据流:从硬件接口到软件解析的完整实战

本文详细介绍了如何使用Bus Hound和MIDIOX工具抓包分析USB MIDI数据流,从硬件接口到软件解析的完整实战过程。通过解析MIDI协议、捕获Note On/Off事件、控制变更消息等实例,帮助开发者深入理解音乐数字接口的底层通信机制,并提供了常见问题的解决方案和调试技巧。

weixin_42692935的博客 406

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

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

起个名字好难啊 1352

zynq7020的arm A9核降频实录

zynq arm9 cortex a9 降频

qq_40011737的博客 8766

反制反心理特征的研究

抓牛股

m0_58032574的博客 909

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

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

起个名字好难啊 472

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

孤独的单刀 5476

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

资源管理 Q1:iOS上PVRTC不支持NPOT的贴图压缩,在Android上可以用ETC2,但在iOS上不能压缩,内存消耗大。请问在iOS上有没有好的处理方案? ETC2仅能在支持OpenGL ES3.0的手机上进行使用,请研发团队在使用前谨慎考察支持ES3.0的手机在国内的覆盖范围。 PVRTC不支持NPOT的贴图压缩,这是Apple规定的,上层应用无权对此更改。我们仅能建议

起个名字好难啊 606

分级 API Key 的使用案例

分级 API Key 的使用案例 1. 背景介绍 1.1 问题由来 随着网络服务的普及,API(Application Programming Interface,应用程序编程接口)成为了连接不同系统和应用的关键桥梁。API Key(API密钥)

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 1022

【红外DDE算法】一种应用于高动态范围红外可视化的算法

【红外DDE算法】一种应用于高动态范围红外可视化的算法 - 这个算法背后的动机 - 展示这个算法的流程 - 然后讨论各个可调参数的意义。

sunwindl91181的博客 1683

FreeRTOS学习笔记十二【资源管理】

FreeRTOS学习笔记十二【资源管理】目的资源管理的必要性关键部分代码与暂停调度器基本的关键部分代码暂停(或锁定)调度程序vTaskSuspendAll()xTaskResumeAll()互斥锁(和二值信号量)xSemaphoreCreateMutex()优先级反转优先级继承死锁递归互斥锁互斥锁和任务调度关守任务 目的 何时需要资源管理以及为什么需要资源管理。 什么是关键部分代码。 什么是互斥...

qq_25370227的博客 1568

PX4实战(十):PX4导航模块(Navigator)详解

本文将对 PX4 固件 v1.14.3 版本中的 Navigator(导航)模块进行详尽的技术剖析。作为飞行控制栈中的高层决策核心,Navigator 模块承担着将抽象的任务指令转化为具象的底层控制设定点的关键职责。本文基于对 src/modules/navigator 目录下源代码的深究研究与架构反推,详细阐述了该模块的文件组织结构、基于状态机的控制逻辑、uORB 异步通讯机制、核心任务模式(Mission)与返航模式(RTL)的实现细节,以及地理围栏(Geofence)与任务可行性检查(Feasibil

PX4-SLAM-PNC 669

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

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

起个名字好难啊 935

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

编程小生的专栏 884

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

游戏编程之十二 资源管理

这里所说的资源管理不仅仅只是资源打包,它包括了定义和压缩,打包,以及各种性质定义和操作接口. 本章只介绍图像资源管理. 定义文件名:IMGLIB.DAT 在调试版本中我们使用的脚本语言,只有在发行版本中才将其加密和压缩. 文本举例: PATH ".\IMGLIB\" //放置图片的路径,在调试版本中,图片是不打包的,发行

张晨光老师的播客 1052

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

起个名字好难啊 1200

【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

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

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

起个名字好难啊 585

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

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

zweiluan的博客 1071
上一篇: Q&A——资源管理(十一)
下一篇: Q&A——资源管理(十三)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值