25 Star 142 Fork 64

Nomat / CocosGame

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
游戏索引模块设计.md 3.75 KB
一键复制 编辑 原始数据 按行查看 历史
Nomat 提交于 2020-10-30 22:16 . 文档修正

游戏索引模块设计

模块设计目的

由于游戏使用分包设计,所以传统编码方式访问其他包中的文件是比较麻烦的事,而且还涉及到各个分包加载与否,或者加载先后的问题。索引模块的设计就是为了解决分包文件访问问题,力求在编码时和传统编码一样,根本不用考虑分包的问题。

索引模块的本质

索引模块是为了解决包文件共享而设计的,但是它并不是文件管理器,或者资源管理器。索引模块仅仅只是一张表,表中的各个节点记录着各种数据,当我们要访问某一类资源时只要在索引模块中查找就可以了。

包文件共享共享的是什么? 一般我们要共享的不是单个文件,而是一类配置,比如某个包中的特效需要共享,那么这些特效的配置就是索引表中的数据。

索引模块如何工作

每个游戏包都可以在它的资源目录中定义索引加载表,以加载当前包的共享配置数据等。资源索引加载表路径为<游戏包>/res/<游戏包>/indexes.json,这是一个JSON文件里面包含了所有加载表,如;

{
    "src": "$(respath)/main/indexes/src.json",
    "res": "$(respath)/main/indexes/res.json",
    "db_auto": "$(respath)/main/indexes/db_auto.json",
    "prot_auto": "$(respath)/main/indexes/prot_auto.json"
}
  • *_auto 以_auto结尾的键一般为游戏脚本工具生成的,不要去修改它。比如db_auto表示脚本工具生成的数据库索引文件,prot_auto表示脚本工具生成的协议索引文件。
  • $(respath) 这个是索引模块的一个环境变量,目前可以使用的环境变量有:
    1. respath 游戏的资源路径,一般为res
    2. srcpath 游戏的程序路径,一般为src
    3. curpath 表示当前文件的目录路径
  • 具体的src.jsonres.jsondb_auto.jsonprot_auto.json其实就是普通的JSON文件,当然也是可以使用环境变量的。

索引模块会把加载表中的索引JSON合并为一个索引表,当然只要有包文件加载就会把包文件中的索引配置读取出来合并为一个表。
这样当我们需要加载一类游戏配置的时候只要知道索引表中的节点路径就可以了,当然索引表需要仔细设计,他是很重要的。

PS:包里面的资源索引加载表是在包加载器里面加载的,可以看游戏包结构设计

索引模块重要函数

  • readJson(jsonfile) 读取JSON文件,游戏中读取JSON最好都使用这个函数。因为游戏包在打包阶段JSON文件可能会有优化,比如直接转换为lua文件,或者luac字节码文件,这对JSON加载速度可能会提升 10 ~ 50 倍。
  • writeJson(jdata,jsonfile) 写入JSON文件,这和普通的写入没有区别,但是注意,在配置JSON优化的时候,需要避开这些可能会写入的问题,否则可能会出问题。
  • readJsonConfig(jsonfile) 读取JSON配置文件,它在读取了JSON后,还会转换JSON配置中的环境变量。目前这类文件不能使用JSON优化,主要是出于转换环境变量的效率考虑。目前还不知道优劣。
  • getIndex(path) 获得指定路径的索引配置。
  • addListener(listener, ipaths, priority) 这个可以监听索引模块索引变化情况,对于依赖于索引模块的其他模块,监听是很重要的。比如包文件加载和释放都会存在索引表变动,需要及时更新其他对应模块。

索引模块很重要

索引模块应该算是当前游戏框架中最重要的模块,如果没有这个模块,其他很多模块都会变得很难使用。

Lua
1
https://gitee.com/nomat/CocosGame.git
git@gitee.com:nomat/CocosGame.git
nomat
CocosGame
CocosGame
master

搜索帮助