制作一个承载想法的东西(九)—— 资源加载和管理

  • A+
所属分类:Unity3d 原创文章

在六章节讲热更的时候,使用了Addressable可寻址进行的热更,已经做好了一键标志地址,这里就说下怎么通过地址加载资源,然后在lua侧实现对象池回收,引用计数等。

 

一、lua脚本的加载

xlua中自定义的CustomLoader是同步进行加载的,所以我们需要在驱动lua逻辑之前就要进行预加载了,在第六章中标志地址的时候,如果是lua脚本内容会根据目录(模块)添加上一个lable,然后在上一章中,是通过一个配置文件列出了框架和公用的lua目录lable,然后进行预加载缓存起来。场景加载的时候会预加载加载相关场景的lua脚本。后面觉得新建非场景脚本目录(模块),每次都需要去配置文件中添加一下预加载,且脚本内容不是很大不占内存,所以改成lua脚本再创建lua虚拟机之前全部加载出来。只需要在标志地址的时候针对lua脚本添加一个统一的label,再根据这个lable统一去加载就好了。

启动时,在创建lua虚拟机之间,加载并缓存lua脚本,加载的时候就通过缓存通过返回结果。

 

通过label预加载lua脚本的接口,首先通过lable获取到所有的地址,再通过所有的地址获取所有的lua文本内容,我测试过了两个数组的地址是相对应的,缓存为地址key=>lua文本内容。

 

二、其他资源的加载,场景、通用资源加载接口

这里加载场景的方式是叠加的方式,写死了,如果需要可以添加多一个参数进行控制。这里接口好像也没什么说的,OperationData是一个能提供给lua侧做携程等待的,并且加载完成后获取相应的资源。然后在lua侧实现一个AddressableManager.lua来调度这些接口,方便控制。

 

lua侧的AddressManager.lua调用加载和释放接口:

 

三、场景加载的例子

在章节二的时候,场景管理器使用的是Unity提供的UnityEngine.SceneManagement.SceneManager去加载场景的,目前使用了addressable后就采用addressable提供地址的形式来加载场景。这里直接贴一下最新的场景管理器的代码了,在LoadingScene方法中应用了卸载和加载场景。

 

 

四、资源加载对象池

需要实例化的资源例如Prefab,通过GetAssetInstance、CoGetAssetInstance来获取到实例,这里自动记录引用次数,不需要时可以通过RecycleObject进行回收或则通过ReleaseInstance销毁实例,回收的资源在下次加载的时候会优先使用不用再实例化(注意被污染的情况,删除了子物体或则添加了新物体,可以在Debug下添加回收检测,这里没做,注意使用就行),销毁的话会查看引用的次数,如果为0了就会卸载原始资源。

 

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: