Unity性能优化系列—加载与资源管理

491 篇文章 90 订阅
订阅专栏

我们曾在四年前对于Unity的主流模块的性能优化知识点逐一做过讲解,俗称“小白版”。随着这几年引擎本身、硬件设备、制作标准等等的升级,UWA也不断更新优化规则和方法并持续输出给广大开发者。作为"升级版"的性能优化手册,【Unity性能优化系列】将力图以浅显易懂的表达,让更多开发者受用。本期就将分享加载与资源管理相关的知识点。

经常会有一些团队询问:为什么我的游戏加载这么缓慢呢,能否做到像***游戏一样秒切场景呢?游戏发烫又是什么原因呢?为了防止大家辛苦做出来的游戏在真机上卡成翔或者秒变暖手宝,我们要充分利用好UWA报告中的加载模块和资源管理模块,下文我们将来逐步分析。

一、加载模块中的关注项

这里我们先来科普一些加载相关的关注指标。下图是Overview报告中的加载模块的页签,我们看到左边有这么几项重要参数指标:

 

1、Loading.UpdatePreloading
这是Unity引擎最主要的加载函数。该项一般在切换场景时或异步加载资源时开销较大。一般来说,加载资源越多越复杂,则其Load.UpdatePreloading的耗时也越大。

该函数优化前,建议先定位其耗时占用瓶颈。通过报告的CPU调用堆栈即可查看该函数在运行过程中的详细堆栈走势,对函数的耗时分配一目了然,从而有的放矢的进行优化。

 

2、Resources.UnloadUnusedAssets
该函数指卸载未使用的资源,开销主要取决于场景中的Assets和Object的数量,数量越多,则耗时越高。在性能优化时,除了耗时峰值之外,我们还需关注该函数的调用次数。

一般情况下,场景切换过程中, 引擎会自动调用一次,UWA建议在10~15分钟的时候手动调用一次。

同时,研发团队可尝试在游戏运行时,通过Resources.UnloadAsset来去除已经确定不再使用的某一资源,该API对于去除单一资源的效率很高,同时也可以降低Resources.UnloadUnusedAssets统一处理时的压力。

下图为报告中加载相关函数的堆栈信息,在堆栈中GarbageCollectAssetsProfile是由于调用了Resources.UnloadAssetsUnused导致的,如果此项占用过高,则需要关注是否主动调用Resrouces.UnloadUnusedAssets过于频繁。

 

3、GC.Collect
GC调用频率主要受堆内存影响,当函数的堆内存分配量越多、越频繁,GC就会越快到来。所以当我们的GC.Collect函数的调用频率较为频繁(如下图所示),特别是随着游戏运行时间增加,越来越频繁时,就需要我们留意是否存在高分配、频繁分配堆内存的函数操作了,这部分就可以借助GOT Online的Mono模式排查是否有Mono分配过快或过高的现象。

 

4、Instantiate

这里统计的是资源实例化的耗时,当项目的资源越复杂、实例化数量越多,卡顿感就越明显,但这部分往往是被大家容易忽略的,那UWA是如何处理好这部分的问题呢?下文我们将结合UWA真人真机测试报告中【资源管理】模块来进行具体讲解。


二、资源管理

这里的资源管理讲的是资源的调用频率、耗时等策略,因为影响加载体验的无非两个角度:加载的频率和每加载一次的耗时。在真人真机测试的报告中,我们可以看到【资源管理】标签后,包含以下检测项:

这么多功能,我们要关注哪些细节呢?说下几个核心点:

1、关注耗时较高的加载
无论是AssetBundle还是资源加载,耗时较高的都需要重点关注。这里我们打开一个资源加载的页签,可以看到下方是整个运行过程中的资源调用详情,最后一栏是耗时。

在资源具体信息中,勾选某个资源,就可以看到它在运行过程中的调用细节。对应上面的截图,我们可以进一步排查下这个AssetBundle加载是否需要那么多耗时。

 

2、短期时间内调用次数密集的重点关注
无论是AssetBundle还是资源加载,都要关注加载的频率。通常对于频繁加载的对象,我们可以通过建立缓存池的方法,先加载一次后将其加入缓存,后续就无须进行加载了。

如下图中,这些频繁加载的AssetBundle,可能原来有每次5ms或者50ms的耗时,后面可直接为0

这里再提下,我们也需要留意一帧内相同资源被多次加载的问题。
如下图,这一帧里调用5次,这个是不对的。

 

3、留意不存在资源

在资源加载的列表中,有的项目会出现【不存在】资源的情况,说明这些资源都是由于不在指定路径下导致加载失败的资源。一般情况下,这类资源是伴随着版本迭代,进行删除/迁移后,没有修改/注释对应的代码导致的。

