Posted on 2007-12-17 19:55
Fox 阅读(1520)
评论(5) 编辑 收藏 引用 所属分类:
G游戏编程
Author: Fox
在MMORPG中,存在大量的数据文件和脚本文件,这些文件涉及很多变量,当玩家信息需要存取时(上线、下线、保存、服务器交互),即伴随着大量的读写操作。随着游戏中游戏任务的增加,每一个玩家对应的需要数据库存取的脚本变量的数据量也随之线性增长,随着玩家数量的增加,在服务器保存玩家角色信息的时候,通信量的大小是相当可观的,使用多线程读写,可以使服务器的处理能力大幅增强,但网络和数据库承受的压力也会大幅增加。
当然现在有很多的脚本语言为我们设计任务系统提供了便利,像Lua、Python、Ruby这些动态语言的功能越来越强,而且可以肯定的是,会有越来越多的产品采用这些优秀的语言。但我今天要谈的不是如何使用动态语言,也不是讨论动态语言孰优孰劣的问题,而是对于大量的脚本变量的存取优化。说白了,这对于使用自定义脚本语言的游戏开发人员才更有参考价值。而且我要说的问题很小,小到我只是讲一点点内容,只是我今天下午的一点活,总结下来更多只是为了让自己记住,并不是教育别人。
假设在整个脚本系统中,存在500个与玩家相关而且需要数据库存取的脚本变量,如果一个游戏世界中拥有3000个在线玩家,平均每个玩家的脚本变量大小为10KB,如果服务器同时保存这3000个玩家的数据(那可不仅仅是脚本变量,当然脚本变量所占的分量比较大就是了),3000×10KB,哦……与此同时,服务器还要进行其实正常的网络通信和逻辑处理(虽然不可能是同一个线程),但服务器承受的压力已经不小了吧,为了减少这种压力,脚本变量成为了一种稀缺资源。
为了对脚本变量的存取进行优化,我想到了一个最容易实现的方法。通过对数据库的观察(其实想也想也想得到:)),我发现玩家数据中大量的脚本变量的值都是0或者空字符串,这就为优化提供了很大的一个空间。
服务器一般都保存有一个脚本变量的配置文件,在这个文件中列出了所有的脚本变量及其默认值。当玩家登录时,服务器将为其依据这个文件为其建立一份拷贝,并从数据库读取这些变量的真实值填充之。因为大量的变量值都是默认值,所以在往数据库保存的时候,是没有必要全部保存的,而只需保存那些不同于默认值的变量名和变量值以及该变量对应的下标即可。下一次从数据库读入的时候根据下标确定哪些变量值需要从数据库中读取就可以了。
很简单的一个操作,虽然做到了这一点优化,但是对于500个变量的线性读取和其他操作,依然不是一个好的处理方法。
几点改进的方向,目前只是有个想法:
1、将玩家与其脚本变量解耦
并不是所有的玩家都需要500个脚本变量的,不同等级的玩家可以参与的任务和活动是完全不同的,我们显然没有必要为每一个玩家从生到死都保持这500个变量。这样考虑下来,估计一个玩家的脚本变量数可以减少300-400个,从而实现了“垃圾”回收再利用。OMG!
想法是非常具有诱惑力的,但这一优化同时涉及到脚本策划和程序,而且稍有不慎(对某一变量重复使用),全盘皆输,在“稳定压倒一切”的大方针下,这样的优化需要给出一个系统的策略,玩家等级、职业因素的影响都要考虑进去。
2、对玩家脚本变量实现压缩存储
未经压缩的脚本变量,每个大概有几十Bytes,如果采用一个好的压缩算法,能不能减少到10Bytes呢?什么又是一个好的压缩算法呢?压缩解压缩的成本和直接存取成本比起来哪个更高呢?想想这些的确也都是问题呢。
/*****************************************************************************
这只是我工作中的一个总结,问题很简单,也很琐碎,正如我前面所提的,仅仅是提供一个参考。
*****************************************************************************/