请教在网络游戏中,数据库主从同步的原理操作是使用同步方

【面试必读(编程基础)】网络游戏同步方式(帧同步和状态同步)
【面试必读(基础)】网络游戏同步方式(帧同步和状态同步)
在做网络游戏的时候首先要做的是选择一种同步方式来使用,网上的文章都是说帧同步与状态同步的选择,但是又经常讲的模糊不清,我大概整理了一下,并且有一种我们现在项目用的网络同步方式
状态同步就有好几个说法,说是同步状态,同步操作等,又找不到一遍文章能清楚的讲一遍什么是状态同步。
所以大概总结一下就是,状态同步是通过每个客户端发送自己的操作给服务器,这时客户端不进行任何动作,服务器统一计算后并把结果同步个每一个客户端。
这里要点就是,同步操作,服务器结算结果。
这里讲了这两种同步方式的区别,但是依然没有很清楚。状态同步也找不到更好的文章,如果你有的话也请在评论区分享一下一起学习。
帧同步是在关键帧的时候同步操作给服务器,服务器转发操作给每个客户端。客户端之间要接受到关键帧才可以进行操作。
帧同步里面有一个关键技术就锁帧,也就是如果没有收到广播的关键帧不能进行下一步操作。大家静止不动。
而现在的游戏会有一个聪明一点的方法叫做乐观帧锁定
乐观帧锁定通过定时发送关键帧的方法,不锁定任何客户端,服务器一定时间间隔就发包给每个客户端,包里可能是空包也有可能是你自己活着别人的操作。而客户端就通过定时或者每当操作就发包的形式告诉服务器自己的操作。
但不论是什么形式的帧同步都是客户端收到其他玩家的操作后自己模拟行为。所以这个就需要大家如果是随机的时候要保证一致,也就是有一样的随机种子,而且在每个客户端中无法保证一定一致,也就是这个原因帧同步一般会用着竞技类游戏,游戏都是一盘一盘的来,每盘开始就给大家统一的第一帧和随机种子,保证这个游戏在每个客户端中基本一致
其实在网速好的时候这些都不是问题,基本上不同客户端上的表现基本一致。
而当网速不一致时,当你选用乐观帧同步的话就可以保障网速好的不会被网速差的玩家卡住
所以能看到,其实在手游时代,状态同步基本是不可取的,服务器压力太大,对网络要求太高。
而帧同步的话也会选择乐观帧同步,保证在网速好坏不同的情况下还能一起玩,并且网速好的玩家不会受干扰。
自己游戏的同步方式
我们是一个mmoarpg手游,也就是动作类网游。
由于我们的游戏类型,其实不需要真的非常同步,并且可能有很多个玩家同屏,首先抛弃状态同步
接着我们也不是竞技类游戏,所以基本上也不需要帧同步。
所以我们同步也就是客户端发送请求给服务器,服务器验证一下,如果出入太大强行拉回,不然也不返回给自己客户端,只同步位置给其他客户端。
技能上就是客户端请求使用技能,在技能中的打击帧告诉服务器这个人我能不能伤害,服务器判断并同步给大家这个伤害。
所以基本上算不上什么同步方式。
但是如果我们之后需要做更为严肃的pvp玩法,则需要帧同步来进行操作。这个可能会在后面补充后使用快捷导航没有帐号?
查看: 1508|回复: 12
数据同步的请教
高级会员, 积分 664, 距离下一级还需 336 积分
论坛徽章:3
场景为:一共有33个数据库服务器,每个省一个oracle数据库,全国的数据库用来汇总各省数据,当然哈,这33个数据库的表结构都一样。需求是,需要每日将各省的数据增量同步到全国库中,比如有10个表,T1,T2,...,T10,每个表都有一个时间戳字段intime,根据这个intime来取得一天的数据,然后同步到全国库。现在使用脚本来实现,请问能用oracle数据库自身提供的类似datagud之类的东东来实现吗?
论坛徽章:7
高级会员, 积分 664, 距离下一级还需 336 积分
论坛徽章:3
to 还不算晕,能说详细点吗
高级会员, 积分 664, 距离下一级还需 336 积分
论坛徽章:3
还不算晕 发表于
能说详细点吗
论坛徽章:7
如果需要实时将30省同步到一个,可以用OGG,表同步。。如果是每天的一定时间将省表内数据同步到一个库的多个表,就好办了,可以EXPDP导入导出了哈哈
高级会员, 积分 664, 距离下一级还需 336 积分
论坛徽章:3
还不算晕 发表于
如果需要实时将30省同步到一个,可以用OGG,表同步。。如果是每天的一定时间将省表内数据同步到一个库的多个 ...
谢谢哈O(∩_∩)O~
论坛徽章:27
看样子不是时时的,可以跑个定时任务,用一张表记录执行结果,对失败的任务重新执行。
金牌会员, 积分 2950, 距离下一级还需 50 积分
论坛徽章:7
stream 就可以了吧。 如果用DG ,应该用逻辑standby,那就不如就用stream了。还简单。OGG 是个花钱的东西,当然也可以。
论坛徽章:23
最省事的就是ogg,但要收费 -- goldengate
staream -- 免费的
高级会员, 积分 664, 距离下一级还需 336 积分
论坛徽章:3
能否给发些资料哦,能明白具体原理的那种
扫一扫加入本版微信群数据库实时同步技术解决方案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据库实时同步技术解决方案
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩28页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢主题 : 请教:关于redis与sqlserver数据同步的问题
级别: 新手上路
可可豆: 34 CB
威望: 34 点
在线时间: 10(时)
发自: Web Page
请教:关于redis与sqlserver数据同步的问题&&&
l 数据缓存层为了提高服务器的响应速度,我们会将需要处理的实体数据放到缓存中,减少从数据库取数据的次数,同时缓存中的实体数据被改变后,引擎以异步的方式(100ms延迟时间)将数据同步到数据库中;当缓存中的数据一定时间(可配置)未被使用时,引擎会自动将内存释放掉。缓存的类型分为共享全局的和私有的两种,共享的缓存如果在内存中不存在时,它会从数据库中加载所有的数据到内存中;而私有类型的只会根据相应的Key加载部分数据到内存中;因此玩家特有的数据(如:背包,任务,副本)定义成私有的,像排行榜类型的定义成共享的。以上是在Scut入门初级教程中的说明但是在测试时发现,除非我用var cache = new ShareCacheStruct&UserRanking&();cache.TryRecoverFromDb(new DbDataFilter(0));手动从数据库回复,系统是不会自动在数据库中查找数据的而且,如果redis服务器重启,通过TryRecoverFromDb进行数据恢复EntityPrimaryKey_UserRanking 这个关键字是没有恢复的,而是在调用 cache.GetNextNo() 时重新创建也就是说,关键字将重新从1开始不知道是我的配置问题还是本来就没有实现数据库与redis的自动同步请赐教
级别: 版主
可可豆: 671 CB
威望: 671 点
在线时间: 87(时)
发自: Web Page
你的问题在Redis丢数据的问题,&&查看的同步数据配置; Redis数据丢失使用TryRecoverFromDb进行数据恢复,是临时处理下,在游戏业务里不要有这种代码,而且Redis服务是不直接关闭的,关闭前需要使用命令将数据备份到磁盘EntityPrimaryKey_UserRankin是Redis的自增编码功能, 不能恢复
级别: 新手上路
可可豆: 34 CB
威望: 34 点
在线时间: 10(时)
发自: Web Page
意思就是 DB 只是用来作数据备份 或用于统计分析等而Redis是真正的核心业务数据库需要考虑Redis的数据一致性、备份、恢复等问题我的理解对吗?
级别: 版主
可可豆: 671 CB
威望: 671 点
在线时间: 87(时)
发自: Web Page
回 2楼(franckytang) 的帖子
没错, 是这样的
级别: 新手上路
可可豆: 1 CB
威望: 1 点
在线时间: 1(时)
发自: Web Page
请问楼主是怎么做到的redis与mssql&&数据同步的?&&&&&&我现在也在研究这方面的东西。 但是苦于没有思路。&&诶诶诶
级别: 版主
可可豆: 671 CB
威望: 671 点
在线时间: 87(时)
发自: Web Page
回 4楼(lele32741) 的帖子
没能直接将redis同步到MSSQL, 而是先将数据取出反序列化Entity,再更新MSSQL
级别: 新手上路
可可豆: 34 CB
威望: 34 点
在线时间: 10(时)
发自: Web Page
回 4楼(lele32741) 的帖子
我的理解是这样的首先是数据对象的定义,这里EntityTable( CacheType.Entity,&ConnData&)中的ConnData是在config文件中定义的数据库连接字符串的名称,EntityField说明这是实体字段,会被自动创建到数据库[Serializable, ProtoContract]&&&&[EntityTable( CacheType.Entity,&ConnData&)]&&&&public class UserRanking : ShareEntity&&&&{&&&&&&&&public UserRanking()&&&&&&&&&&&&: base(false)&&&&&&&&{&&&&&&&&&&&&CreateDate = DateTime.N&&&&&&&&&&&&Items = new CacheList&EquiAttrInfo&();&&&&&&&&}&&&&&&&&[ProtoMember(1)]&&&&&&&&[EntityField(true)]&&&&&&&&public int UserID&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&[ProtoMember(2)]&&&&&&&&[EntityField]&&&&&&&&public string UserName&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}}然后按官方的说法,会定期将Redis中的数据同步到数据库,如果此时数据库中没有相应的表,会自动创建在config文件中加入&add key=&Game.Cache.UpdateDbInterval& value=&10000&/&用于配置数据同步的周期如果你需要手动同步,调用DataSyncQueueManager.SendToDb例如:&&&&&&&&var ranking1 = new UserRanking();&&&&&&&&&&&&&&&&ranking1.UserID = (int)cache.GetNextNo();// user.UserId;&&&&&&&&&&&&&&&&ranking1.UserName = &TangXin&;&&&&&&&&&&&&&&&&ranking1.Score = 100;&&&&&&&&&&&&&&&&cache.Add(ranking1,1);&&&&&&&&&&&&&&&&DataSyncQueueManager.SendToDb(ranking1);这样数据会立即同步到数据库
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版

我要回帖

更多关于 网络游戏收入数据库 的文章

 

随机推荐