需求分析
配置表:一种可以用来灵活调整游戏表现数据的储存文件
需求分析:
- 多样:希望支持多种多样的数据存储类型(基本数据类型、一维数组、二维数组)
- 只读:希望配置数据从机制上避免篡改
- 拓展:希望提供配置数据再封装的入口
- 容易:希望上层业务人员,不要因配置表,分散较多精力
- 性能:希望不要让配置表占用太多内存
- 效率:有错误时能快速响应,尽量不影响团队协作效率
性能优化的原因:一次性载入配置表,瞬间拔高了内存,若想覆盖更多低内存机型,需要遏制不必要的内存浪费。
架构设计
C#侧UML图
- ConfigManager管理所有Excel表格的类对象,是配置表的入口
- TestMetatable声明了配置表各种数据类型的定义
- ParseExcel对配置表的数据类型通过二进制进行解析
Lua侧UML图
- ConfigManager和C#端一样,管理所有Excel表格的类对象,是配置表的入口
- Window主要实现了扩展的功能,提供了数据再封装的入口
优化方案
C#侧优化方案-延迟加载
- protobuf主要用于网络传输,或者将一些数据(比如聊天数据)序列化在存本地,下次启动文件再反序列化过来就可以了
- 一个字典存储了所有的配置表信息,key是配置表的文件id,value是一个字典存储的配置表中的配置信息,其中key是配置ID,value是行数据偏移信息(配置行的起止位置)
- 序列化的时候先只需要储存索引,要用到的时候按照索引再去现场序列化即可,这样可以不在游戏开始就序列化所有数据,大大的降低内存占用。
- 我们这种解决方案是按行来解析,有的公司按字段来解析,理论上优化的更好一些。
C#侧优化方案-MessagePack
Lua侧优化方案
Lua没有二进制的部分,只能借助Lua语言“metatable”和“__index”特性,实现按需require配置文件,这样也可以一定程度的优化配置表
之前我们只读的需求可以用index和newindex制作一个只读表
配置表研发工作流
工作流的作用:实现更好的协同业务的过程控制,改进和优化业务流程,提高业务的工作效率
配置表研发工作流:Excel->bat批处理工具->C#/Lua侧代码->业务开发