游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5465|回复: 7

[原创][笔记]关于编程中网络通信部分的实现

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2006-4-5 09:42:00 | 显示全部楼层 |阅读模式
基于TCP协议,在应用层实现消息定界。
基本消息结构:
LTV
Length - Type - Value
定长 - 定长 - 不定长
Length用于消息定界,Type用于描述Value在具体应用中的含义或内容。
每个消息,都是某个具体类实例的数据部分。通过网络传递一个消息,其实也就是传递一个对象。
对于网络消息,根据其Type值,以及一个Type-Class对照数据,可以知道这个消息应该被还原成哪个具体类的实例,这个具体类可能是内置于系统之中的,也可能是处于从外部载入的DCL中的。确定其对应的类之后,就要根据其Value,生成一个对应的具体类的具体实例。由于对应的类可能是从外部载入的,所以这个具体类的数据结构信息对于系统来说可能是未知的或模糊的,因此Value之中各个数据项的解析不由系统完成,而由对应的具体类来完成,但是系统可以提供一些基本的数据操作服务。因此可能在将消息转换为一个具体类的具体实例之前,先要使用消息类对其进行封装,在消息类中会提供一些基本的数据操作服务。只把Value中的数据相的值传递给具体类,而不把Value的地址信息传递给Value类,这样可能可以提高安全性,而这可能就要求具体里对 Value的操作都要通过系统提供的数据操作服务来完成,也就是通过消息类来完成。
在将一个网络消息转化为一个具体类的实例之后,可以通过一个统一的访问接口,来让这个对象执行某些操作,以对这次通信进行一些响应和处理。所以操作的传递,或者说操作请求的传递,也是通过对象数据的传递来实现的。可以按照消息收到的先后顺序,将得到的对象顺序串起来,比如形成一个链表,然后一个一个的顺序执行,这样一个对象就是一个基本的操作单元,基于这样的结构,甚至可以实现判断、分支、循环等操作。通过对象来执行消息响应操作还有一个好处,那就是对于细节未知的响应函数,系统不需要进行参数的传递,这里操作参数的传递都是在对象的成员函数之中实现的,所以系统不需要了解具体响应操作的任何细节,同时对于响应操作的参数形式也不会有任何限制。
对于一个等待传递的对象,我们需要根据它来生成一个网络消息。所以根据这个对象所属的具体类,以及Class-Type对照数据,可以知道生成的消息之中的Type应该是什么值,然后让这个对象自己对其自身的数据进行打包封装等处理,得到消息中的Value,最后组成一个完整的网络消息,然后将其发送出去。让对象所属的具体类来进行数据的封装和打包,而不由系统来进行封装和打包,这样虽然具体类的编写任务多了,但是有个好处,那就是系统不需要了解对象的数据结构这样的细节,同时也意味着系统不会对具体类的数据结构有任何限制。
但是另一方面,可以考虑是否可以让具体类提供一个标准化的描述信息,然后让系统来完成打包和封装,这样的机制可以让具体类的编写更为容易,打包和封装的操作更为统一,而这样意味着当收到消息时,Value的解析也许也应该由系统来完成,可是这样的话,具体类的实例的生成也许会有些麻烦。
另外,在LTV结构的Value之中,也可以再嵌套LTV结构,所以LTV是个第归的、层次化的结构。不过对于Value中的不定长数据,因为 Value的结构信息一般可以得到,所以嵌套的LTV结构之中的Type值可能可以省略,而当这个不定长数据项是由更小的等长数据项组成的,也可以使用数据来定界,比如字符串是由等长的字符组成的,这样可以用一个特殊字符'\0'来作为边界数据,以此来描述这个字符串的结尾。

[em5]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-4-5 10:18:00 | 显示全部楼层

Re:[原创][笔记]关于编程中网络通信部分的实现

我顶~

30

主题

569

帖子

569

积分

高级会员

Rank: 4

积分
569
发表于 2006-4-6 17:09:00 | 显示全部楼层

Re:[原创][笔记]关于编程中网络通信部分的实现

    网络游戏其实就是间隔性的更新客户端的所有对象,并在刷新来临前进行预测。
    好点的公司应该有能力实现自动绑定类对象和消息。服务器端和客户端应该使用同样的类型,同样的结构。