加载这些【不存在】资源仅导致了一小部分CPU开销,但更重要是,排查这些【不存在】可以避免逻辑上的问题导致闪退和卡死等现象。

4、频繁实例化/Destroy
操作次数较高或耗时较高的资源。频繁的Instantiate会造成一定的堆内存分配,从而会加快系统调用GC的频率。更重要的是,频繁的实例化会造成CPU耗时产生一定的峰值,导致游戏的流畅性受到影响,所以这部分也是我们需要关注的。

对于这种频繁实例化的资源,通过缓存池复用实例化次数过多的GameObject,进而减少GameObject实例化的耗时。

5、Activate和Deactivate
这个排查方式与实例化是类似的,主要关注调用频率和耗时。

对比Activate和Deactivate的调用次数,因为如两者相差过大,说明存在无用的Activate/Deactivate操作。

例如,某个资源的Activate操作次数非常多(如下图中的Gold_2和Gold_4),为什么次数那么高?是否有必要呢?我们可复制该资源名称,在Deactivate资源列表中进行搜索查看是否确实需要这么多次状态的激活。

Gold_2的Deactivate

Gold_4的Deactivate

这说明相差的1万多次的Deactivate操作都是无意义的。

对于以上这种资源,我们可以通过在C#端创建一个特例缓存,记录这个对象的Active的状态(True or False),在调用SetActive之前,先判断一下当前的状态是否已经是想要切换到的状态,如果不是才调用。这是因为SetActive的操作是会从C#走到C++层的,所以我们在C#进行状态判断可以减少这种跨语言的操作,从而避免不必要的耗时。

6、AssetBunde驻留优化
之所以关注这个参数,是因为它影响了项目运行过程中的内存占用,要知道Unity内存一部分是由AssetBundle驻留导致的Serializedfile相关的,一般来说我们建议控制的AssetBundle资源数量在1000以下。考虑到这个指标和项目本身的复杂度有关,所以大家需要自身做些实验,好权衡CPU和内存之间的天平。

资源的加载可以使用缓存池的方式来进行优化,AssetBundle的加载也是类似的。对于同一个AssetBundle进行频繁的加载通常是不合理的(如下图所示),对于频繁加载卸载的AssetBundle,建议将其加入缓存,常驻于内存中。

 


三、Shader.Parse/CreateGPUProgram

Shader资源如果解析加载策略不当,也会造成CPU开销较大。由于Shader的内存占用很小,但是加载的耗时又比较高,所以我们建议在理想情况下是在项目开始运行时就把所有的Shader资源全部加载完成,然后缓存。

1、Shader.Parse

该函数的耗时主要是由于Shader的加载和解析,通常是由于Shader的重复加载导致的,在优化时要看一下具体的Shader加载情况,具体可以从以下三点着手:

(1)避免使用Standard,使用其他Shader代替Standard Shader。注意排查是否因为模型导入而导致Standard Shader被加载进入AssetBundle中;

(2)解决Shader冗余问题,这部分可以结合Shader的内存走势查看,如下图所示。

如果大家的Shader资源并不是缓存在内存中的,切出场景时则会释放Shader,切入场景会加载Shader,导致了大量的重复开销。解决这个问题,只需要把Shader进行剥离,通过依赖关系将其做成单独的AB,然后加载后就缓存住不卸载,那么后续就不需要再对此Shader进行加载了。

(3)减少Shader的Keyword。
研发团队可以参考下面的资料:
《一种Shader变体收集和打包编译优化的思路》
https://answer.uwa4d.com/question/5da86670e84db43d6efbda72

2、Shader.CreateGPUProgram

该API的CPU占用是Shader第一次渲染时创建GPU程序的耗时,其耗时与渲染Shader的复杂程度相关。对此,建议研发团队将Shader通过ShaderVariantCollection进行加载,并在加载后并Warmup,从而避免Shader在游戏运行时产生Shader.CreateGPUProgram的耗时。

以上就是加载在优化时需要关注的一些问题,如何操作还需要大家结合项目实际情况,同时结合UWA的线上测评服务可以快速地帮助大家定位到性能瓶颈。

 

