Unity的资源管理是一个比较宽泛的知识体系,包含了内存、加载、AssetBundle、热更新等方面。选择任何一个方向都可以找到很多内容,那么面对市面上众多的参考资料,我们又该从何入手呢?本文结合UWA学堂以及Blog的文章整理汇总了《Unity引擎资源管理模块知识Tree》,分为“内存管理”、“本地资源检测”、“打包与热更新”、“资源组织”、“加载模块”以及“UWA工具篇”六大类。
无论对于从业者还是正在读大学的技术萌新,学习的有效时间和个人时间都是有限的。高效学习者最在意的是时间的价值,一个需要体系化的知识地图就显得尤为重要。为此,我们也推出过《Unity引擎渲染模块知识Tree》和《UI开发与优化知识Tree》,欢迎大家按照自己的兴趣和需要参考取阅。
一、内存管理
Unity引擎的资源加载和内存管理一直是项目开发的重中之重。对此,我们从定性和定量两方面来分析各种资源的加载耗时及其对于内存的影响。通过本次报告,我们希望通过研发团队可以对加载模块和内存使用达到一个全面的、数字化的认识,从而达到高效定位和优化相关的性能问题。
基于UWA测评过的大量性能数据,我们对项目运行时的加载模块和内存模块进行了全方位的解析。结合大量的实际案例,让大家了解和掌握加载模块和内存模块在开发过程中需要注意的核心问题和相应的解决方案,主要包括:
- 如何提升场景切换效率
- 如何完善运行时的资源管理
- 如何快速定位内存瓶颈
- 如何快速查找内存泄露
《深度剖析PersistentManager.Remapper内存占用》
游戏的内存占用一直是困扰大家很久的问题。大部分是由于资源过多过大、资源格式使用不当等问题导致的,这个改起来的效果立竿见影,然而有些游戏则是相当重度:海量资源、各种玩法......仅仅靠捡漏资源格式来判断是否压缩、尺寸过大等方面还不足以达到理想的效果,我们需要权衡各个方面来优化内存。
本课程描述了一个完善的AssetBundle模块规划,从而降低内存占用。通过学习,你将了解到降低内存占用的新方法。
堆内存管理是一个让人头疼的问题,贯穿游戏开发和功能迭代过程的始终。本课程围绕堆内存的内存优化,将这个问题进行细分,包括内存结构、容器、对象池、不安全代码,由浅入深地讲解内存优化的原理和技巧,并提供了Protobuf优化和字符串操作优化等案例。使用结构代替类、缓存对象和使用非托管堆等重要技巧是本课程的重点,非常适合大家提升内存优化方面的工作技能,对GC感兴趣的同学们不要错过啊。
Lua的使用存在造成C#堆内存泄漏的问题。本文作者举了三种项目中的Lua变量没有被LuaGC掉的情况并给出了问题分析及应对方案。
- Lua对象是全局变量,直接放在_G中
- Lua对象被一些全局的Table引用
- Lua对象的function字段被赋值给了C#的事件/委托
通过修改,Lua引用已经Destroy对象导致的堆内存泄露问题基本上修复完毕,最后可通过自己的使用的工具来验证和定位问题。
本文是作者结合自身在Lua性能方面优化的一些经验,主要是和大家分享拿到原始数据后,如何处理过滤数据、信息的经验,从而更快更准确地定位问题。文中用到的技术并不难懂,相信大家能够快速掌握。
![](https://i-blog.csdnimg.cn/blog_migrate/4b27f230facd6b55d5ad34cabf7b2696.png)
《性能优化,进无止境——内存篇(上)》
《性能优化,进无止境——内存篇(下)》
无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重。上篇主要从资源内存占用、引擎模块自身内存占用和托管堆内存占用三部分展开对内存开销的解释;下篇主要从内存泄露、Mono无效堆内存开销和资源冗余三部分展开对内存分配的解释。优化永远没有统一的标准方案,只有最适合你项目的方案,希望大家可以活学活用,不要放过任何一处让你感觉“不对劲”的地方。
二、本地资源检测
在项目开发过程中,制定合理的资源规范,力求在不牺牲画面表现的同时,有更小的包体、内存占用和更好的性能。在制定了规范之后,又该如何保证规范不是一纸文档,而是被真正落地?
本课程重点介绍了作者在开发中积累的一种实践方案,采用导入器和日报工具的方式来自动化的确保规范被执行。此外还阐述了形成这些规范的过程中的一些思路。
《Jenkinsfile基础与UWA本地资源检测组件接入实战》
本课程是UWA本地资源检测组件接入的配套课程,先从Jenkinsfile的基础语法、编排和参数构建方法讲起,带您掌握Jenkinsfile的声明式流水线语法,驾驭Jenkins工作流,最终您可以快速进入UWA本地资源检测组件接入的应用实战。当然Jenkinsfile的应用十分广泛,您也可以应用到其他领域,简化工作流程,提高效率。
三、打包与热更新
自动化研发流程在目前各大团队都有很大的需求,Jenkins是大部分研发团队的首选。本课程系统地讲解了Jenkins的搭建方法和使用方法,课程附带工程文件和源码,可以让研发团队快速上手。
热更新是游戏开发中非常重要的基础功能,但实际操作中,却是一件麻烦事。版本号的管理、更新包的打包方式、检测方式、冗余的控制……有很多的细节需要考虑。本文作者结合实际上线项目的经验,与您分享每个关键点的决策、备选方案的取舍过程、以及操作技巧。如果您正在学习热更新技术、或是在游戏开发中碰到这类问题,本课程将是您事半功倍的好选择。
针对主流热更新技术(基于C#和Lua)进行性能对比,以期让开发者找到最适合项目自身的应用方案和实现技巧。内容主要包括:
- 主流热更新技术简介
- 各方案原理、性能对比、适用场景
- Lua性能瓶颈分析及其优化技巧
四、资源组织
1. AssetBundle
《揭开AssetBundle庐山真面目(一)》
《揭开AssetBundle庐山真面目(二)》
(一)讲解Unity 4.x版本下AssetBundle的依赖性打包功能,来实现更新资源过程中的局部更新;(二)继续前面的话题,讲解Unity 5.x及其以后版本。
《给调皮的AssetBundle加上面向对象式加载调试管理》
本文从加载、调试、异步、垃圾回收、路由5个方面,介绍了基于面向对象思想设计的用来进行AssetBundle加载的Resource Module管理器。
本文从管理机制的角度出发,介绍了其资源加载和卸载的原理。最后还给出了UWA在API选择上的推荐方案。
《Unity 5.x AssetBundle零冗余解决方案》
笔者参考Unity官方介绍资源管理机制和Unity序列化的一些文章做的AssetBundle打包相关的优化,成功实现了零冗余打包,非常落地的实践经验供大家参考。
本文讲解AssetBundle的安全问题,如何对资源进行加密,主要讲解了偏移设置的方法,并附上了代码和演示效果。
2. Addressable
《浅谈Assets——Unity资源映射》
从Unity引擎Asset和AssetBundle的基本概念讲起,并介绍了Assets的识别、引用,以及资源生命周期的基础概念。
本文讲了Resource和AssetBundles在开发中的优劣势,以及各自的痛点,又介绍了一种替代方案AssetDataBase。
本文先介绍了AssetBundle的基础原理,并且讲解了从加载AssetBundle到加载Asset的各种过程以及底层API实现等细节内容;随后讨论在实际使用AssetBundles的过程中遇到的问题以及解决方案。
Unity在2018版本中推出了Addressable Assets System的预览版本,并在2019的版本成为了正式版本,可以用于生产了。本文共分为五个小节,首先从六个方面介绍了Addressable Assets System,然后讲解了Addressable Assets开发周期、内存管理和托管服务,最后介绍了Addressable分析器。
以上四篇属于Addressable系列的基础篇,共包含了9个小节,适合Unity开发的初学者。
本课程讲解了Addressable使用、框架原理和扩展思路,带您全方位了解Unity的新一代资源管理系统。内容以全面、系统为特点,不仅讲解细致、反复推敲,而且附赠源码。如果您是初级开发者,可以先对以上四篇内容进行学习,供您完成进阶。
本课程通过对Addressable System的源码解读,带着大家理解Addressable系统的实现,并结合作者在项目中的实践经验,全面讲解Assets资产的加载、释放、配置管理等功能,有助于您快速深入了解Addressable系统,了解项目实战的思路和方法,附赠Demo工程源码。
五、加载模块
以上四篇是关于加载模块的深度解析,以纹理、网格、Shader和动画四个方面展开描述,根据每种资源进行具体实验展示并进行分析给出优化建议,以期让大家对项目的加载效率有更加深入的认知,并提升对加载模块的掌控能力。
六、UWA工具篇
Pipeline——本地资源检测
《New | UWA本地资源检测正式上线》
研发团队通过简单的部署,就可以把人力从繁冗复杂的操作中解放出来,自动化检测项目的资源、代码和一些设置问题,提高研发效率。
云端测试产品——在线AssetBundle检测
《这一次,吃透你项目中的每个资源!》
反馈资源的使用情况,包括具体资源信息、依赖关系和冗余程度等,优化资源量过大、包体过大的问题,并且有效提升加载资源的效率。
以上是就是本期为大家梳理的Unity引擎资源管理模块知识Tree,作为体系化的知识,我们希望大家能掌握背后的逻辑与原理,结合学习方法论并反复实践,能够在自己的项目中更高效地进行资源管理。同时也欢迎大家向我们投稿,交流行业内的技术知识。
扫描上方二维码即可下载“在理”APP,学堂课程在线看