《炉石传说》架构设计赏析(4):Asset管理
欢迎转载,请注明作者【燕良@游戏开发】及原文地址:http://blog.csdn.net/neil3d/article/details/39580197
另外。欢迎大家来我的QQ群交流各种游戏引擎相关的技术:游戏引擎能吃吗(264656505)
话说,经过这段时间的学习和摸索。对于Unity3D的开发思路已经基本清晰了。
只有还剩下一个AssetBundle机制还没有搞透,这个涉及到前期项目的资源规划、资源管理代码的写法。以及自己主动更新机制的实现。
所以,还是想先把游戏逻辑的进一步分析押后,先来看一下《炉石传说》Asset管理。必须得说一下的是,眼下分析都是PC版的程序集。对于移动端不一定全然合适,且当做一个案例分析吧。
本文主要讲述《炉石传说》的AssetBundle的管理机制。它的机制比較简单清晰,中规中矩,中间的分析过程就不讲了,直接展现其架构设计和代码逻辑组织。
先从Asset管理相关的类讲起。
class Asset :资源信息描写叙述
以下的AssetFamily一节详解。
enum AssetFamily - 资源分类
- 炉石依据资源的不同类型进行分别的AssetBundle打包,一类资源相应一个或者多个资源包。(一类资源分多个包的规则不得而知);
- 有的资源包真的本地化单独打包,比如“fonts0.unity3d”==》“fontszhCN0.unity3d”;
- 在程序中。资源包的分类相应枚举类型“AssetFamily”。
- 资源包的详细路径信息。存储在Asset.paths,这是一个静态变量;在初始化时,手动填写必要的信息,类似这样:
Dictionary<AssetFamily, AssetFamilyPathInfo> dictionary = new Dictionary<AssetFamily, AssetFamilyPathInfo>();
AssetFamilyPathInfo info = new AssetFamilyPathInfo {
format = "Data/Actors/{0}.unity3d",
sourceDir = "Assets/Game/Actors"
};
info.exts = new string[] { "prefab" };
dictionary.Add(AssetFamily.Actor, info); - 另外。另一个class AssetBundleInfo是记录了每种AssetBundle相应的主文件名称。以及包文件的个数、相应的对象类型等信息;详见下图:
class AssetLoader :资源载入
- 首先从AssetCache中查找,假设找到了。则更新Cache项的时间戳。并调用回调;
- 假设没有找到,则向AssetCache加入一个Request,然后启动Coroutine:CreateCachedAsset(),它的调用步骤是:
- 调用AssetCache.StartLoading()。
- 启动Coroutine:CreateCachedAsset_FromBundle<RequestType>():
- 使用AssetLoader.GetBundleForAsset()找到资源所属的AssetBundle;
- 调用AssetBundle.LoadAsync()来真正载入资源;
- 在载入的过程中,依据处理的结果调用:AssetCache.CacheRequest的OnLoadFailed()、OnLoadSucceeded()、OnProgressUpdate()等函数;
- 在AssetCache查找此资源。假设找到了,则载入成功,调用回调函数;
调用AssetCache.StopLoading();
怀疑它的Editor模式相关的代码是用预编译宏处理来实现的,所以未出如今公布出来的程序集其中。类似这样:
#if UNITY_EDITOR
Obj = Resources.LoadAssetAtPath(assetPath, typeof(T));
if (Obj == null)
Debug.LogError ("Asset not found at path: " + assetPath);
yield break;
#else
class AssetCache :资源的Cache机制
- AssetCache中的资源项的时间戳,由AssetLoader在资源载入请求时维护;
- AssetCache主要负责管理Cache数据,而真正的资源载入动作还是在AssetLoader中运行。
- SceneMgr.ClearCachesAndFreeMemory()
- LoadingScreen.ClearAssets()
- SoundMgr.UnloadSoundBundle()
- 等等
- 对游戏资源依照类型分包。每一类资源包能够有多个。
- 在游戏执行时使用Cache机制;
《炉石传说》架构设计赏析(4):Asset管理的更多相关文章
- DotNET应用架构设计指南 安全 运行管理和通讯策略
DotNET应用架构设计指南(第三章:安全 运行管理和通讯策略(13-16)) 安全 运行管理和通讯策略 组织策略定义的规则是支配应用程序如何安全,如何管理,不同的应用程序组件是如何和另一组件及外部服 ...
- 【tornado】系列项目(一)之基于领域驱动模型架构设计的京东用户管理后台
本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”. 一.预备知识: 1.接口: python中并没有类似java等其它语言中的接口类型,但是python中 ...
- 炉石传说 C# 设计文档(序)
经过3个月的开发,有很多感触. 以前一直以为技术是开发成败的第一因素,现在发现,等到你代码写的时间够长,经验够丰富,什么功能都能随手完成,对于业务的分析能力变成了第一位. 炉石山寨版的BS版本用到的H ...
- 【Python之路】特别篇--基于领域驱动模型架构设计的京东用户管理后台
一.预备知识: 1.接口: - URL形式 - 数据类型 (Python中不存在) a.类中的方法可以写任意个,想要对类中的方法进行约束就可以使用接口: b.定义一个接口,接口中定义一个方法f1: c ...
- 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现
上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...
- 架构设计之Spring-Session的分布式集群会话管理
发表于 2017-04-24 | 160次围观 | 分类于 架构设计 | 暂无评论 前言 通常在web开发中,回话管理是很重要的一部分,用于存储与用户相关的一些数据.对于JAVA开 ...
- 架构设计 | 分布式系统调度,Zookeeper集群化管理
本文源码:GitHub·点这里 || GitEE·点这里 一.框架简介 1.基础简介 Zookeeper基于观察者模式设计的组件,主要应用于分布式系统架构中的,统一命名服务.统一配置管理.统一集群管理 ...
- 架构设计 | 接口幂等性原则,防重复提交Token管理
本文源码:GitHub·点这里 || GitEE·点这里 一.幂等性概念 1.幂等简介 编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.就是说,一次和多次请求某一个资源会产 ...
- 架构设计 | 基于Seata中间件,微服务模式下事务管理
源码地址:GitHub·点这里 || GitEE·点这里 一.Seata简介 1.Seata组件 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用 ...
随机推荐
- Q币直充-迅银渠道商(php 面向对象类)
Q币直充的一个类实现 1 <?php /** * DEC : 迅银Q币直充 * User: David Wang * Time: 2018/5/24 下午1:09 */ namespace go ...
- js 鼠标拖拽元素移动
<!DOCTYPE html><html> <head> <title> </title> <style media="sc ...
- vuex如何管理需要即时更新的全局变量
自己在使用vue练习开发的时候遇到全局变量无法即时更新的问题,查了资料之后得出结论使用vuex能够快速解决该问题,但是看了好多人讲解vuex的教程自己跟着去做都没解决自己想要的,最后找到一个比较容易理 ...
- 笔试算法题(07):还原后序遍历数组 & 半翻转英文句段
出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历): 分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左 ...
- MongoDB安装与配置启动
1.下载安装包.mongodb-linux-x86_64-rhel62-3.6.3.tgz 2.解压.修改名字. 3.修改配置文件: # mongodb.conf #where to loglogpa ...
- 第二次:Ubuntu16.04 系统怎么截图
一开始想着写文章不用图,全靠文字描述,可是我错了,技术类文字没有图怎么能说的清楚,于是乎开始找在Ubuntu系统下的截图工具,网络神奇,发现了这个,以下命令可以反复试试: ubuntu 会自带一款截图 ...
- ubuntu14.04 mysql-workbench Connecting to MySQL server ... Native table 'performance_schema'.'session_variables' has the wrong structure错误解决
使用的mysql版本: mysql Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using EditLine wrapper 打开shell命令 1.输 ...
- Python 中的变量还能这样理解(白话)
一.案例分析 1.思考 计算软件测试大佬柠檬小姐姐,每月能存多少钱 # 计算软件测试大佬柠檬小姐姐,每月能存多少钱 # 坐标:深圳 # 2018年1月份 # 房租水电 4000元 # 伙食费 1000 ...
- Qt 多语言支持
简介 Qt 多语言支持很强大,很好用. 首先要强调的是程序中需要翻译的字符串最好都用 tr("message") 这种形式,这里的 "message" 就是需要 ...
- SSL 握手协议详解
这里重点介绍一下服务端的验证和密钥交换.这个阶段的前面的(a)证书 和(b)服务器密钥交换是基于密钥交换方法的.而在SSL中密钥交换算法有6种:无效(没有密钥交换).RSA.匿名Diffie-Hell ...