Unity笔记 资源 内存优化
fjl2007的博客
07-15 1143
unity本机堆(Native Heap)
Unity性能优化-官方白皮书/手册 2021版
04-04
Unity官方推荐的性能优化的方方面面
unity大场景优化
09-20
文档资料:unity大场景优化;unity大场景优化;unity大场景优化;unity大场景优化;unity大场景优化;unity大场景优化;
更新!!!Unity移动端游戏性能优化简谱
最新发布
UWA—简单优化,优化简单!
04-26 736
从UWA性能优化工具开始的游戏研发“工业化”实践。
Unity3D优化:分场景烘焙,综合场景
Tel17610887670的博客
01-26 3358
需求: 在游戏开发中,我们经常会遇到以下情况: 1,烘焙场景太大,每次只需要烘焙部分; 2,资源热更,需要分步; 3,场景跳转太慢,需手动处理资源; 4,网页游戏不方便场景跳转。 诸如此类问题,就需要将资源分配到不同的小场景分别进行烘焙,最后统一到综合场景中进行合并。 解决思路: 这里主要参考了这两篇博客:Unity在一个场景中使用其他场景烘焙的物体,Unity Lightmap使用总结。 其中第一篇博客提供了解决思路,但年代久远;第二篇不太完整,所以取舍之后做出如下解决方案.
unity优化小结
llsansun的博客
11-05 2746
有一些ui上挂了刚体,但其实ui是没必要用刚体的,增额外的组件会增额外的开销。 移除ui图片的read/write,mipmap 移除了一些没用的shader(还有一些没敢移除) 分别展示背景,人物和ui。主人物和背景和ui好后就可以移除loading了。因为大世界中你不敢保证有多少个角色要,当然后期维护要上遮挡剔除,把屏幕外的东西移除掉 一些compoment的updat...
unity项目优化----游戏项目场景优化思路
SunRaIN_的专栏
04-26 267
第一你得优化美术,减少模型面数。 第二你可以采用剔除遮罩技术,也就是传说中的OcclusionCulling技术。 第三你可以在unity中烘焙场景,优化灯光。 第四你可以自己人工的去写lod脚本,相机离角色多大距离内就成模型远了就成贴图。 第五你可以采用脚本分房间或者分区域,走到a房间就a房间的对象,否则全部active=false,的瞬间会卡,你可以写异步。 ...
Unity性能优化.pptx
01-05
Unity性能优化.pptx
Unity资源管理AssetBundle
06-09
Unity简单实现资源管理类,使用协程AssetBundle,支持优先级队列,尽量考虑新能。
Unity性能优化 - 动态图集 工程
04-14
package包含DynamicAtlasManager.cs、DynamicAtlasSprite.cs和DynamicAtlasTest.cs等资源Unity动态图集的package包的描述: 1. DynamicAtlasManager脚本:这个脚本文件是实现动态图集的核心脚本,其中包含图集...
Unity 性能优化(2021版)
02-24
资源文档描述了Unity优化可使用的工具及优化方面的参考,对于新手优化或者优化经验不足的初中级开发者提供优化思路。
Unity3D多个异步场景资源 简洁漂亮的画面
04-24
这个是一款 Unity3D异步场景资源 ,界面简洁漂亮的画面,内含多个样式,提供给广大的Unity3D学者研究。
Unity资源文件优化
爱打游戏的肥宅猿
03-18 286
Texture Model Animation Shader ShaderLab内存占用过大 项目中可能大量使用了Standard shader,具体内容可看UWA分享的文章; 项目中Shader的变体数量太多,如何控制变体数量可看这篇文章; ...
Unity大密度建筑场景解决方案
海洋个人博客
09-07 1万+
现在虚拟城市仿真,以及军事仿真项目越来越多,开发此类项目,首先面对的一个比较棘手的问题是内存管理,城市中的建筑物特别多,这些建筑物的面数和贴图都要被到内存中的,内存有自己的峰值,超过了就要崩掉,所以内存的优化是必须要面对以及解决的问题。 Unity官方提供了Occlusion Culling的裁剪操作,网上有很多文章对它做了相关介绍,因为它是Unity自身提供的,对于我们程序员来说就是一个黑盒...
Unity场景进度条优化
weixin_44876165的博客
09-22 717
Unity场景进度条优化 1. 场景进度条优化 Du先生开发游戏 **为了增游戏体验,我在日常会对进度条进行优化。通常通过异步的方式场景,从而获取场景进度。为了增游戏体验,会使用两个变量一个变量接受场景的实际进度,另外一个用来接受UI显示进度。使用显示进度向实际进度靠近的方式显示进度条。主要代码如下: public Slider slider_loader; private void Start() { StartCoroutine(LoadSliderSy
Unity】 场景优化策略
发布unity,三维模型的相关内容
11-10 1076
使用GPU Instancing可以将多个网格相同、的物体合并为一个批次,从而减少的次数。这可以提高性能和渲染效率。GPU instancing可用于绘制在场景中多次出现的几何体,例如树木或灌木丛。
unity3d的优化场景技术LOD+IOC
weixin_33982670的博客
01-08 953
  一、unity3d的优化场景技术    LOD+IOC 遮挡剔除(occlusion culling)其实就是在摄像机范围内的物体才被渲染出来,没有在视野范围内的,统统关掉渲染,这样能让性能大大提高。   IOC技术就是实现的这个功能,叫做无缝拼接,原理其实就是摄像机的所有范围内,每一帧都发射许多的射线,与射线碰撞器发生碰撞的物体(此物体必须挂有IOC的脚本和有碰撞器)就会被渲染出来。当镜...
Unity大场景数据及优化方案
热门推荐
海洋个人博客
08-07 3万+
前段时间,有几个虚拟仿真公司跟我请教关于大地形的优化问题,它们使用的引擎都是自己研发的,引擎对于开发者来说,大同小异,它们的基本构造是一样的,关键是在于解决问题的方法,正是基于这个前提写了这个课程,希望给读者提供一些解决问题的思路。 目前,大地形动态已经成为当前游戏开发或者虚拟仿真领域必须要解决的问题,尤其在虚拟军事仿真领域,由于要涉及到大兵团虚拟演练作战,这对仿真真实性要求比较...
Unity 3D 运行状态下 资源与优化 之 AssetBundle
songhuanfei2017的博客
11-12 598
在网络游戏中,可能需要在运行时再在并更行资源,而Unity提供了AssetBundle组件,可以将指定的一部分资源构建成AssetBundle文件。如果需要下,那么需要将这些AssetBundle文件上传到CDN上。 //--设置AssetBundle 如图,在Project视图中选中需要构建AssetBundle的资源,在Inspector面板右下角可以写入它的资源名以及资源的后缀名...
unity 性能优化
08-29
2. 资源管理:合理使用资源,避免过度和占用内存。及时释放不再使用的资源,避免内存泄漏。 3. 碰撞和物理优化:减少碰撞检测的复杂度,使用简单的形状代替复杂的碰撞器,使用物理引擎的最佳实践来优化性能。 ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Unity性能优化之内存篇(上) 13590
  • Lua性能优化—Lua内存优化 13354
  • 【Unity】那些你不得不用的好插件! 12687
  • 帧同步优化难点及解决方案 12409
  • 关于Unity加载优化,你可能遇到这些问题 10370

分类专栏

  • 厚积薄发| Unity优化 491篇
  • 博观约取| 性能案例 11篇
  • 充电一刻| UWA优化日 55篇
  • 万象更新| UWA新功能 94篇
  • U Sparkle| 精华来稿 104篇
  • 惟学无际| 学术论文 9篇
  • 求知探新| UWA“方法论” 5篇
  • 博物纳新 35篇
  • UWA STAR 6篇
  • UWA学堂 110篇

最新评论

  • Unreal游戏GPU参数详解,游戏性能优化再升级

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/618632051。

  • Unreal游戏GPU性能优化检测模式全新上线

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/618623695。

  • PlayerSettings.WebGL.emscriptenArgs设置无效的问题

    普通网友: 引领技术潮流,是不可多得的好文,十分值得借鉴和参考。期待博主未来能够持续分享更多好文【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 微信小游戏性能优化经验帖

    普通网友: 文章内容通俗易懂,适合不同层次的读者。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 更新!!!Unity移动端游戏性能优化简谱

    普通网友: 干货满满,实用性强,博主的写作风格简洁明了,让人一目了然。文章涵盖了很多实用的知识点。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • WorldSpace下的合批策略与ScreenSpace有什么区别
  • UWA DAY 2024 正式启动|创新潜藏无限可能
  • Text Mesh Pro图文混排如何对任何图片都能实现
2024
05月 8篇
04月 9篇
03月 8篇
02月 9篇
01月 6篇
2023年116篇
2022年125篇
2021年102篇
2020年111篇
2019年146篇
2018年93篇
2017年160篇
2016年17篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司漳州外贸网站设计公司吉祥优秀网站设计推荐本溪网络推广价格钦州关键词排名包年推广价格鞍山百姓网标王公司龙华网络广告推广价格潮州高端网站设计哪家好同乐seo优化哪家好赣州建设网站怒江企业网站设计哪家好常州网站设计推荐永湖网站seo优化多少钱河池百度网站优化排名公司玉树网站优化公司仙桃模板推广价格观澜关键词排名包年推广报价双龙百姓网标王嘉兴企业网站建设哪家好张北百度网站优化推荐百色网站建设设计哪家好池州网站改版报价南平关键词按天扣费价格金华企业网站设计报价湛江建设网站庆阳设计网站报价昌都关键词按天计费多少钱佛山seo网站推广公司铜仁关键词排名报价焦作英文网站建设哪家好贺州关键词排名包年推广多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化