游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6106|回复: 10

除了加锁,网游服务器是怎么解决数据同步这个问题的?

[复制链接]

3

主题

9

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2014-10-7 10:47:53 | 显示全部楼层 |阅读模式
考虑两个典型的场景

服务器里一个场景里发生了多名玩家PVP事件,玩家们各施技能打的不亦乐乎,这种激烈的时候服务器总是能收到不同client发来的命令,根据命令各个玩家的数值,状态不断发生变化,如果服务器的模型是有多个线程可以处理client发来的命令,那就一定会引发数据同步问题

网游服务器的充值一般都是通过另外一个web服务器完成,这个游戏的流通货币(充值换来的钱)本身也能在游戏中获得,玩家去web服务器充值后结果要过一会才会更新到游戏服务器中,在这个过程中,玩家仍然在继续游戏并赚取流通货币,很明显,此时游戏中也有一个线程在更新玩家的流通货币的数据,过了一会,通知玩家充值成功,流通货币发生改变的命令也会来到游戏服务器(我不确定是否一定是这种模型,如果有更好的模型各位也可以提出来),那么这种处理就发生了数据同步的问题

以上问题,我想知道业界除了加锁,有更清晰,理想的解决方法吗

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2014-10-7 11:34:06 | 显示全部楼层
加锁不是一件理想的方式,越少用到越好,或者说让用到锁的区域越小越好

可以把类似充值的异步操作作为队列压入到操作流程中,再让主逻辑去解析它



0

主题

3

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2014-10-22 11:32:58 | 显示全部楼层
用线程封闭技术,常见的封闭方法有按用户连接封闭和按地图封闭.
按用户连接封闭就是说同一个用户的用户操作请求确保由一个线程处理.
地图封闭就是说同一个地图的玩家的操作请求确保由一个线程处理.
一般来说地图封闭更好,因为同一地图的玩家是强交互的,按地图封闭可以解决玩家A打B需要扣B的血的问题,如果按用户连接封闭在这种场景下可能会和B自身的一些操作请求冲突(比如同时B自己加了血)

0

主题

9

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2014-10-28 20:40:15 | 显示全部楼层
如果游戏有较多的用户交互(如你所说的pvp),就不要使用多线程。

88

主题

2743

帖子

4227

积分

论坛元老

Rank: 8Rank: 8

积分
4227
发表于 2014-10-28 21:24:58 | 显示全部楼层
“如果服务器的模型是有多个线程可以处理client发来的命令,那就一定会引发数据同步问题”
拜托,楼主可以服务器处理client side的机制弄明白好伐;

其二,能否将你手里的服务器处理client side数据代码段发出来看看,到底是异步还是同步处理的好伐!

1

主题

23

帖子

111

积分

注册会员

Rank: 2

积分
111
发表于 2014-11-4 16:57:11 | 显示全部楼层
逻辑切片...

0

主题

7

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2014-11-4 17:25:39 | 显示全部楼层
尽量少用锁,可以把对不同线程可以同时修改的数据进行的操作,放到单独的一个线程中执行。

0

主题

9

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2014-11-12 13:47:01 | 显示全部楼层
收socket包肯定是多线程,windows就用iocp。 这只是纯粹io上的多线程,然后可以通过lockfree队列导入到单线程的逻辑线程中去

88

主题

2743

帖子

4227

积分

论坛元老

Rank: 8Rank: 8

积分
4227
发表于 2014-11-23 11:04:47 | 显示全部楼层
番石榴 发表于 2014-11-12 13:47
收socket包肯定是多线程,windows就用iocp。 这只是纯粹io上的多线程,然后可以通过lockfree队列导入到单线 ...

用伪代码说明一下嘛

2

主题

8

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2014-11-25 11:06:38 | 显示全部楼层
对于战斗: 可以采用事件队列,多线程入口,单线程出口的EDT模式来处理
对于充值:RMB充值获得的金币与游戏里面获得金币需要分开存储这样方便数据统计与处理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 23:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表