KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 1430|回复: 7

关于UDP协议支持

[复制链接]

8

主题

22

帖子

86

积分

注册会员

Rank: 2

积分
86
发表于 2016-7-15 19:10:29 | 显示全部楼层 |阅读模式
目前我作的一个项目是个多人休闲竞技游戏,采用了帧同步的方式来设计。客户端逻辑完全由服务器来驱动。服务器每0.05秒钟发一个驱动帧,客户端的逻辑也是基于这个频率来运行。

由于KBE底层的通讯协议的基于TCP的,在wifi环境下测试时,发现经常会有多个逻辑帧一起收到,原因可能是因为 TCP的重发机制以及阻塞管理机制为了保证数据的完整性而会把具体的发送过程作了一些包装引起的。

在网络上查了一些资料,都建议使用UDP,然后自己处理丢包的情况,好象也确实没什么特别好的解决方案。

我初步想要作一下扩展,方案如下:
1、在配置文件中增加baseapp的udp监听接口,baseapp启动后,建立tcp listen的同时,也绑定一个udp listen port。
2、修改客户端插件,增加一个udp的socket receive,把它收到的数据和之前的数据合并到一起,同样处理。
3、修改客户端插件,增加一个udp的 sender,负责通过udp协议给服务器发送消息,用类似 ubasecall , ucellbase之类的方法调用
3、在服务器的base和cell端增加两个特定的mailbox ,暂时取名为 uclient,表示是udp的客户端连接 调用  entity.uclient.onTest()的时候,就是使用udp的连接进行消息的转发。
4、修改服务器udp消息处理部分,把收到的消息和tcp消息处理合并。


这里是个初步的想法,不知道这个想法要实现工作量如何,我之前KBE用了一段时间了,但是一直没有太深入的研究过源码,希望能给一些建议,多谢。

回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-7-15 20:25:20 | 显示全部楼层
我觉得这里要分几个问题来看
1,虽然同意你的udp方案,但还是你可以试试非wifi pc局域网版本测试看看是否还有经常粘帧。看看是不是无线环境产生,局域网环境不应该经常丢包所以重发不应该如此频繁。能影响的可能是滑动窗口机制,你可以试试tcp设置选项(NODELAY已开),至少知道是不是框架影响还是网络影响。

2,udp在公网可能也会出现,例如包延时是不绝对稳定的或者2个包走了不同路径。
因此你是不是还需要考虑帧平滑问题

3,要考虑是否需要可靠的udp支持,不需要可靠性支持,工作量应该不大。如果需要可靠性不如直接把tcp去掉,找个开源的udp库接上可能更好,工作量稍微大一些,需要对网络层有一些理解。



热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-7-15 20:28:09 | 显示全部楼层
随便问一下,你现在这款游戏是什么玩法?
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

30

主题

7138

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
16457
QQ
发表于 2016-7-16 11:58:10 | 显示全部楼层
http://www.gameres.com/478430.html   可以参考一下。
热爱游戏、热爱开源!
柯标
3603661@qq.com

柯标
3603661@qq.com
回复

使用道具 举报

8

主题

22

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-7-16 22:20:17 | 显示全部楼层
我们现在的游戏就是类似于现在国外比较流行的那种很多人都加在一个房间里玩,但是对实时性和各个客户端的同步精度要求又挺高的那种休闲游戏,类似于那个联网的贪食蛇游戏,物理比那个复杂一些。
第一版使用状态同步的方法实现了,后来发现效果不太好,所有的物理运算在服务器算过一次,和客户端老是有些偏差,时间上的偏差,导致频繁的拉回,感受很差,后来就想了帧同步方案,改良了一下。
基本的流程本来已经没什么问题了,之前在PC的unity editor里面测试,一切都是OK,后来发布到手机上,策划反应有时有顿卡的情况,然后我打了一下日志,服务器消息发送基本上频率都是稳定的,但是客户端收的频率不稳定,一旦有两个帧几乎同时收到,客户端就必须快进,导致视觉上的卡顿。虽然目前不是很厉害,但是考虑到真实上线后各种复杂的网络环境,所以这个问题还是要解决的。
我周一去公司的时候再好好的看一下TCP的设置能不能管用,但是我担心就算是在局域网内通过调整发送客口尺寸等手段让消息流畅一些,但是在外网下TCP的丢包检测重发机制还是有些复杂,容易引起的延时也会比较高,怕是到时候还是会碰到问题。

另外,我想实现的UDP方案是不可靠的UDP就行,因为 帧消息都是连续的,客户端发现了不连续的包的话,就让服务器重发就可以,这部分逻辑放在上层来实现,不用在底层支持。
还有,TCP的设置除了滑动窗口尺寸外,还有哪些可能影响消息连包呢?我周一一并测试一下,另外,还要在阿里云等环境下测试一下。

最后实现没办法的话,可能还是要加入UDP的支持。到时候过程中如果碰到问题,再多请教吧。
回复

使用道具 举报

8

主题

22

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-7-16 22:25:52 | 显示全部楼层
刚刚看了你推荐的文章,我好象对TCP又有些信心了:lol,我再好好测测,尽量不要引入新的复杂度
回复

使用道具 举报

39

主题

157

帖子

723

积分

高级会员

Rank: 4

积分
723
发表于 2016-7-16 22:48:09 | 显示全部楼层
联网贪吃蛇不会是国外正流行那个贪吃蛇吧,不过那个没用到物理引擎,就是个位置检测。
回复

使用道具 举报

28

主题

94

帖子

334

积分

中级会员

Rank: 3Rank: 3

积分
334
发表于 2017-10-8 13:56:43 | 显示全部楼层
题主现在是否用udp,我正想把kcp加到kbe中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-11 16:51 , Processed in 0.033218 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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