资源模块做什么?

资源模块——ResourceModule,是KEngine中最核心的模块,其他模块基本或多或少的对它有依赖,它主要的功能是:资源打包、路径定义、资源管理、资源调试

资源模块对Unity的Asset Bundle接口进行了完整的封装,运行模式下可以使用它进行完整的资源加载、卸载,也可以通过它方便地查找资源内存泄露的问题。

AssetBundle自动化打包

Unity 5中,Asset Bundle系统做了很大的变化。你只需将需要打包的资源配置AssetBundle Name,然后执行接口BuildPipeline.BuildAssetBundles(outputPath)就完成了所有AssetBundle的打包,比Unity 4.x方便多了。

图:把需要打包的资源放到BundleResources目录中

图:AssetBundle最终默认生成到Product/Bundles/(Platform)/中

图:KEngine->AssetBundle->Build All,自动设置BundleResources目录下所有的资源的Asset Bundle Name并执行打包

在KEngine+Unity 5.x中,把配置AssetBundle Name的这一步也省掉了。你只需把需要打包的资源,放在Assets/BundleResources目录中,所有的AssetBundle将会完整导出。

路径定义

Unity跨平台开发中,针对不同的平台——如编辑器、安卓、IOS、Windows等,一般有不同的资源存放路径。

像生成的Asset Bundle,还需要针对不同的平台,生成完全不一样的Asset Bundle资源。

因而KEngine中分别对Unity中的StreamingAssetsPath、PersistentDataPath等做了封装,开发人员无需为资源放在什么目录进行烦恼了(详见ResourceModule中的InitResourcePath方法),并且,内置了支持热更新。

举例:加载一个Asset Bundle的路径选择

假设现在要加载一个UI资源"Login":

public IEnumerator LoadUIAsset(CUILoadState loadState, UILoadRequest request)
{
string path = string.Format("ui/login.prefab.bytes"));
var assetLoader = KStaticAssetLoader.Load(path);
while (!assetLoader.IsCompleted)
yield return null; request.Asset = assetLoader.TheAsset; // Asset 是GameObject
}

这个StaticAssetLoader,做了什么操作?假设我们在Android平台

  • 获知ui/login.prefab.bytes这个路径
  • 寻找热更新资源,尝试加载PersistentAssetsPath/Bundles/Android/ui/logins.prefabs.bytes
  • 无法找到热更新资源,尝试加载StreamingAssetsPath/Bundles/Android/ui/logins.prefabs.bytes
  • 依然无法找到,加载失败

资源加载

KEngine在Unity 5.x中,会自动的先加载依赖资源,你只要填入Asset Bundle的路径名字就可以了。就像Unity的Resources类一样。

简单加载

使用ResourceModule中的LoadBundleLoadBundleAsync接口,可以实现类似于Unity的Resources.LoadResources.LoadAsync的效用。

要注意的是,LoadBundle、LoadBundleAsync接口,起始地址是加载StreamingAssets/Bundles/Win32或StreamingAssets/Bundles/Android这种平台相关的路径。

// 同步加载,返回加载器,加载器中有加载的资源
var reqeust = ResourceModule.LoadBundle("ui/login.prefab.bytes")
Debug.Log(request.Asset != null); // true // 异步加载,返回加载器,加载器中还没加载的资源,需要异步等待
var request = ResourceModule.LoadBundleAsync("ui/login.prefab.bytes", (isOk, asset, args)=>{});
Debug.Log(request.Asset == null); // true

Loader加载器

KEngine中定义了各种类型的资源加载器,提供更为方便的加载、调试功能,来避免一些使用上的。坑

Loader加载器

加载GameObject

最常用的Loader有两个:

  • StaticAsset:每次调用Load,使用同一份GameObject引用
  • InstanceAsset:每次调用Load,都会拷贝出一份GameObject
// 协程风格
public IEnumerator LoadUIAsset(UILoadRequest request)
{
string path = string.Format("ui/login.prefab.bytes"));
var assetLoader = KStaticAssetLoader.Load(path);
while (!assetLoader.IsCompleted)
yield return null; request.Asset = assetLoader.TheAsset; // Asset 是GameObject
}
// CPS回调风格
public void LoadUIAsset(UILoadRequest request)
{
string path = string.Format("ui/login.prefab.bytes"));
KStaticAssetLoader.Load(path, (isOk, asset, args)=>{
request.Asset =asset;
});
}

资源的释放

KEngine中的资源释放,跟Unity的资源释放明显区别是:Unity中提供Resources.UnloadUnusedAssets接口,来自动释放无用的资源的。而KEngine中资源释放采用纯手动的方式。

这主要是因为躺过Unity自动释放资源的很多坑: 经常会遇到“missing”的资源引用吧?因此选择了手动释放机制。

所有XXXLoader,都有一个接口Loader.Release(),举例:

string path = string.Format("ui/login.prefab.bytes"));
var assetLoader = KStaticAssetLoader.Load(path); // 引用计数1
while (!assetLoader.IsCompleted)
yield return null;
var assetLoader2 = KStaticAssetLoader.Load(path); // 引用计数2
while (!assetLoader2.IsCompleted)
yield return null; assetLoader2.Release(); // 释放,减小引用计数 // 引用计数1
assetLoader.Release(); // 引用计数0,正式删掉缓存的资源

手工释放的资源存在引用计数,只有当引用计数为0,Loader才会触发回收,并且连同加载过的AssetBundle彻底消灭,节省内存。

其它Loader

诸如TextureLoader、AudioLoader等等,所有XXXLoader的使用方法都是一致的,它们提供CPS回调风格和协程风格

