游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6164|回复: 13

网络服务器设计用到的设计模式2:Command类

[复制链接]

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-10-18 16:37:00 | 显示全部楼层 |阅读模式
是的,我看过一些代码是这么写的。
char *recvbuf;
switch (recvbuf[0])//第一位一般是消息类型。
{
  case ACT_MOVE:
.    handlemove();
break;
case ACT_ATTACK:
handleattack();
break;
...
}
这种类型的代码存在很久了,可能BSD套接字一开始就这么写的。为什么我们不设计成为Command模式呢?
class Operation
{
  public:
   void handle();//这应该是个虚函数
   private:
    BYTE _id;//当然,假如你以文本来表示的话,这里面应该是std::string吧?
   Entity *_from;
   Entity *_to;
  ....
};

从char *msg怎么到Operation呢,这里面为了以后的扩充,可以再另外加个Serial类。客户端调用这个类把Operation写到Buffer,服务器端用这个类解包出来。
同时可以缩减switch的开销;你可以用
POperation _operations[255];
然后一开始全部置为0,仅在Operation的_id有的时候,把_operation[_id]设为这个Operation的一个实例,这样,解析的时候可以一开始就找到这个类。

同时,数据在前台数据和后台数据传输的时候可以用很直观的方式把一个Operation传到后台的AI服务器。

11

主题

1265

帖子

1265

积分

金牌会员

Rank: 6Rank: 6

积分
1265
发表于 2004-10-18 16:40:00 | 显示全部楼层

Re: 网络服务器设计用到的设计模式2:Command类

[em7] [em7] [em7] [em7] [em7] [em7] [em7] [em7]
虽然看不明白,还是顶一下

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-10-18 20:34:00 | 显示全部楼层

Re:网络服务器设计用到的设计模式2:Command类

:) 我一直都是这样做的。
不过不是用的数组储存,而是用的hash表。类似:
class CModuleEngine
{
        int LoadModuleByID(int id, CModuleBase *);
};

收到消息之后,直接:
char *msg;
CModuleBase *m_module = FindModuleByID(((Package_t *)msg)->ID);
m_module-&gtrocessModule(msg);

0

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
QQ
发表于 2004-10-19 10:34:00 | 显示全部楼层

Re:网络服务器设计用到的设计模式2:Command类

虚函数,类创建,开销大,不能体现command的优点,没有意义.^_^

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
 楼主| 发表于 2004-10-19 15:38:00 | 显示全部楼层

HASH表显然扩展性强一点,要是确保你的消息ID头只有一个B

虚函数不行的话,这里面可以直接用一个函数指针来代替(或者可以用类成员函数指针来代替以取代虚函数开销)

0

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
QQ
发表于 2004-10-19 16:17:00 | 显示全部楼层

Re:网络服务器设计用到的设计模式2:Command类

呵呵,虚函数也是函数指针.一样的...还是要一层寻址开销..
command个人觉得最大优点在于可以队列化,和执行的撤销/保存...但不用command,网络流本身就是一个队列,所以,我觉得command用于命令的传输没有太大意义.
你能说出特别的好处吗?呵呵...不要说,因为看上去比较优雅.

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
 楼主| 发表于 2004-10-19 16:24:00 | 显示全部楼层

Re:网络服务器设计用到的设计模式2:Command类

rt

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
 楼主| 发表于 2004-10-19 16:26:00 | 显示全部楼层

Re:网络服务器设计用到的设计模式2:Command类

直接函数指针比虚函数要强不少的,
总体上应该比
switch()
case 1:
case 2:
来得强,何况这里面也是要一个函数调用的。
假如把这个函数指针存放的位置放在static里面的话,
跟一般的函数调用速度是一样的。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-10-20 03:29:00 | 显示全部楼层

Re:网络服务器设计用到的设计模式2:Command类

Design Patterns注重的不是速度,而是各个方面的,包括维护,管理。
写成switch不方便维护,仅此而已。

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2004-10-20 10:02:00 | 显示全部楼层

Re:网络服务器设计用到的设计模式2:Command类

串行化地过程成本太高了,而且命令太多了,如果自己写序列化的过程,那代码量太多了,远远超过大case的处理速度.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 05:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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