游戏服务器设计的相关内容(3)

时间:2009-11-20   来源:haooooooo博客   网友评论:0   人气: 656 作者:

 

我要是不能说服老板,这是“根本不可能完成的任务!”,那也就只能坐下来再试一试。

也许,可以考虑将所有对象的数据都保存到数据服务器上,当然,这要求每个怪物都跟玩家一样,有一个唯一ID,这一点实现起来可能会有些麻烦。

再不然,为对象提供一个从已有的内存数据构造的方法,这样便可以使用共享内存来保存现场数据,再从共享内存中恢复出原来的对象。理论上来说,这个方法是可行的,只是,这三十多个字的文字描述要用C++来实现也可能将会是一项极大的挑战,所以,这也仅只是可供参考的一个尝试方案。

 

 

我想,我们走的够远了

 

让我们先暂停一会儿,回过头来看一看最初的目的。其实我们想要的只是尽可能的让服务器进程不要宕机,如果实在是没有办法,就尽可能的让宕机后的玩家损失比较小,不需要我们做大量的工作去做善后处理。

很简单的需求,似乎我们纠缠的有些过头了。

 

写出能够稳定运行的程序是对程序员的最基本要求,如果一个程序连稳定性都不具备,那根本都不用再去考虑功能啊、扩展啊等其他标准了。但是,正如我最开始所说的,没有一个人能够100%保证他写出来的服务器程序是绝对不会崩溃的。我们所能要求的只是尽可能的仔细,尽可能的多一些必要的测试,离安全尽可能的更近一步。

 

剩下的就是在宕机后如何降低损失的问题了。

对于一般的MMOG来说,玩家在进入游戏时会从数据库中将该玩家的所有相关数据读到内存,以便快速的进行游戏逻辑的处理,而在玩家下线时再将数据的改动存回数据库。

显然的,当服务器进程出现意外宕机时,内存中所有的数据都丢失了,这也就造成了玩家数据的回档,而且玩家在游戏中呆的时间越长,回档的损失就越大。所以,一个被广泛采用的做法是为玩家数据实现一种定时存盘的机制,就像现在大多数的单机游戏一样,AutoSave。比如,每5分钟自动为玩家存一次盘,这样就可以使得回档的最大损失控制在5分钟以内。

另外,对于一些重要数据的变动,比如玩家花大量游戏货币购买了一件贵重的武器装备,这时可将玩家数据立即做一次存盘操作,这也将有效的减少玩家的重大损失。

 

听起来这是一项不错的技术,在意外宕机的时候最多只回档5分钟,而且还没有贵重物品的损失,玩家应该是可以接受的吧。

 

 

我已经听到了数据库维护员的咆哮

 

“数据库已经快要崩溃了,你就不能让每秒需要执行的SQL语句少一点吗?”

“呃………”

 

我一直以为我们的数据库非常强大,可以处理任何的数据,唯一的缺点就是查询速度比直接内存读取要慢很多。所以我使用了异步数据存取的方法,并且开启了多个数据库操作线程来并行的执行我的请求,运行的效果看起来还不错。

 

也许,我应该来算一算,每秒种究竟丢了多少条操作请求给数据库。

 

请允许我再自私一回,我已经很久没有提到WOW了……

大概可信的数字是,WOW一组服务器的玩家数量在3000到5000之间,去掉最大的数,再去掉最小的数,最后的平均值是,4000吧,就算4000。

4000人在线,假设也是每5分钟定时存盘一次,再假设所有玩家的存盘时间是平均分布的。这样算下来,每秒种就会有67个玩家向数据库发出存盘请求操作。

 

才67个,数据库维护组的同事就跟我说不堪重负了?笑话,这数据库服务器是谁买的?

先别急,67是玩家数,但是每个玩家的存盘请求不会只有一条SQL语句。

 

虽然每个游戏的内容都各有差别,但是一款MMOG需要存入数据库的数据少不了会有技能、物品、任务、宠物、好友、公会这些东西。取决于游戏的类型差异,每个游戏都会有自己的存盘方式,比如我可能会把所有的技能ID作为一条数据来存储,但是我也有可能把每个技能作为一条单独的记录来存储,这样可以方便对技能附加数据的扩展,等等。


 

文章评论