手游server之数据IO进化

这里数据IO是指游戏数据存盘和读取。


假设IO处理不好。server在IO时会导致。游戏卡顿较长的时间,严重影响游戏体验。


近期服务端刚好对IO这一块做了优化,把优化过程记录一下。



一 原始版

刚開始立项的时候,仅仅是做了一个Demo,加上也刚開始做服务端,仅仅是做了一个仅仅可以測试用的server。


当时是在每一个场景对象area中加入了一个users对象,通过uid来保存每一个玩家的数据。
当玩家登录的时候,将玩家的数据读入。退出的时候将玩家的数据写回。

var users = {};function onLogin(uid){var user = DBMgr.read(uid);users[uid] = user;
}function onLogout(uid){var user = users[uid];DBMgr.write(user);delete users[uid];
}

为了防止server宕机数据丢失,再添加了一个定时存盘。
function onTick(){for (var uid in users) {var user = users[uid];DBMgr.write(user);}
}

这样做有两个非常明显的问题:
1 假设一个玩家下线之后马上又一次登录,就会又一次IO的过程;
2 每次都须要将所有玩家的数据写入。玩家多了之后会卡非常长时间。



二 进阶版

为了解决如上问题,添加了一个cache。


玩家离线后。先将其数据移到cache中,每隔一段时间,将cache中的玩家写入存储介质中。


登录的时候先在cache中查找玩家的数据,假设找不到。再去读数据。


然后结构就变成了这样:

var users = {};
var cache = {};function onLogin(uid){if (!!cache[uid]) {users[uid] = cache[uid];delete cache[uid];} else {users[uid] = DBMgr.read(uid);}
}function onLogout(uid){var user = users[uid];cache[uid] = user;delete users[uid];
}function onTick(){for (var uid in cache) {var user = cache[uid];DBMgr.write(user);delete cache[uid];}
}

然而,前面两个问题并没有彻底地解决掉。


1 假设玩家下线之后。刚好onTick时间到,这样数据就被写回了,下次登录就得又一次读一次;
2 若是在onTick这个周期内下线的玩家太多。onTick之中还是会有非常多玩具须要写入。

三 终极版

为了优化前面的两点,不再玩家的数据移到cache,而是在cache中保存玩家的下次存盘时间。
每次登录直接在users中找数据,假设找不到,就读数据库。


假设玩家下线。就将其下次存盘时间在变为对应的负数,来标记玩家已经下线。


在onTick中,先将到存盘时间的玩家存盘,然后已下线的玩家从users和cache中同一时候移除。

