前言
前面6篇博客,已经把Unity资源加载的最核心的功能搭建完成了,包括下载,ab加载(ab打包),asset加载,prefab实例化。
这篇文章主要阐述网络游戏开发中必不可少的版本管理。为什么需要版本和热更,这个已经是一个游戏开发者的一个共识,就不需要笔者再做过多解释了吧。
分支管理
一般游戏在开发中,会遇到多渠道、多平台、多服务器以及多语言的管理难题,而不当的处理会导致更高的理解和管理成本,所以我们需要明确拆分。
功能拆分
多渠道,一般是上线前夕需要部署到正式服上的模块,例如以下
huiwei
xiaomi
oppo
。。。
多平台,一般是3个平台,如下
iOS
Android
PC
多服务器,一般游戏依据需要,通用的如下
内网测试服
(包括私人测试服)外网测试服
(用于接入外部渠道等需要的网络)商务服
(用于外部推广使用)审核服
(用于版号,ios等审核)准正式服
(跟正式服基本一致,一般比正式服提前一个版本)正式服
(对玩家开放的服务器)特殊服
多语言,这个会根据需求,一般只是字符串读取配置不一样和个别图片替换,跟上面的功能目录拆分不同,属于游戏内功能。
多地区,如果全球发行的游戏,一般还要兼顾地区的多渠道(一般一个海外地区就一个渠道),笔者将其作为一个渠道处理
CDN目录结构
对应上面的逻辑,我们CDN目录结构设计如下
--InTest
--Default
--IOS
--Android
--PC
--Test
--OutTest
--Default
--Test
--Ready
--Release
--Default
--IOS 一般只有一个IOS平台
--PC
--huawei 一般渠道都只有Android
--Android
--xiaomi
--Android
--Japanese 一般多地区,是跟渠道并行一个层级
--IOS
--Android
--PC
上述只是资源管理部分,有很多情况下,服务器很可能是同一台服务器,比如常见的iOS和Android数据互通,这样是根据游戏启动,游戏包体对应配置到服务端获取对应服务器地址,再连接对应服务器。
Git管理
应对上述的复杂条件,Git管理目前已经成为一个主流。
git分支管理内容非常多,不过不是本文的重点,后面有时间再开文再具体讲,只讲几个关键点。
- 项目中最好只有一条主开发分支线,多渠道,多语言,多平台的功能都在上面,关键节点拉出分支固定节点内容
- 要发布一个渠道,从开发主分支拉出分支作为xx渠道分支,导出package
- 热更xx渠道,从xx渠道分支拉出x.x.1版本,提交内容打patch,再从x.x.1 拉出x.x.2提交内容打patch
- xx渠道换包,重复第二步
版本管理
版本管理,管理的是版本号
和版本文件
。
版本号是一个通识的,可被玩家查看的标识,也就是最通俗的1.1.1,1.1.2,1.2.1这样的版本号。
而版本文件,一般是玩家不可见的,代表游戏资源文件。一般每个资源文件都有一个版本号,表示该版本文件需要使用哪个版本。
版本号
版本号一般有三个段组成,
maxVer
表示第几代游戏,表示完全跨度的版本,比如龙之谷,龙之谷2,龙之谷3这样的差异
midVer
表示换包版本号,表示包体更新,也就是需要更包,换包才需要提升一位
minVer
表示资源版本号,表示可以直接可以通过下载热更的,也就是在游戏开始自己提示下载资源的
版本文件单元
public class FileVersionData
{
public string name;
public int size;
public string md5;
public int version;
public override string ToString()
{
return name + "\t" + size + "\t" + md5 + "\t" + version;
}
public void InitData(string str)
{
var sps = str.Split('\t');
name = sps[0];
size = int.Parse(sps[1]);
md5 = sps[2];
version = int.Parse(sps[3]);
}
}
每个文件都会记录名字,长度,MD5校验值和版本号。
版本文件表
而所有文件的版本信息会保存到一个版本文件表中
public void InitVersionFile(string path)
{
_fileList.Clear();
if (!File.Exists(path)) return;
var lines = File.ReadAllLines(path);
foreach(var line in lines)
{
if (string.IsNullOrEmpty(line)) continue;
var fileVersionData = new FileVersionData();
fileVersionData.InitData(line);
_fileList.Add(fileVersionData.name, fileVersionData);
}
}
版本文件表一般用于热更资源下载和资源文件加载的路径。
CDN文件目录
依据上面的规则,会得到如下的目录结构
--PC 平台
--IOS
--Android
--1001000 当前版本的资源目录,包含所有资源
--Assets ab导出的目录
--Prefab
--xxx1.ab ab文件
--xxx2.ab
--Texture
--xxx1.ab
--xxx2.ab
--Assets ab的manifast文件
--Bytes 二进制配置文件目录
--xxx1.bytes 二进制文件(加密)
--1001001 只导出比1001001增加和修改的文件
--Assets
--Prefab
--xxx1.ab 修改的保留
...xxx2.ab 相同的不放人目录
--xxx3.ab 增加的保留
--Assets
--1001002
--1001003
--1002000 换包需要新启midVer,会全部重新导出一遍资源
--1002001
--1001000.txt 版本文件表,包含所有文件信息
--1001001.txt
--1001002.txt
--1002000.txt
--1002001.txt
--version.txt 当前版本号
上面的表示就一目了然了
资源热更
资源热更,一直是游戏开发的难点和痛点,不稳定和不高效一直是玩家流失的一大因素。