资源的调试监控

在Unity Editor模式下,所有的XXXLoader加载类实例,都会伴随住一个GameObject的产生,而这个GameObject,只用于进行调试、内存信息查看:

图:资源加载调试信息:Loader、加载的对象

图:每一个Loader的引用计数信息,都可以通过面板来进行实时查看

如上图所示,通过KEngine的资源调试器,可以方便的找到加载的AssetBundle的资源对象、监控内存占用的大小、Loader加载消耗的时间、Loader当前引用计数等信息。对比Unity原生的Profiler,这些信息是即时的。 开发人员可以非常方便的寻找资源泄露问题,优化内存占用。

版权说明

文/公的Kelly[mr-kelly](简书作者)     Email: 23110388@qq.com
原文链接:http://www.jianshu.com/p/ce3b5d0bdf8c

著作权归作者所有,转载请联系作者获得授权,,并标注“简书作者”。

KSFramework系列

github地址:https://github.com/mr-kelly/KSFramework

欢迎大家到 github提issues

KSFramework(集成U3D热重载)README

KSFramework:Unity3D开发框架快速入门

KEngine策划指南:配置表格的编辑与编译

KEngine:Unity3D资源的打包、加载、调试监控的更多相关文章

  1. Unity3D使用Assetbundle打包加载(Prefab、场景)

    之前有一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity游戏开发使用Assetbundle加载场景的原理 本篇文章我们将说说assetbund ...

  2. unity3d进行脚本资源打包加载

    原地址:http://www.cnblogs.com/hisiqi/p/3204752.html 本文记录如何通过unity3d进行脚本资源打包加载 1.创建TestDll.cs文件 public c ...

  3. Unity3d Web3d资源的动态加载

    Unity3d Web3d资源的动态加载 @灰太龙 参考了宣雨松的博客,原文出处http://www.xuanyusong.com/archives/2405,如果涉及到侵权,请通知我! Unity3 ...

  4. unity3d Resources.Load动态加载资源

    初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省 ...

  5. 【Cocos2d-Js基础教学(5)资源打包工具的使用及资源的异步加载处理】

    TexturePacker是纹理资源打包工具,支持Cocos2dx的游戏资源打包. 如果用过的同学可以直接看下面的资源的异步加载处理 首先为什么用TexturePacker? 1,节省图片资源实际大小 ...

  6. Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条

    Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...

  7. Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设

    Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树. 每个节点对应一个GameObject对象 然后每个GameObject有若干个组件 有一些组件会与资源产生关系,比如Mes ...

  8. UNITY_资源路径与加载外部文件

    UNITY_资源路径与加载外部文件 https://www.tuicool.com/articles/qMNnmm6https://blog.csdn.net/appppppen/article/de ...

  9. Unity5 AssetBundle打包加载及服务器加载

    Assetbundle为资源包不是资源 打包1:通过脚本指定打包 AssetBundleBuild ab = new AssetBundleBuild                         ...

随机推荐

  1. jQuery原型方法.pushStack源码分析

    这次分析的方法跟前面不同,虽然pushStack也是原型方法之一,但是我们几乎从不用在页面调用,在参考手册里面也没有这个方法的使用说明,但是这个方法还是非常重要的,在使用很多jQuery的其他方式都会 ...

  2. Xcode编译相关

    Xcode多工程联编及工程依赖 iOS release,debug版设置不同的AppIcon Xcode创建子工程以及工程依赖 Xcode 依赖管理带来的静态库动态库思考

  3. IOS中十六进制的颜色转换为UIColor

    IOS中十六进制的颜色转换为UIColor #pragma mark - 颜色转换 IOS中十六进制的颜色转换为UIColor + (UIColor *) colorWithHexString: (N ...

  4. MySQL两种表存储结构MyISAM和InnoDB的性能比较测试

    转载 http://www.jb51.net/article/5620.htm MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1 ...

  5. javascript 创建对象

    1.原型模式创建对象 (1)第一种function Newperson(){    } var person2 = new Newperson(); Newperson.prototype.name ...

  6. 安卓开发第一步:Android Studio安装配置

    虽然本人是JAVA开发工程师平时主要开发Web App,但因为项目需求需要开发对应的移动端.一时又找不到合适的安卓开发人员,兄弟我只好被项目经理"抓来当壮丁了".俗话说好" ...

  7. 驳 GarbageMan 的《一个超复杂的简介递归》——对延迟计算的实验和思考

    这是一篇因骂战而起的博文,GarbageMan 在该文章回复中不仅对我进行了侮辱,还涉及了我的母校,特写此文用理性的分析和实验予以回击. 在此也劝告 GarbageMan,没什么本事就别在那叫嚣了,还 ...

  8. mysql自增列导致主键重复问题分析。。。

    前几天开发童鞋反馈一个利用load data infile命令导入数据主键冲突的问题,分析后确定这个问题可能是mysql的一个bug,这里提出来给大家分享下.以免以后有童鞋遇到类似问题百思不得其解,难 ...

  9. PowerBI通过gateway连接多维数据库

    简介   Microsoft Power BI 是由微软推出的商业智能的专业分析工具,给用户提供简单且丰富的数据可视化及分析功能.个人非常喜欢,有免费版和Pro的付费版,今天主要是介绍下通过gatew ...

  10. Maven详细介绍

    Maven 目录 1 什么是Maven? 2 Maven 的好处 3 获取和安装 3.1 获取 3.2 安装 3.2.1 环境变量的配置 4 设置本地仓库 5 创建简单的Maven实例 5.1 使用骨 ...