Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于游戏中的配置机制 #12

Open
coneo opened this issue Apr 6, 2015 · 3 comments
Open

关于游戏中的配置机制 #12

coneo opened this issue Apr 6, 2015 · 3 comments
Labels

Comments

@coneo
Copy link
Owner

coneo commented Apr 6, 2015

配置文件是一个游戏中必不可少的模块,无论游戏简单或复杂,单机或网游。对于很简单的游戏,可能没有外部的配置文件,把一些关键的参数写死在程序里,这实际上也是一种配置,只是存储在代码中。主流的游戏开发中,我们使用文本形式的配置文件(excel,csv,xml,json,lua),在游戏运行过程中,通过读取这些配置文件把配置数据加载到内存中,一般来说,配置文件数据在内存中是不可修改的(const),并且需要支持热加载。我们可以把配置模块分为(储存介质,打包,读取)以下几个子模块分别加以说明。

储存介质。我们可以用文件的方式来储存配置(excel,csv,xml,json,lua)。对于主流的做法来说,策划依然青睐于excel,因为其强大的修改功能和表示功能,具体excel功能我就不说了,策划能够利用excel高效的处理配置。xml自称是自描述的,但是当表示大量的配置时,其表现并没有excel方便。另外,除了利用文件来储存配置,你也可以用数据库来储存配置。从DB读取数据并不比文件慢。具体做法可以是:excel -> 数据库。
策划使用的还是excel配置,然后把excel数据转到DB中供程序读取,这个过程并不容易,有的做法是策划把excel中的数据手动拷贝到DB中,比较麻烦。采用DB这个方案的话,只能用于服务器端(客户端不能读数据库吧)。客户端的话可以从DB中导出一份xml供其用。“excel -> 数据库”这个方案我没有实际用过,还不清楚有没有比较高效的做法。

打包和读取。一般来说,考虑读取的效率以及储存的大小,一般会把配置文件打包成二进制形式(基本上是针对excel。xml,json和lua则直接读取)。如果是打包成二进制的话,那么读取的时候实际上是一个逆工程。配置文件的如何打包取决于如果读取。读取的话,比较原始的做法是根据excel的定义,在程序中显式定义一一对应的程序结构。例如在excel的skill表有如下的字段:
skillid name desc level att def
那么在读取的时候定义一个结构体用于读取:

struct
{
    uint32    skillid;
    string     name;
    string     desc;
    uint32     level;
    uint32     att;
    uint32     def;
};

这样的做法比较繁琐,对于每张excel表都需要手动定义对应的结构。当修改表的时候,需要修改对应的结构体。一不注意就会出错,是比较不推荐的做法,这也是早期游戏中用的一种做法。

这里介绍另外一种做法。策划依然使用excel配置数据,然后通过一个大包工具把数据大包到一个中间的数据格式protobuf。把excel中的数据序列化到pb数据中,在读取配置的时候,就直接读pb二进制数据,这样一来,我们在程序中读取配置的时候也可以直接用protobuf的接口。这个大包工具会根据excel生成描述数据的proto文件,然后根据该proto文件把excel中的数据序列化到一个文件中。大概的流程如下:

test.xlsx -> test.proto -> test.tbx

这里的test.xlsx是策划配置好的excel表,test.proto和test.tbx是打包工具生成的。假设test.xlsx就是上面那张技能表,那么test.proto大概如下:

message skill
{
    optional int     skillid = 1;
    optional string     name = 2;
    optional string      desc = 3;
    optional int      level = 4;
    optional int      att = 5;
    optional int     def = 6;
}

message skill_ext
{
    repeated skill  data;
}

这里的message skill对应excel的结构,那么一个skill就是一条数据,由于excel中的数据是有多行的,因此需要表示多个数据,因此这里定义了一个repeated skill的skill_ext结构。

@coneo coneo added the game dev label Apr 6, 2015
@luoqeng
Copy link

luoqeng commented Apr 8, 2015

跟我司一样

@coneo
Copy link
Owner Author

coneo commented Apr 10, 2015

你说的是excel -> db -> xml这种,还是pb方式

@luoqeng
Copy link

luoqeng commented Apr 10, 2015

excel -> pb

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants