需求分析

配置表:一种可以用来灵活调整游戏表现数据的储存文件

需求分析:

  1. 多样:希望支持多种多样的数据存储类型(基本数据类型、一维数组、二维数组)
  2. 只读:希望配置数据从机制上避免篡改
  3. 拓展:希望提供配置数据再封装的入口
  4. 容易:希望上层业务人员,不要因配置表,分散较多精力
  5. 性能:希望不要让配置表占用太多内存
  6. 效率:有错误时能快速响应,尽量不影响团队协作效率

性能优化的原因:一次性载入配置表,瞬间拔高了内存,若想覆盖更多低内存机型,需要遏制不必要的内存浪费。

架构设计

C#侧UML图

image-20220925140403741

  1. ConfigManager管理所有Excel表格的类对象,是配置表的入口
  2. TestMetatable声明了配置表各种数据类型的定义
  3. ParseExcel对配置表的数据类型通过二进制进行解析

Lua侧UML图

image-20220925164036003

  1. ConfigManager和C#端一样,管理所有Excel表格的类对象,是配置表的入口
  2. Window主要实现了扩展的功能,提供了数据再封装的入口

优化方案

C#侧优化方案-延迟加载

image-20220925135951263

  1. protobuf主要用于网络传输,或者将一些数据(比如聊天数据)序列化在存本地,下次启动文件再反序列化过来就可以了
  2. 一个字典存储了所有的配置表信息,key是配置表的文件id,value是一个字典存储的配置表中的配置信息,其中key是配置ID,value是行数据偏移信息(配置行的起止位置)
  3. 序列化的时候先只需要储存索引,要用到的时候按照索引再去现场序列化即可,这样可以不在游戏开始就序列化所有数据,大大的降低内存占用。
  4. 我们这种解决方案是按行来解析,有的公司按字段来解析,理论上优化的更好一些。

C#侧优化方案-MessagePack

image-20220925140019809

MessagePack for C#

游戏开发unity插件MessagePack:基本介绍

Lua侧优化方案

image-20220925171334506

Lua没有二进制的部分,只能借助Lua语言“metatable”和“__index”特性,实现按需require配置文件,这样也可以一定程度的优化配置表

之前我们只读的需求可以用index和newindex制作一个只读表

配置表研发工作流

工作流的作用:实现更好的协同业务的过程控制,改进和优化业务流程,提高业务的工作效率

配置表研发工作流:Excel->bat批处理工具->C#/Lua侧代码->业务开发