var users = {};
var cache = {};function onLogin(uid){var user = users[uid];if (!user) {user = DBMgr.read(uid);users[uid] = user;cache[uid] = curTime + WRITE_GAP;// WRITE_GAP为存盘间隔时间}
}function onLogout(uid){cache[uid] = 0 - (curTime + WRITE_GAP);
}function onTick() {for (var uid in cache) {var time = cache[uid];if (curTime < Math.abs(time)) {continue;}DBMgr.write(users[uid]);if (time < 0) { // 离线玩家delete users[uid];delete cache[uid];} else { // 在线玩家cache[uid] = curTime + WRITE_GAP;}}
};


这种结构定时存盘一批玩家数据,即使玩家离线也能够在内存中保存一段时间。

眼下我们的服务端存盘机制就是这种,假设以后有优化再补充。

转载于:https://www.cnblogs.com/wzjhoutai/p/6940512.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSP430F5529 DriverLib 库函数学习笔记(十二)I2C实战

目录上机实战I2C给 DAC 芯片 DAC7571 写入数字量DAC7571 介绍程序分析引脚复用I2C 初始化发送一个字节发送一个字读取一个字节读取多个字节中断服务函数整体代码main.cMSP430F5529_I2C.cMSP430F5529_I2C.h实验结果I2C 读取 TMP421 温度TMP421 简介程序摘要TMP421初始化温度的读…

mysqldump造成Buffer Pool污染的研究 [转]

原文链接&#xff1a;http://www.shaoqun.com/m/a/43307.aspx 前言&#xff1a; 最近Oracle MySQL在其官方Blog上贴出了 5.6中一些变量默认值的修改。其中innodb_old_blocks_time 的默认值从0替换成了1000&#xff08;即1s&#xff09; 关于该参数的作用摘录如下&#xff1a; h…

自动加载缓存框架

2019独角兽企业重金招聘Python工程师标准>>> 自动加载缓存框架 代码&#xff0c;请访问github 获取更详情&#xff0c;更新的内容 QQ交流群:429274886&#xff0c;版本更新会在群里通知&#xff0c;能了解最新动态 0.5版本已经是稳定版本了&#xff0c;大家可以放心…

(数据科学学习手札139)geopandas 0.11版本重要新特性一览

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP430F5529 DriverLib 库函数学习笔记(十三)认识低功耗模式

目录硬知识低功耗模式MSP430单片机各工作模式下的电流消耗API进入低功耗模式退出低功耗模式平台&#xff1a;Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 硬知识 低功耗模式 MSP430单片机具有7种低功耗模式&#xff08;LPM0…

剖析虚幻渲染体系(16)- 图形驱动的秘密

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

方法性能分析器--装饰者模式应用

<!DOCTYPE html> <html> <head><title>方法性能分析器</title><meta charset"utf-8"> </head> <body> <div id"list-container"></div><script>function $(id){return document.getEle…

Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握

前叙 博主写这篇文章使用了八十分钟,阅读需要十五分钟,读完之后你将会学会在Python中使用NLPIR2016.如果你花费更多的时间练习后半部分的例子,你将能够在一天内学会在Python中使用NLPIR2016的全部所需知识 如果你想要获取更详细的API翻译,你需要进一步学习ctypes,附赠一篇关于…

微信朋友圈也可以发语音你们造吗?

在微信朋友圈发照片太矫情&#xff0c;小视频又耗流量&#xff0c;只发文字又太单调&#xff0c;何不发段语音来呼朋唤友呢&#xff1f;你是说朋友圈发语音&#xff1f;这是真的吗&#xff1f;sure&#xff0c;开发者已经利用微信JS-SDK接口实现了&#xff0c;扫描下方的二维码…

MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)

目录硬知识看门狗定时计数器 &#xff08;WDTCNT&#xff09;看门狗模式定时计数模式看门狗定时器中断时钟故障保护功能低功耗模式下的看门狗操作看门狗定时器控制寄存器WDT_A API (机翻)参数上机实战定时计数模式配置中断服务函数整体代码实验结果看门狗模式配置整体代码平台&…

初学 Unsupervised feature learning and deep learning--Sparse autoencoder

今天做了一下 Stanford CS294A 的一个 programming assignment: sparse autoencoder 因为之前做过 Andrew Ng 的 ml online class 的 neural network 那节的作业&#xff0c;所以这个实现起来就很 easy 了。直接贴代码&#xff08;all vectorized&#xff09;&#xff1a;1 [d …

【Nginx】Windows平台下配置Nginx服务实现负载均衡

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

PLC基础入门

PLC编程入门基础技术知识学习 2016-06-27 xjp7879 摘自 电工技术知...第一章 可编程控制器简介 可编程序控制器&#xff0c;英文称Programmable Controller&#xff0c;简称PC。但由于PC容易和个人计算机&#xff08;Personal Computer&#xff09;混淆&#xff0c;故人们仍习…

MSP430F5529 DriverLib 库函数学习笔记(十五)SFR 模块

目录API (机翻)SFR管理中断的函数SFR 管理RST/NMI引脚控制的函数参数平台&#xff1a;Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) API (机翻) 特殊函数寄存器API提供了一组用于使用MSP430Ware SFR模块的函数。提供了启用和禁…

View,SurfaceView,SurfaceHolder

View&#xff1a;对于绘画来说&#xff0c;最重要的步骤是重载 onDraw方法并且修改画布Canvas。 SurfaceView&#xff1a;1&#xff0c;You can control the format of this surface and, if you like, its size; 2&#xff0c;One of the purposes of this class is to provid…

Xcode 的正确打开方式——Debugging

2019独角兽企业重金招聘Python工程师标准>>> 程序员日常开发中有大量时间都会花费在 debug 上&#xff0c;从事 iOS 开发不可避免地需要使用 Xcode。这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式。 “If debugging is the process of removing…

VS Code 调试 PHP有关配置

一、安装VS CODE 、 WampServer 二、用VS Code 打开php项目后&#xff0c;提示 "Cannot validate since no PHP executable is set. Use the setting php.validate.executablePath to configure the PHP executable." 解决方法如下&#xff1a; 在“文件”-“首选项”…

MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B

目录硬知识比较器B介绍比较器 B 的特点比较器 B 的结构模拟输入部分比较部分基准电压部分低通滤波部分比较器和普通运放的区别比较器B测量电阻原理利用比较器B实现电容触摸按键原理比较器B控制寄存器COMP_B API (机翻)介绍处理初始化和输出的函数参数处理中断的函数参数处理COM…

深入解析kubernetes controller-runtime

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

数据结构练习 00-自测3. 数组元素循环右移问题 (20)

一个数组A中存有N&#xff08;N>0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;M>0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A0A1……AN-1&#xff09;变换为&#xff08;AN-M …… AN-1…