一小时极速掌握游戏资源远程热更新

13 篇文章 1 订阅
13 篇文章 4 订阅

版权声明

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
  • 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

一、前言

在这里插入图片描述

  • 今天这篇文章一共分为两个部分,第一部分为游戏的远程热更新,第二部分为实现一个商业项目的资源热更新。
    在这里插入图片描述

二、三十分钟实现资源/代码远程热更新

在这里插入图片描述

  • 首先我们作一个约定,第一点我们会使用unity最新的一套资源管理的解决方案,叫做AddressableAssets。AddressableAssets是unity官方现在主推的一个资源管理的插件包,它的目的就是用来取代unity传统的AssestBundle简称AB包的资源管理方式。

  • 使用Addressable这个插件有什么好处呢?

  • 大家知道我们在过去使用AssestBundle进行资源管理的时候,他的痛点很多。第一个是这个资源管理它采用一种叫做地址引用的方式。

    1. 第一点好处,解决了资源的重复引用问题。原来大家如果有过AssestBundle编程经验,大家就知道原来去用AssestBundle去管理一个资源。比如说有一个资源A,他引用了一个资源B,还引用了一个资源C的话。这个时候我要自己处理资源。在A进行加载之前,必须要把B和C给它加载进来。而如果我们使用Addressable这样一个插件,我们就不需要管理这些复杂性。他的地址的引用是很简单的,我只要指定我要加载的资源名A,然后他自动去把B和C给它加载进来。这个是我们使用Addressable的第一个好处.
    2. 第二点好处,自动资源引用计数机制。比如说我举个例子,还有一个好处就是资源的卸载,过去我们在使用AssestBundle进行资源管理的时候,资源卸载也是一个耗时耗力的过程。因为所有的资源卸载都需要你自己去负责。而现在我们使用AssestBundle,它自动在我们资源引用计数为零的时候,就自动把资源卸载掉。
    3. 第三点好处,完善的工具界面。大家使过过AssestBundle的同学都知道,我们使用AssestBundle的资源管理界面是需要自己去搭的。比如说我要管理某一个文件夹里面的资源,打包成一个资源包。如果我想通过可视化的方式去指定哪个文件夹打到哪个资源包。我要么编写代码没有界面,要么必须要找一些第三方的插件,要么必须自己写一个类似的编辑器扩展。它对我们开发者的要求还是比较高的,而使用我们的Addressable,它会有一个整合好的资源管理界面。
    4. 第四点好处,是能够支持远程资源加载和热更新。原来做远程资源的热更新,需要自己去管理,如何从网络上下载资源。如何去打补丁。如何把补丁传到服务器。如何去进行版本比对。如何去下载这个热更新的资源,而如果我们使用了Addressable这样一个插件以后。这些都可以由我们的Addressable自动去管理。

