网络游戏中网络模块浅析
在网络游戏中,不论是服务端还是客户端都需要网络通讯的功能模块,而一个优秀的成熟的网络通讯模块,又可以用于多个游戏产品中。
于是,在学习的过程中,设计和实现一个可复用的网络通讯模块,变得非常的有意义。
通过思考我们可以一步一步的来实现这样的模块:
我们应该知道对原生的Socket API进行封装是有必要的,也许当前服务端是运行在window环境下,也许改天就有可能要在Linux下面运行。而对原生Socket API进行封装,可以很方便的让我们进行两者的切换,并且不需要我们付出多大的代价。
可以像下面这样封装,放在SOCKET_API命名空间下面,其他API类似:
UINT SOCKET_API::recv_ex ( SOCKET s , void * buf , UINT len , UINT flags )
{
#if defined __LINUX__
….
#elif defined __WINDOWS__
….
#endif
}
我们都知道游戏通常都是使用TCP来实现通讯的,而TCP需要下面这些最基本的功能及对SOCKET进行设置或者获取信息的函数。
server |
client |
bind listen accept send recv close |
connect send recv close |
我们希望把这些功能都封闭到一个CSocket类中。
class CSocket
{
public :
构造函数,析构函数,初始化函数……
BOOL connect (const CHAR* host, UINT port) ;
UINT send (const VOID* buf, UINT len, UINT flags = 0) ;
SOCKET accept( struct sockaddr* addr, UINT* addrlen ) ;
其他函数,例如receive ,bind,listen,close,get和set变量接口,有效性判断等等……
public :
SOCKET m_SocketID;
SOCKADDR_IN m_SockAddr;
CHAR m_Host[IP_SIZE];
UINT m_Port;
}
不论是服务端还是客户端都没有办法做到一收到消息就马上响应请求,然后直接把
这个消息丢弃掉。所以我们需要有一个地方可以保存这些消息,这时我们可以定义输入和输出消息缓冲区的类,当我们发送或者接收消息时,先把消息放到相应的消息缓冲区里,然后再进行相应的处理。而这个缓冲区最好是环形的,当缓冲区不够用的时候能够自己增加缓冲区大小,当然需要有个上限。
当我们有了消息缓冲区后,这时我们需要通过一种方式,把消息放入缓冲区和从缓
冲区中把消息读取出来,在放入和取出的时候可能还需要伴随着加密与解密操作。由于在游戏中,一样连接通常都代表着一个玩家。
我们可以定义个CPlayer类:
class CPlayer
{
public:
ProcessInput(); //读取网络上的消息并放在输入消息缓冲区
ProcessOutput(); //把输出消息缓冲区中的消息发送出去
ProcessMsg(); //处理收到的消息,把相应的消息交给相应的处理函数
private:
输入缓冲区
输出缓冲区
}
到这里时,上面的内容通常都可以作为服务端和客户端通用的代码。
下面我们重点了解一下,服务端是怎么样接着处理收到的消息的,在我接触过的服务端中,有两种不同的框架,不过处理方式大同小异,顺便提下。
第一种,就像我在游戏服务端逻辑模块处理框架中说的差不多,在种情况之下,服务端的逻辑模块会划分成很多的DLL模块,比如:
战斗系统就是一个BattleSys.dll
技能系统就是一个MagicMgr.dll
角色系统就是一个RoleMgr.dll
然后我们有一个消息中心,当网络模块收到消息之后把消息发送给消息中心,消息中心再把消息Buffer发送给感兴趣的DLL模块,然后这些DLL模块用消息Buffer生成相应的CMsg(每个消息都有消息头,根据消息头的消息编号可以识别相应的CMsg),并执行CMsg的ProcessMsg消息处理函数。
第二种,没有把逻辑模块划分成很多个DLL,游戏逻辑都在Server中进行处理。收到网络消息之后,直接通过管理器类CpacketFactoryMgr创建出CMsg类(查找相应的消息创建工厂,并用它创建出CMsg类),并执行CMsg的ProcessMsg消息处理函数。
其实就是这样的过程,注册XXX到管理器 => 通过XXX的ID到管理器中找到XXX => XXX.DoSomething()
先说到这里了…继续学习之后再继续……
网络游戏中网络模块浅析相关推荐
- 计算机学院特色游戏,网络游戏七大特点浅析
摘 要:作为国家文化产业发展战略的重要一环和互联网文化产业的重要组成部分,网络游戏的发展研究一直颇受关注.尽管网络游戏迅猛发展,其最基本特点一直未曾改变.本文将以传播学角度出发点,浅析网络游戏的七大特 ...
- Java中classLoader浅析
转载自 Java中classLoader浅析 本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下 ...
- 谈谈网络游戏中的延迟解决方案
谈谈网络游戏中的延迟解决方案 参考文章: (1)谈谈网络游戏中的延迟解决方案 (2)https://www.cnblogs.com/LexMoon/p/wlyx.html 备忘一下.
- 网络游戏中的数据包设计和定义(初论)
接触了一段时间的网游封包设计,有了一些初步的思路,想借这篇文章总结一下,同时也作个记录,以利于以后更新自己的思路. 网络游戏的技术研发,分为三个主要的方面:服务器设计,客户端设计,数据库设计.而在服务 ...
- 网络游戏中玩家在线数据的存取
网络游戏中玩家在线数据的存取 一般而言,在设计网络游戏中玩家在线数据的存储时,都是在游戏服务器中使用共享内存来进行保存,然后定时把玩家的在线数据(如金钱,经验,等级,道具等)发送到后台的数据库服务器进 ...
- 状态同步的mmo网络游戏中的帧率
疑问: mmo网络游戏中, 玩家操作自己A角色在游戏客户端放了1个技能, 游戏服务器收到这个"A放了技能"的指令, 游戏服务器计算这个技能的结果(比如B受到了攻击掉血,A减少魔法值 ...
- 帧同步在竞技类网络游戏中的应用
本文为转载文,转自 https://www.cnblogs.com/cxihu/p/5836747.html 打野家认为这个文章写的很清晰明确,合理的阐述了帧同步的原因原理,从理论上弥补了打野家对帧同 ...
- 网络游戏中的网络编程
谈谈网络游戏中的"网络"编程 ????近段时间总是有不少人问我关于完成端口模型的一些资料,很多时候其实我很郁闷,为什么大家会选择使用完成端口呢?或者说很多时候他们竟为了使用完成端口 ...
- 网络游戏中的货币系统
现在 MMO 中经济系统往往是设计的关键.可能是网络游戏发展的时间较短,并没有形成系统的理论的缘故,我所了解的网络游戏中都没有特别好的处理好经济系统中货币的控制和流通问题. 我们知道,货币只是一种经济 ...
最新文章
- 使用堆内内存HeapByteBuffer的注意事项
- php源码十六进制加密,php-简单对称加密算法和字符串与十六进制之间的互转函数,php-十六进制_PHP教程...
- 程序员应当学会“偷懒”
- SQL基础用法总结(以前复习的时候放在自己的新浪博客上)
- python找与7相关的数_用python统计并输出1000以内所有能同时被3和7整除的数的个数?...
- 微博回应用户被“劫持”;途牛否认破产清算;微软宣布开源 MsQuic | 极客头条...
- 亿级流量系统架构之如何支撑百亿级数据的存储与计算
- vue的route和router的区别
- MFC的多国语言界面的实现
- [转载]你呀,最大的问题就是太合群了
- 计算机秘密程序 听课反思,《编制计算机程序解决问题》的教学反思
- 数据库1_五大主流数据库模型
- List<Map>转Map<String,List>
- php5.6.40 在 win10下安装全过程 ( 图文教程、附官方下载链接 )
- 网络安全笔记-业务安全
- Linux寻找history命令位置,使用history命令在Linux系统上找到最常用的命令
- 一个可以在多平台运行的任天堂GameBoy模拟器
- c 实现走迷宫流程图_[求助]:迷宫问题 流程图
- 根轨迹的基本概念与绘制
- 1278:【例9.22】复制书稿(book)
热门文章
- 什么是中台业务架构?
- 超越BI,数据产品的前途在哪里?
- 多图长文 | 聊聊C端转型B端产品那些事
- 拼多多数据全面解析报告
- 对接闪送_中国快递业加速出海,圆通上线“全球闪送”,与顺丰、申通抢市场...
- mysql 查询效率测试,mysql innode和myisam引擎查询性能比较测试
- uvm 形式验证_谈一谈IC flow中的形式验证
- memset 结构体内指针_数据结构之线性表应用——内存管理
- 《大数据》致谢审稿专家
- 作者:郭旦怀(1973-),男,博士,中国科学院计算机网络信息中心副研究员、硕士生导师。...