游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8369|回复: 21

[原创][意淫版]网络游戏的服务器端

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2004-8-16 01:27:00 | 显示全部楼层 |阅读模式
网络游戏的服务器端,我分为这么几个部分:
1.数据泵;作用是将数据送往数据解析器,这些数据来自各个网络连接,将被送往合适的数据解析器被解析。
2.数据解析器;作用是解析数据,解析的过程就是根据数据包里的数据,来调用特定的响应函数来对数据包作出响应,并且要给响应函数输入合适的参数。
3.数据响应函数;作用是对数据包作出响应,过程是完成一些行为。

1.数据泵:
数据泵是一个循环,在循环过程中从网络连接读取数据并把数据转交给数据解析器。
在Linux下建议使用poll()……
2.数据解析器:
功能就是根据一些数据来找到某个函数。一般是从数据包里提取出一个消息标识(可能是二进制数据,也可能是字符串),然后根据一个hash表来查找与消息对应的响应函数,找到后调用这个函数,至于函数参数,因为hash表里得用函数指针来管理函数,所以所有消息响应函数的原型都是一样的,其参数必须要让函数能够访问到它所需要的数据,一般要传入两种参数:一是数据包,这样响应函数可以从中提取一些参数;二是游戏数据集的入口,通过这个入口,能够访问到游戏里一切可由响应函数访问的数据,比如可以是一个八叉树的入口。这样就能保证响应函数能够得到它需要的数据,找到它要用到的对象。另外,如果用户控制的游戏角色在服务器端体现为一个对象,那么可以在对象所属的类里建立一个static的hash表,在服务器初始化时,从一个动态连接库里读取响应函数:比如在Linux下,先打开一个连接库,然后按照约定调用一个函数来得到这个连接库里所有响应函数的函数名以及这些函数所对应的消息标识,这时就可以把消息标识(不管是不是字符串,反正当成二进制数据处理)当作hash表里一个元素的name,把对应函数的地址当作这个元素的value。这样,这些函数都可以当作类的成员函数来看待,所以当数据泵“泵入”一个数据包时,让数据泵把数据包交给发送者(客户端)所对应的人物对象,通过调用这个人物对象的call_by_name()成员函数来把数据包以及游戏数据集入口交给适当的响应函数(直接把数据包传给call_by_name(),它会自己提取消息标识,并调用响应函数)。另外,由于那个类的所有实例在调用“成员函数”时都是通过同一个hash表来查找函数的,所以在游戏运行期间,还可以重新载入其他的连接库,以改变响应函数的实现而不用重启游戏,并且在重新载入之前创建的对象也会使用新载入的响应函数。
3.数据响应函数:
它将分析数据包里的数据,并作出反应,反应的过程将可能调用其他对象的成员函数以进行一些操作,而这些对象可以通过游戏数据集入口来查找。

数据泵其实就是所谓的“网络层”
而响应函数则完成了游戏逻辑的处理、物理逻辑处理等功能。当然,响应函数也能用来制作任务、体现剧情。
另外,上述数据泵只能带来一个只有被动响应的系统,如果想让游戏里的NPC有主动行为,可以在数据泵的循环中增加一个操作:调用NPC的breathe()成员函数。而那些被动行为可以在响应函数里体现,比如玩家A发数据包说要攻击一个叫B的NPC,在响应函数里就会是调用A的attack(B)成员函数,而A的attack()成员函数里则会调用B的be_attacked(A)成员函数,在B的be_attacked()函数里有一些代码会计算并减少B的生命值,另外还有一些代码来对“被攻击了”这个事件作出反应。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-8-16 09:27:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

呵呵,基本结构对了,不过分类有些问题。。
可以去看看《Design Patterns》看看里面是如何定义你的这些”数据泵“之类的。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-8-16 09:55:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

嘿嘿,帮人帮到底,你告诉我分类有哪些问题撒~还有要看哪些模式~ ;-)

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-8-16 10:06:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

另外,还有点问题:
我准备在poll()之后对每个连接只做一次read()/write()操作,读了多少算多少,写了多少算多少,没读完/写完的话下次循环论道这个连接的时候再接着读/写。然而问题是:
我不知道数据包应该是定长的还是不定长的,用定长的话做内存池管理比较方便,要是数据包不定长,那么得频繁分配内存,即使自己做内存池估计我也管理不好……一般来说MMORPG里的数据包是定长的还是不定长的啊?
另外,外界要向一个连接里发送数据时应该只是把保存了数据的buffer交给那个连接,然后在数据泵的循环里那些数据将被顺序地发送……但是,这些buffer怎么管理?如果用链表,可能会过于频繁地建立和销毁节点,那样效率上又有问题了……

还有,你看到我楼顶写的数据响应函数的机制了吧~是从外部的连接库读取的,我想重新编译一个连接库不会花太多时间……而且只要策划有基本的编程能力,他也应该能自己写响应函数的。这样的话,脚本系统似乎变得没有必要了啊~毕竟连接库里的函数是编译过的,执行效率要比脚本高啊~

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2004-8-16 10:13:00 | 显示全部楼层

Re: [原创][意淫版]网络游戏的服务器端

终于有人讨论服务器了。顶阿,别掉下来了。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-8-16 11:10:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

你说的问题,我给你的代码中都有解决方法,仔细去看吧。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20547
发表于 2004-8-16 13:19:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

"[意淫版]" 呵呵

看来以后发帖就要[BT版][YY版]了。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-8-16 15:07:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

晕~你给我的压缩包里我没找到文档……看代码看得晕头转向的……

说是意淫版嘛~因为还没实际写出来~呵呵

2

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2004-8-16 15:21:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

tarkey 能发一份代码给我吗?我也在学服务器,希望能给我点帮助和指点
我的信箱:zhrat_rt@163.com

感激不尽

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-8-16 18:18:00 | 显示全部楼层

Re:[原创][意淫版]网络游戏的服务器端

sjinny,你太不仔细了,我给你的EMAIL里面是有两个附件的。
一个是代码,另一个是文档。

另外楼上的,EMAIL已经发出,请注意查收。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-18 08:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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