在这里插入图片描述

  • 讲了Addressable的好处之后,我给大家讲一下Addressable的工作流程和实现方法。

  • Addressable他的使用流程包括四个点。

    1. 首先第一步,我们需要创建一个资源分组。这个资源分组他就对应了过去你用AsssetBundle打出来的一个资源包,如果你没有学过AssestBundle也没有关系。你可以把它理解成一个资源组,默认的它会打出来一个资源文件。
    2. 第二步,我们通常是会把我们需要在项目当中使用的资源,加入到我们的资源组里面。
    3. 第三步,我们通常会把这些资源进行一个打包。打包以后呢,就会按照一个资源组一个资源包,一个资源组一个资源包的方式,那么形成最终我们可以在游戏项目当中所使用所更新的这些资源包。
    4. 第四步,在我们打包完以后,就要去加载这些资源。unity支持资源的本地打包和本地加载。也就是说直接从你的安装包里面去加载,他也支持不打到你的安装包里面,而是从远程服务器来进行资源加载。
  • Addressable的操作实现

    1. 首先第一步我们需要创建一个unity项目。我们在找到Addressable插件,然后点一个安装,就能安装Addressable这样一个资源管理组件。
      在这里插入图片描述

    2. 那么这个插件怎么用呢?我怎么去打包一个资源呢。首先我需要创建一些资源,比如我创建两个小球,一个叫做Local,一个叫做Remote,并设置不同的颜色。如图:
      在这里插入图片描述

    3. 接着我们需要创建资源组,把我们刚刚创建的两个小球添加到资源组里面
      在这里插入图片描述

    4. 可以看到这儿有一个com.unity.Addressable,打开以后,可以看到在这儿有一个文件夹,这个文件夹就是我们的BuildPath。关于文件位置可以参考官方文档。

      在这里插入图片描述

      • 我们的资源打包在Windows64位这个文件夹下面
        在这里插入图片描述

      • 里面会有三个资源目录。
        在这里插入图片描述

      • 第一个资源目录叫做local-assest-all大家注意这个名字,通过这个名字我们就知道它对应的实际上就是我们的本地的资源组。然后这个后缀都是Addressable在打包的时候它自动加的。
        在这里插入图片描述

      • 第二个local开头的,还是本地的文件。这个是unity在启动程序的时候,会把一些默认的比如说在渲染这个小球的时候,他会用一个默认的Shader来进行渲染,这个渲染用的Shader也必须打包。如果不打包的话,将来就没有办法去使用这些Shader。
        在这里插入图片描述

      • 关于这个内置系列的知识,大家可以参考我们的 unity小白的TA之路

      • 接着就是一个我们打包的一个远程目录,就是我们这个remote开头的。后面这些是这个文件的校验码,关于这些详细的细节知识,这个校验码是怎么生成的。那么这个呢大家可以参考这个Addressable的源码。
        在这里插入图片描述

    5. 我们开始写脚本。由于我们使用的是AA热更新,我就不用以前的GameObject预制体了,新创建一个AssestReference预制体,用异步的方法创建我们的预制体,其中Random.insideUnitSphere表示在固定的范围内创建预制体。这里一些关于Unity的基础知识可以观看我们的小白游戏梦公开课

      在这里插入图片描述

    6. 接着我们将脚本挂载到场景中,并且指定要生成的预制体,接着点击生成按钮,就可以得到下图的效果。

      在这里插入图片描述

    7. 但是在一个实际的大型商业项目当中,我们如果在加载资源的时候,都是从这儿去选择资源进行加载,这个时候我们的效率是非常低的。大家想象一下,如果我们的本地资源组里面不是一个资源而是100个资源,那么如果我需要指定加载什么资源,那么我是不是得要从本地资源组把这个资源拖一遍一遍。如果你要加载100个资源你就拖100次。如果你要对这个100个资源做任何的修改,你可能要重新再拖100次。这样效率就太低下了,所以说怎么办呢,我们还有第二个办法,就是不要用拖的办法,就是不要用这个AssestReference,而是通过资源的名字来进行实例化。

      在这里插入图片描述

    8. 接着我们要从远程加载我们的资源,先将我们的小球build一下,可以看到他打包的文件所在。

      在这里插入图片描述

    9. 我们的加载方式一共有三种。

      1. 如果你使用第一种方式,它直接就是从项目资源里面去加载。
      2. 第二种方式叫做模拟加载。
      3. 第三种方式是使用打包的资源组加载。所以说不管你要测试本地加载还是远程加载,我们都应该使用第三项。
      • 那么在你正式上线的时候,你一定是使用第三项。那么我们如果为了开发方便我们通常会选择第一项或者第二项。但是第一项会有一些问题,所以说我们更多的是,包括在我们的皇室战争这个大型商业项目课程里面,我们都会使用第二项。这两项有什么区别呢,在我们的Addressable源码解析的视频里面我们会给大家做详细的解释。
        在这里插入图片描述
    10. 这里我们需要用到一个HFS的小工具来找到我们的资源服务器,在打开这个小工具之后,就把远程的路径添加到我们的网页服务器上面。

      这个工具可以添加我们的老师QQ:1517069595领取

      在这里插入图片描述

    11. 我们将小球改成黄色,并且把打包路径中的选项选择为远程,加载远程资源,如图,注意我们在第一次打包红色小球时,就应当将他设置成远程。

    • 在这里插入图片描述
    1. 但是只有当我们使用它的时候才被加载出来,这叫做边下边玩的模式。我用到什么资源他才去下载。但是实际上这种方式并不太符合我们国内游戏厂商的一种资源热更新的方式。所以在我们的系统课程里面,我们会去教大家如何像国内游戏一样,在启动的时候先弹一个公告。如果有资源更新,弹一个资源更新的请求框,如果你点了确认以后一次性的把游戏需要更新的资源更新下来。而不是说我一边玩,然后我这边要用到某一个资源来从服务器下载。这样的话会造成一个问题。就是如果你一边下一边玩,比如说你在战斗的时候,他在那儿去下载资源,这个时候游戏的体验也很不好,所以说国内的游戏很多都不是边下边玩。
    • 在这里插入图片描述