5

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2006-4-8 01:35:00 | 显示全部楼层

Re: [原创][笔记]关于编程中网络通信部分的实现

请问贴主,我前些天突然想到,比如在地球两端如中国、美国的两个玩家打cs,那么网络信息的传送速度能跟的上30的FPS吗?因为两地距离2万公里,光速每秒30万公里,cs每秒要有30帧......
可能我想错了,毕竟网络方面我只学了几个winsock聊天的例子,但似乎没错,比如夸张点 牛朗织女打电话,“你好”“谁啊”“我啊”这就得十几光年

17

主题

165

帖子

167

积分

注册会员

Rank: 2

积分
167
发表于 2006-4-8 08:23:00 | 显示全部楼层

Re:[原创][笔记]关于编程中网络通信部分的实现

回楼上的,FPS和网络传输没什么关系吧。

5

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2006-4-9 02:02:00 | 显示全部楼层

Re: [原创][笔记]关于编程中网络通信部分的实现

回kyo,我对游戏的网络部分,或者说网络编程都只限于几个winsock的例子,只是根据我的想法,为了同步和公平,每个玩家需要从服务器接受其他玩家每一帧时的位置、动作等信息,然后把自己的信息传给服务器,再由服务器广播给其他玩家,这中间信息的传递就费了周折,如果不太漫长的话,当然就是正常情况了,如果按我前面说的,距离2万公里的玩家,甚至以前还有人说“管他是在月球还是火星”,我觉得那样的话,每秒肯定传递不了30帧的信息了,本机fps当然靠显卡了,我说的是信息传递能不能跟的上fps,,,

不知我的想法是不是和实际对应,,,贴主好像很忙似的

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2006-4-9 12:38:00 | 显示全部楼层

Re:[原创][笔记]关于编程中网络通信部分的实现

汗…………这个……我也是菜鸟一只,我发这个帖子其实是像请大家看看我这个想法行不行……

boboxingxing,根据我个人的理解,我觉得无论是网络游戏还是联网游戏,都不应该每帧都发送数据来同步,不然不同机器上的帧数不同或不稳定该怎么办呢。我的想法是,以一定的频率发送需要同步的对象的基本数据,比如一个角色的位置、速度等信息,另外一方面,在某个客户端上,当玩家的操作改变了角色的状态时,就把这个状态的改变情况发送出去以进行同步。
这个我也觉得说不清楚,举个例子吧。
A和B两台机器,它们各自控制了一个物体的运动,模拟的有位置、速度、加速度这些量。那么以频率f1来同步位置,以频率f2来同步速度,以频率f3来同步加速度。这里的频率指得是每秒同步的次数,与帧率无关。速度是位移的导数,加速度是速度的导数。所以它们更新频率的关系应对是:f1 < f2 < f3
含义是同样的一段时间里,位置信息同步的次数最少,加速度更新的次数最多。我这样设计的原因是:
位置、速度、加速度,这三者的变化一个比一个更频繁,所以如果以同样的频率f来更新它们,那么更新位置信息的效率最低,最不合算,因为位置变化的最快,所以同步的效果就最差。而不管是同步位置信息还是速度信息或者加速度信息,一次同步的成本是差不多的,所以为了提高对同步通信的利用效率,我让变化最快的位置信息的同步频率最低,变化最低的加速度的同步频率最高。
另外我还要说的是,虽然位置变化的快,而其同步频率低,似乎这样会导致同步效果差,但是我这样做是因为位置还可以根据速度和加速度计算出来,而另一方面,因为网络通信的速度不够理想,所以即使以很高的频率去同步位置信息,恐怕显示出来也是很不平滑的,同步的效果仍然很差。所以这里的同步,主要是依靠同步加速度,同步速度是为了纠正加速度计算出的速度的误差,同步位置则是为了纠正由速度计算出的位置的误差。
以上是我的想法,大家一起讨论讨论吧……

2

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
QQ
发表于 2006-5-1 14:07:00 | 显示全部楼层

Re: Re:[原创][笔记]关于编程中网络通信部分的实现

sjinny: Re:[原创][笔记]关于编程中网络通信部分的实现

汗…………这个……我也是菜鸟一只,我发这个帖子其实是像请大家看看我这个想法行不行……

boboxingxing...

预测+同步
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 10:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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