内网测试服 策划配表专用 一份svn配置
配置 svn:test_excel
作用 全局测试 稳定版展示

内网稳定服
配置 svn: excel 由内网测试服测试稳定后拷贝过来
作用 全局测试 稳定版展示
配置
稳定测试 全局测试 一份svn配置(由内网测试服测试功能及配置后拷贝过来)

外网正式服
外网测试服

测试核心

设计测试用例

自动化测试

正确使用定时器

定点定时器任务 某一时刻执行
循环定时器任务 每隔?执行

定点定时器任务 应用 
    如 0点重置,0点重置后再添加下一个零点任务
    活动开启与关闭,无需开启循环定时器轮询检测,只需给每个活动添加开启定时器与关闭定时器即可

循环定时器任务
    每个几秒轮询 检测条件成立


优化 定时器任务排序
比较最小时间戳,一旦小与某一任务事件戳就不在进行遍历,只是插入任务有消耗,最小堆

不使用 定时器

参考

定时器实现

定时器核心就两种 计时器(每个多长时间触发一次)和定时器(定点触发)
每隔多久执行一次

定时执行一次

bool Init();
void ShutDown();

消息分发处理
void ProcessMsg();
日志

初始化
关服处理
日志记录
消息处理(接受分发)
定时器
信号
简单服务器配置加载

DB
Redis+MySQL

共享内存

服务器效验
参数效验
参数是否为空
类型是否正确
数值转化 比如接收数据做 tomumber() tostring()处理

以服务器数据为准
客户端传入参数 要做服务器配置表中检测是否存在
不要相信客户端传入金币 、钻石、登材料消耗值,应该由服务器拿
配置表id去读取金币、钻石等数量

配置表兼容处理
在写代码时提前做兼容处理
如配置表 {gold=1, money=2}
策划可能后期去掉money消耗,又未通知程序
所以服务器应在读取配置表时做为空判断 为空 则停止运行 并与策划交流
并在使用时 做二者为空判断 为空默认0数值使用

老数据效验
造成原因 新配置表与老数据不一致 基于新配置传递的参数在老数据中找不到或不正确
处理 效验 确定老数据则log并返回客户端操作失败

配置应该分层
全服配置
与服务器本身配置无关
通用服务器配置

单服服务器配置

本地配置

低层级能覆盖高层级配置

参考unix conf里include conf

游戏配置 通常与客户端共享

服务器配置

服务器读取配置表时 不能以序号作为id,要单独配置id,比如第一列
对于配置表的修改应遵循
id递增、不能重复
增加行
以最后一个id 递增 最后插入 或其它规则、不能重复
删除行
配置表中直接删除这一行,不能再此位置添加相同id的行,会导致玩家id对于数据与所配置不符合

参考

数据备份的重要性

数据备份的时机

什么时机备份:实时?闲时
备份存储位置:原服务器上并复制备份到非服务器计算机上(避免服务器死机,硬件崩坏)
备份检测:针对备份数据应该在内部环境 测试服进行备份数据恢复测试,保证

备份数据的恢复

参考

核心

写缓存
减少次数
持久化保证数据完整性

1 游戏的数据库一般分 角色数据库和账号数据库
2 账号数据库一般与平台绑定,通常情况下不会提供给你访问账号数据库的权限,而只会给你提供验证接口.
3 角色数据库也不是通常意义的直接从数据库中读,通常会有个缓冲,这个缓冲会动态调整保存活跃度较高的玩家数据
4 3中的缓冲通常由角色服务器来提供这样的功能

gameserver缓存 dbserver缓存

dbserver缓存 玩家数据 + 公有数据

优化
-游戏服务器数据缓存跟持久化中间件设计总结
策略
dbserver 动态调整缓存活跃度较高的玩家所有数据
玩家下线后 持久化到mysql 同时定制redis缓存保留5分钟自动清理(用于 玩家掉线 重连)

尽可能不要过个服 对dbserver 请求读取及持久化

游戏里比较纠结的DB操作是:A、B两个模块同时发起对某个对象的保存或读取,这样很难保证新存的数据被旧的覆盖或者读取到得不是最新数据。 
如果序列化这些操作,又失去了异步的意义。

gameserver缓存设置脏标 dbserver缓存设置脏标
gameserver定期更新脏数据到dbserver缓存
dbserver缓存定期持久化脏数据到mysql
需要实时持久化的 立即更新到dbserver缓存并持久化到数据库

可开多个线程持久化dbserver缓存到mysql
持久化 加入队列机制 可设立持久化优先级

如何保证持久化时 是完整的数据,将缓存数据拷贝进行持久化

需要其他玩家离线数据怎么办


一个逻辑上的东西拆成2个函数来完成,确实代码不美观,不易阅读。不过好在这部分逻辑较少。大部分数据在玩家上线时已经加载到GameServer内存了。少数像玩家房屋之类的just in time的数据就需要做这样的回调。不知道谁有更好的方法

DB接口

加载所有名字
服务器启动时 调用 缓存名字列表 并同步列表 用于角色取名时去重检测
bool LoadAllName();

加载帐号下所有角色信息
玩家登陆后选择角色界面数据展示(仅包括需要显示的基础数据(名字、级别、装备等))
bool LoadAcctRoles(ui32 nAccountID, vector& vInfos)

创建角色

bool CreateRole(ui32 nAccountID,const string& strName, ui8 nGender, ui8 nClass, ui8 nRace, RoleInfo& info)

删除角色
bool DelRole(ui32 nAccountID, ui64 guid);

##