三、商业项目中的资源热更新进阶

  • 在这里插入图片描述

  • 第一部分,资源卸载

    • 在这里插入图片描述

    • 我们知道了这个Addressable会根据配置好的路径去加载资源。一种是本地路径,一种是远程路径,我们用InstatiateAsync这个函数。那么我们如何去释放一个对象呢?就是如果你想要去释放你这个实例化的对象,那么我们只需要用ReleseInstance就可以了。

    • 这个是对于游戏对象而言,或者说是对于一些场景当中的预制体。我要实例化它,然后去释放他。那么我就用InstantiateAsync实例化,用Release来释放。

    • 如果是一些图片资源,一些动画资源,模型资源,那么我们就不能实例化,因为它不是场景对象。那么我们就可以用LoadAssestAsync来去进行加载,然后用Release来进行释放。

    • 另外关于Async也就是异步,在外面的系统课程里面会详细给大家讲。这里就给大家简单讲一下。

    • 下面的程序,就是设置了一个异步,当程序运行到这里时,会把控制权暂时交给Unity引擎,Unity引擎会进行一些处理,我们的程序不会卡死在这里,会继续执行。

    • 在这里插入图片描述

    • 第一点还有第二小点,就是我们在场景里面可以创建很多的游戏对象。比如说我可以创建很多的弓箭手,很多的法师,很多的战士。但是我们会注意到。如果你场景里面创建的这些战士都死亡了,或者说是我这个从战斗场景退出以后切换到游戏的主菜单了,那这个时候战斗场景里面的对象都会消失,都会被销毁。这些对象销毁的时候,我们是不是应该同步的把它们所占用的资源给卸载掉。那么我们的Addressable提供了一个叫做性能分析面板,大家可以看后面这个数字,这个数字就表示我们的比如说弓箭手他被他当前在游戏当中创建的实例的数量。

    • 在这里插入图片描述

  • 第二部分是在我们的商业项目当中,我们的游戏资源数量会比较多,如果通过拖拽的方式加载,显然是不现实的,我们的解决方案是一个完全可视化的工作流,会基于规则来进行大规模的资源打包。

    • 在这里插入图片描述
  • 第三部分是我们深入打包以后形成的资源分析,比如我们知道每一个打包的资源会形成一个catalog文件,那么这个文件存在的意义是什么,内部记录了什么,在资源打包的时候,我们每一个分组打一个包,那么我们能不能不按分组打包,而是按比如标签打包,还有关于资源重复打包的问题。关于这些问题可以添加我们的爱丽丝老师去领一下我们之前关于资源管理的公开课。

    • 在这里插入图片描述
  • 第四点就是如何检查、修复我们在资源打包时遇到的问题,就比如之前讲到的边玩边下模式的优化。

    • 在这里插入图片描述
  • 第五点就是代码热更,那么Addressable他能管理所有的资源,同样也能管理程序资源。我们知道我们的程序资源,其实打包以后它就是会形成一个编译好的程序集。我们要做的仅仅是更新,就是把这个程序集作为一种资源。然后在程序启动的时候更新DLL文件,这个程序集就可以了.

  • 那么当然在ios平台上面,你做的事情可能比更新程序集要复杂一点。在安卓平台上,只要去更新我的程序集,然后通过反射加载这个程序就可以了。但是ios因为它限制了动态的去载入新的程序集到APP里面来进行执行,所以的话我们需要有一个基于lLRuntime的热更新的方案。

  • 关于这方面的内容呢,大家也可以参考一下我们的系统课程,我们的皇室战争S3是全网为数不多的去详细的给大家讲解一个是客户端,一个是服务器双端热更的一个解决方案。

  • 第三个就是大家可以参考我们的公开课,关于热更新的那些限制。刚才我们不是说ios平台有限制吗?为什么有这个限制,它的技术原理是什么样的,为什么我们使用热更新能进行更新呢,那么这个都在我们的unity热更那些事儿。这个公开课里面是免费的,然后最后一个是我们的一小时极速掌握lLRuntime热更新。大家也可以去了解一下这个公开课,同样是扫左方的二维码。

  • 在这里插入图片描述

  • 接着我们来看第六个点,现在我们进入到Addressable时代以后,他一个先进的地方就是它的打包流程是可以定制的。就像我们unity里面进入到urp渲染管线这样一个时代以后,渲染流程是可以定制一样,我们的打包流程也是可以定制的。关于打包流程的定制,大家可以参考我们的addressable源码解析公开课。

    • 在这里插入图片描述
  • 第七个点是资源的卸载释放。前面我讲过了,Addressable的资源管理是基于一个叫做引用计数的机制。

    • 比如说一个游戏当中的一个游戏单位,这个游戏单位呢他可能有很多份,比如说游戏当中有弓箭手,你可能有很多相同的弓箭手。这个时候呢这个弓箭手资源它就会被使用很多次。当这个资源不使用了,当这个弓箭手资源在场景里面全部销毁不使用的时候。那么我们说它的使用次数就变成零。Addressable它会检测到引用次数为零,这样的一些资源,然后做对应的资源释放,那么它内部的资源释放的原理是什么,引用技术是如何实现的。

    • 这个同样是我们在笔试、面试的时候一个高频的问题。我们也会在课程当中去给大家做详细的讲解,那么这个也是商业游戏当中的一个必不可少的特性。另外的话呢,我们还会讲解的就是Addressable自带的一个性能分析器。但是Addressable的性能分析呢,还是有一些限制的,那么所以说我们如何突破他的限制,这个也是需要进一步学习。

    • 在这里插入图片描述

  • 第八点,那么前面我们讲过,我们的项目启动以后它有三种启动模式。直接使用项目资源模式,模拟模式和真实打包模式。那么这三种模式它的底层究竟有什么区别。它是如何实现最快速的,高级的和真实打包的这三种模式呢,这个也会在我们的Addressable源码解析的这个课程当中去给大家进行详细的讲解。

    • 在这里插入图片描述

四、小结

  • 在这里插入图片描述

  • 我们今天大致上给大家讲了三个方面的内容。

  • 第一个是总体流程,

  • 第二个是如何实现热更新。

  • 第三个我们讲了Addressable在商业项目当中的八大特性。这个商业项目当中必须要掌握的点。那么同时也是你在笔试面试环节必须要掌握的一些关于资源管理的一些点。你掌握了这些点以后,可以说让大家在应对笔试面试的时候不会这个遇到一些障碍。

  • 我们还会在我们的AssetBundle里面去给大家讲解传统的AssetBundle的热更新的框架,热更新如何实现。那么那么关于进一步的学习内容呢需要更多的时间。

  • 可以添加我们的老师领取更多公开课。

更多学习资源请加QQ:1517069595获取(/企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

完整视频可以点击B站链接:https://www.bilibili.com/video/BV1KU4y1L72h/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值