为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 2D网络游戏引擎的设计与实现(可编辑)

2D网络游戏引擎的设计与实现(可编辑)

2017-09-28 45页 doc 75KB 14阅读

用户头像

is_044822

暂无简介

举报
2D网络游戏引擎的设计与实现(可编辑)2D网络游戏引擎的设计与实现(可编辑) 东北大学 硕士学位论文 2D网络游戏引擎的设计与实现 姓名:石正方 申请学位级别:硕士 专业:计算机科学与技术(软件工程) 指导教师:余克清 20060101东北大学硕士学位论文 摘要 网络游戏引擎的设计与实现 摘要 游戏引擎是一个处理游戏底层技术的平台,使用游戏引擎,游戏开发人员可以不用 花过多精力去处理系统架构、图形处理等一些底层的技术,可以直接使用引擎提供的 来进行游戏开发,从而大大缩短游戏开发时间。 本文通过对网络通信和图形处理方面的研究,设计并实现了...
2D网络游戏引擎的设计与实现(可编辑)
2D网络游戏引擎的设计与实现(可编辑) 东北大学 硕士学位 2D网络游戏引擎的设计与实现 姓名:石正方 申请学位级别:硕士 专业:计算机科学与技术(软件工程) 指导教师:余克清 20060101东北大学硕士学位论文 摘要 网络游戏引擎的设计与实现 摘要 游戏引擎是一个处理游戏底层技术的平台,使用游戏引擎,游戏开发人员可以不用 花过多精力去处理系统架构、图形处理等一些底层的技术,可以直接使用引擎提供的 来进行游戏开发,从而大大缩短游戏开发时间。 本文通过对网络通信和图形处理方面的研究,设计并实现了一个具备消息处理和客 户端动作交互功能的引擎。 本文设计的引擎主要包括三个部分:消息处理系统、自动更新系统、图形处理与动 作交互系统。 消息处理系统包含两部分:网络通信底层模块和服务器端消息处理模块。网络通信 底层模块通过对的进行封装和功能扩展,使得开发人员在构建通信模 型时更加方便。服务器端消息处理模块实现了对客户端发往服务器端的消息进行识别和 处理的功能。 自动更新系统模块由三个子模块组成:文件版本管理模块、文件传输服务器模块和 接受文件模块。这是一个独立的引擎模块,实现了游戏客户端更新版本的整个过程。 图形处理与动作交互系统。设计了游戏中从位图调入、场景显示、角色行走、地图 处理等一系列的函数,并利用这些函数实现了一个简单的动作交互系统模型。 本文研究的课题初步探讨了网络游戏引擎的基本技术架构,对于国内基于的 网络游戏系统开发具有一定的借鉴和参考价值。 关键词:引擎通信文件传输碰撞东北大学硕士学位论文 . ,. ’ ,., . , : , . : . . .,. . , . ,, . 。 ?. : ,, , , .独创性声明 本人声明,所呈交的学位论文是在导师的指导下完成的。论文中取得 的研究成果除加以标注和致谢的地方外,不包含其他人己经发表或撰写过 的研究成果,也不包括本人为获得其他学位而使用过的材料。与我一同工 作的同志对本研究所做的任何贡献均己在论文中作了明确的说明并表示谢 意。 学位论文作者签名:石忑方 期: 日 ,.仰 学位论文版权使用授权书 本学位论文作者和指导教师完全了解东北大学有关保留、使用学位论 文的规定:即学校有权保留并向国家有关部门或机构送交论文的复印件和 磁盘,允许论文被查阅和借阅。本人同意东北大学可以将学位论文的全部 或部分内容编入有关数据库进行检索、交流。 如作者和导师不同意网上交流,请在下方签名;否则视为同意。 学位论文作者签名 导师签名: 签字日期: 签字日期:东北大学硕士学位论文 第一章绪论 第一章绪论 弟一早珀匕 前言 随着人们生活水平的提高和互联网的快速发展,网络游戏也逐渐的走向了更多的玩 家,并逐渐发展成为产业中的支柱行业。网络游戏也已经成为人们尤其是作为未来 消费主体的青少年的主要娱乐方式。 网络游戏与单机版游戏相比,明显具有以下优点:良好的互动性,既可以与在线玩 家交流,又可以与游戏程序本身交流,而单机版游戏只能与程序交流;自由性:信息保 存在服务器上,可用任何一台装有客户端的联网游戏,而单机版信息只保存在单机 上,不可以在其他上继续游戏;服务性:服务更加体贴周到,程序内容不断更新, 町持续性较强,而单机版只能反复玩,比较单调。而随着宽带的日益普及,网络游戏的 优势将越来越明显。 在众多类型的网络游戏中,作为最受欢迎的一类网络游戏近几年来一直 是网游市场的主流。《传奇》、《大话西游》等经典游戏的出现引爆了一波又一波的网游 热潮。 什么是为什么如此深受玩家的喜爱 . 游戏即角色扮演类游戏。是目前市场上最受欢迎的游戏类 型。游戏提供给玩家一个可供冒险的世界或者反映真实世界的虚拟世界,在这个世 界里包含了各种角色、建筑、商店、迷宫以及险峻的地形。玩家所扮演的主角可在这个 世界中通过旅行、交谈、交易、动作交互、成长、探险及解谜来揭开一系列的故事情节, 最终走向胜利的彼岸。 ,即大型多人在线角色扮演类游戏,使得成千上万的玩家在虚拟世界中 通过扮演各种不同的角色进行互动。游戏本身是持续发展的,玩家不断积累游戏经验、 升级,并通过即时信息系统进行沟通。游戏的互动性和团队性给玩家带来了一种强烈的 社区感,而且庞大的用户基础增加了玩家的忠诚度并有利于吸引新的玩家。 .课题研究的背景 网络游戏是一种基于计算机互联网的应用软件,是新型的休闲娱乐方式。游 戏软件 产业作为一个新兴的高技术产业,已经成为同影视、音乐等并驾齐驱的全球最重要的娱 乐产业之一。我国网络游戏产业规模化发展起于年,虽然只有短短几年的时间,东北大学硕士学位论文 第一章绪论 但发展势头迅猛。网络游戏产业已成为网络经济及娱乐业的重要支撑,同时正带动着相 关产业的发展。 然而在产业前景被商家纷纷看好的同时,产业发展的问题也日益显现。我国游戏开 发人员‘用户最比例严重失调。目前我国市场上的游戏以日本、美国、韩国等地的为多, 国产游戏则犬部分是由大陆与台湾合作开发,完全由大陆游戏制作人自己创作的游戏数 量很少。这样的后果是选择代理国外网络游戏赚取契约金用以积累原始资金等于将大量 的网络游戏资本送往他国市场。而一个更加突出的问题是:以目前市场上的主流韩国网 络游戏为例,市面上流行的韩国网络游戏是魔幻、奇幻等西方色彩较为浓厚的泊来品, 不太适合于更多的没有接受过相关文化熏陶的中国游戏迷们,而且中国文化博大精深, 也远不是国外的游戏开发商一朝一夕所能够体会。 而随着人们对游戏文化的要求越来越高,网络游戏市场必然会发生一系列相应的变 化,游戏产品将具有更深的文化底蕴,游戏模式将具有更高的玩赏性。因此开发带有民 族特色的,蕴涵深厚文化底蕴的国产网游就显得刻不容缓。 而国产游戏开发中面临的第一个瓶颈一技术的发展并不是一个一蹴而就的过程,无 论是网络游戏表层的在客户端技术开发等可见领域,还是包括平衡性等在内的后台不可 见因素,这些都需要时间的积累。目前我国优秀的网络游戏制作公司也仅仅目标软件、 智冠网金、晶合时代、西山居等区区几家。 不久前文化部向国内家网络游戏业的实力厂商颁发了首批《网络文化经营许可 证》之后,“网络游戏通用引擎研究及示范产品开发”、“智能化人机交互网络示范应用” 两个项目又被正式纳入了,这也是我国首次将网络游戏技术纳入国家科技计划。 计划是中国游戏产业发展的一个契机,随着政府监管力度的不断加强,各种法规、 条例的不断出台,表明中国游戏娱乐产业的春天就要到来了。今后开发自主 的网络游戏, 是推动国内游戏娱乐产业的关键。 因此在这样的背景下,对网络游戏相关技术进行研究具有一定的社会和经济意义, 对网络游戏开发也有参考价值。 本文通过对网络通信和图形处理方面的研究,设计并实现了一个具备消息处理和客 户端动作交互功能的引擎,使开发人员可以直接利用本引擎的进行游戏开发。 .课题研究的主要内容 游戏引擎是对一些底层或者其它的开发技术进行抽象,提供游戏开发的统一接口, 对资源、内存、动画、网络等方面进行管理,为游戏开发提供方便。游戏引擎实际上是 一个解释器,游戏开发者写下的游戏代码山游戏引擎进行解释,最后输出为一定的表现 方式。 早期的游戏开发效率较为低下,一方面是因为技术原因,另一方面是因为几乎每款第一章绪论 东北大学硕士学位论文 游戏都要从头编写代码,造成了大量的重复劳动。渐渐地,一些有经验的开发者借用上 一款类似题材的游戏中的部分代码作为新游戏的基本框架,以节省开发时间和开发费 用。于是就慢慢产生了游戏引擎。 本文通过对网络通信和图形图像处理的研究,设计并实现了一款具备网络通信、消 息处理、场景显示、角色行走与动作交互等功能的类型的引擎系统。 本文的主要内容如下: 通过对技术、通信协议、通信方式以及中的通信模型的研 究,在的基础上,对这些进行重新封装和功能扩展,提出了一个网络 底层通信模型。 通过对网络通信方式和网络游戏中消息处理方法的研究,利用网络底层通信模型, 设计并实现了一个服务器端消息处理系统。 通过对客户端版本文件建立方法、文件接受与传输技术的研究,并借鉴信息 摘要算法设计并实现了一个功能独立的客户端文件自动更新系统。 通过对位图调入、动画生成、角色移动与动作转换方法、复杂地图的生成与微缩、 碰撞榆测技术、等技术的深入研究,设计了一系列图形处理、地图操作、自动 搜索路径的接口函数,并利用这些接口函数设计了一个动作交互操作模型。这些接口函 数具备这些功能:行走区域判定、支持模拟的场景高度,自动寻径,动态元素, 旋转、 放缩、画面切换,支持图形化的界面控件,窗口模式运行,人物行走动作、声音与 模型的配合等等。东北大学硕士学位论文 第二章引擎技术设计背景 第二章引擎设计技术背景 . 游戏引擎设计背景 在以往的即时、对抗、竞技类游戏中所必需的要素就是真实感,而空间感画面 所表现出的高度拟真的视觉效果正是这些游戏所需要的,所以此类游戏的化是大势 所趋。而游戏强调的是角色人物剧情和世界观的概念,所以单靠游戏画面就可 以很好地表现这些必要游戏要素,并无需特地依赖化。 然而国内网游代理运营公司,在引进海外游戏上有点过于迷信潮流,前仆后继 而乐此不疲。那些公司决策者们好象总认为只要是网游即是大作的代名词,就能引 起不凡的市场的效应。然而空有震撼视觉效果无疑是难以持久吸引玩家的,丰富、动人 的情节才能成为永恒话题。 总的来说对于类型的游戏,网游相对网游存在以下劣势:游 戏引擎开发技术上并不成熟和普及;由于过度追求画面质量导致玩家的互动性存在严重 缺陷;缺少琐碎的游戏设计所带来的游戏乐趣;采用鼠标和键盘方向键双重控制人物行 动和画面舒适性不及网游;容易带来视觉疲劳;程序通常存在核心漏洞易被外挂造 成严重影响:硬件和网络要求较高。 因此现阶段对于类型的游戏,引擎的开发从技术上来说更加成熟可 行,从市场效应来说也更能满足玩家的需求。 .游戏引擎的原理 游戏的引擎好比赛车的引擎,玩家所体验到的剧情、关卡、美工、音乐、操作等 内容都是由游戏的引擎直接控制的,它扮演着中场发动机的角色,把游戏中的所有元 素捆绑在一起,在后台指挥它们同时、有序地工作。简单地说,引擎就是“用于控制所 有游戏功能的主程序,从计算碰撞、物理系统和物体的相对位置,到接受玩家的输入, 以及按照止确的音最输出声音等等?。” .游戏引擎的处理过程框架 网络游戏的处理过程是这样的:首先是设置游戏的运行环境,对图形、声音、 输入 以及网络进行初始化。然后对用户的输入进行检测以便根据玩家的意图来改 变游戏的状第二章引擎技术设计背景 东北大学硕士学位论文 态,然后对用户的输入请求进行处理。处理完后更新屏幕显示。当退出游戏 时,清除初 始化时载入的所有图形、声音以及数据,释放内存。 处理过程如下图所示: ,, 、 开始游戏 \ / 否 是/\ ?戏结束 \/ 清理 获取用户输入 』 ,, 、 处理用户输入 退出游戏】 更新图形 图.游戏引擎的处理过程框架.. 游戏初始化过程:首先连接远程服务器端,连接成功,则调用自动更新系统对文件 版本进行更新。 自动更新系统的工作过程是这样的:尝试连接更新系统服务器,为了加快下载的速 度,更新系统服务器通常有多个,如果连接失败则连接下一个更新系统服务器,直到连 接成功为止。然后获取版本信息文件的值,通过检查值来确定版本信息文件自 身有没有发生变化。如果有则取得版本信息文件,如果没有则无需任何更新直接进入游 戏。 进入游戏后,首先进行的是用户登录验证工作,客户端在发送用户信息进行登录请 求后,由服务器端消息处理系统进行判断,如果是第一次连接请求,则对登录消息进行 解析后发往数据库服务器进行用户验证,验证通过后,返回用户登录成功信息,用户进 入角色选择画面。然后创建角色或直接选择角色进入游戏服务器,处理过程与登录验证 处理过程类似。 进入游戏后,图形处理与动作交互系统对游戏的运行环境,图形、声音、输入以及 网络进行初始化。东北大学硕士学位论文 第二章引擎技术设计背景 游戏初始化后,如果游戏没有结束,获取用户输入,这个用户输入包括本地客户端 的输入和远程客户端的输入。如果是本地客户端的输入,则直接调用图形处理与动作交 互系统程序中相关的对用户的输入请求进行处理,并同时将处理结果发往服务器端。 如果是远程客户端的用户输入,则服务器端消息处理系统对该客户端的用户输入信息进 行解析然后将该消息发送过来,在本地机器上对远程客户端的输入进行模拟处理。处理 完用户请求后对屏幕图形进行更新显示。 .客户机/服务器结构 在/客户机/服务器结构中,客户机只与服务器进行通信,而不与其他客户端 进行通信。客户机发送请求到中心服务器,中心服务器处理请求并发回应答信息。如果 玩家想要给另一个玩家发送一个消息,首先他必须发送消息到服务器,然后服务器将消 息转发给目的玩家。这种通信方式拥有较高的安全性,同时也允许有更多的 玩家。 /结构的分工情况是这样的:客户机应用程序负责图形更新,服务器负责处理请 求和应答。服务器端的请求应答体系模型是这样的: 天 天 /\ 服务器接受到移动请求 服务器发送允许 服务器向周围玩家发 并检查到前方无障碍 移动指令 送移动后的更新命令 图.请求和应答体系模型 .. .引擎的存在形式一动态链接库 整个游戏的引擎存放在多个动态链接库文件中,开发人员通过对这些动态链接库的东北大学硕士学位论文 第二章引擎技术设计背景 调用来实现在本引擎平台上开发游戏的过程。 动态链接库是从语言函数库和库单元的概念发展而来的。所有的 语言标准库函数都存放在某一函数库中,同时用户也可以用程序创建自己的函数 库。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些 函数代码添加到可执行文件中。但随着这样的多任务环境的出现,函数库的 方法显得过于累赘。如果为了完成屏幕输出、消息处理、内存管理、对话框 等操作,每 个程序都不得不拥有自己的函数,那么程序将变得非常庞大。的发 展要求允许同时运行的几个程序共享一组函数的单一拷贝。动态链接库就是在这种情况 下出现的。动态链接库不用重复编译或链接,一旦装入内存,函数可以被系统中的 任何正在运行的应用程序软件所使用,而不必再将函数的另一拷贝装入内存。 ..动态链接库的工作原理 对于常规的函数库,链接器从中拷贝它需要的所有库函数,并把确切的函数地址传 送给调用这些函数的程序。而对于,函数储存在一个独立的动态链接库文件中。在 创建程序时,链接过程并不把文件链接到程序上。直到程序运行并调用 一个中的函数时,该程序才要求这个函数的地址。此时才在中寻找 被调用函数,并把它的地址传送给调用程序。采用这种方法,达到了复用代码的极 限。 动态链接库的另一个方便之处是对动态链接库中函数的修改可以自动传播到所有 调用它的程序中,而不必对程序作任何改动或处理。 不仅提供了函数重用的机制,而且提供了数据共享的机制。任何应用程序都 可 以共享由装入内存的管理的内存资源块。只包含共享数据的称为资源文件。 如的字体文件等。 ..动态链接库的调用 有两种方法可用于调用一个储存在中的过程。 静态调用或显式装载 使用一个外部声明子旬,使在应用程序开始执行前即被装入。例如: :;:;;;;使用这种方法,程序无 法在运行时间里决定的调用。假如一个特定的在运行时无法使用,则应用程 序将无法执行。 在静态调用一个的过程或函数时,指示增加到过程或函数的声明语句 中。被调用的过程或函数必须采用远调用模式。这可以使用缸过程指示或一 个 编译指示。东北大学硕士学位论文 第二章引擎技术设计背景 动态调用或隐式装载 使用 函数和可以实现在运行时间里动态 装载并调用其中的过程。 若程序只在其中的一部分调用的过程,或者程序使用哪个,调用其中的 哪个过程需要根据程序运行的实际状态来判断,那么使用动态调用就是一个 很好的选 择。 使用动态调用,即使装载一个失败了,程序仍能继续运行。 动态调用中使用的 函数主要有三个,即:, 和。 ?:把指定库模块装入内存 语法为: ::; 指定了要装载的文件名,如果没有包含一个路径, 则按下述顺序进行查找: 当前目录; 目录包含.的目录。函数返回这一目录 的路径: 系统目录包含系统文件如.的目录。函数 返回这一目录的路径; 包含当前任务可执行文件的目录。利用函数可以返回这一 目录的路径; 列在环境变量中的目录; 网络的映象目录列表。 如果函数执行成功,则返回装载库模块的实例句柄。否则,返回一个小于 的错误代码。 ?:捡取给定模块中函数的地址 语法为: :;::; 包含被调用的函数库模块的句柄,这个值由返回。如果把 设置为,则表示要引用当前模块。是指向含有函数名的以结尾 的字符串的指针,或者也可以是函数的次序值。如果参数是次序值,则如果 该次序值的函数在模块中并不存在时,仍返回一个非的值。这将引 起混乱。因此大部分情况下用函数名是一种更好的选择。如果用函数名,则 函数名的 拼写必须与动态链接库文件节中的对应拼写相一致。 如果执行成功,则返回模块中函数入口处的地址,否则返回。 ?:从内存中移出库模块 :; 语法为:东北大学硕士学位论文 第二章引擎技术设计背景 为库模块的句柄。这个值由返回。 由于库模块在内存中只装载一次,因而调用首先使库模块的引用计数减 一。如果引用计数减为,则卸出该模块。 每调用一次就应调用一次,以保证不会有多余的库模块在应 用程序结束后仍留在内存中。 .引擎构成 游戏引擎和框架的抽象一直是游戏制作中的一个关键问题,其核心问题是如 何令 抽象好的引擎具有更好的适应性。 游戏按功能分为:消息处理系统、场景显示及行走系统、动作交互系统三大 主要 部分。其中又以消息处理系统为核心模块,其余部分紧紧围绕它运行。 基于前面的/结构和游戏引擎的处理过程框架,本文设计了一个如图.所示的 引擎基本框架 应用程序 //\ 引擎 规则系统 消息处理系统 图形管理/ 入 物件系统 地图系统路径搜索其他 底层引擎 平台 图.游戏引擎基本框架 ...本引擎的功能分析 ..消息处理系统 消息处理系统是游戏的核心部分。游戏用到的消息处理系统先等待消息,然后根据 收到的消息转到相应的函数进行处理。比如:角色碰到敌人后开始动作交互,东北大学硕士学位论文 第二章引擎技术设计背景 同时将该动作交互数据发往服务器,由服务器验证后发给周围的玩家,周围的玩家调 用消息处理系统对这个消息进行解析,随后在本地调用相应的模块模拟角色 的动作交 互动作。消息处理的大体框架如下: ;//消息变量 //进入程序 初始化主窗口; //息循环 行走消息:行走模块; 动作交互消息: 动作交互模块; 事件消息: 事件模块; 本引擎提供的消息处理系统主要是服务器端的消息处理过程。 包含部分:网络通信底层模块和服务器端消息处理模块。网络通信底层模块 通过 对的函数进行封装和功能扩展,使得在调用时更加方便。服务器端消息处 理模块实现了服务器端消息处理的整个过程,开发人员在使用本引擎模块时, 可根据自 己的需要继承并重写接口函数,可以处理自己定义的各个消息类 型。 .图形处理与动作交互系统 图形处理与动作交互系统是客户端程序处理的主要部分,也是直接与玩家进 行交互 的部分。 加入处理后的图形处理过程:在内存中开辟一到两个屏幕缓存区,事先把 即将显示的图象数据准备在缓存区内,然后一次性把它们传送到主屏幕缓冲区内。 行走与动作交互处理过程如下:根据角色的当前位置与目标位置,利用计算位置差 的方法来判断角色的移动方向,然后调用向该方向移动的系列图片,以固定的步长向该 位置移动,动作交互时,根据碰撞检测的判断,调整双方的方位将动作转为动作交互, 同时播放动作交互的,并跟踪任务状态的变化在界面上显示出来。 本文根据功能划分的不同为图形处理与动作交互系统设计了三个应用程序接口模 块:图形处理模块、路径搜索模块和地图编辑模块。这三个部分基本实现了客户端场景 显示、行走区域判定,自动搜索路径,复杂地图与微缩地图生成,碰撞检测等功能。最 后利用这三个模块的函数实现了一个小型的动作交互模型。 东北大学硕士学位论文 第二章 引擎技术设计背景 .,自动更新系统 自动更新系统是网络游戏设计中的一个重要组成部分。正是由于程序内容不 断更 新,才使得网游的持续可玩性较强。同时这个系统也方便了开发人员做更新和维护。 自动更新系统的处理流程如下:首先在服务器端利用文件版本处理模块建立客户端 版本,客户端连接上服务器以后,获取关于文件最新版本的数据,比较本地版本和最新 版本信息文件的值,发现不同后服务器就把最新的文件传送到客户端,并更新版 本号。 本文设计的自动更新系统模块由三个子模块组成:文件版本管理模块、文件传输服 务器模块和客户端接受文件传输模块。这是一个独立的引擎模块,实现了游戏客户端更 新版本的整个过程。东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 第三章消息处理与更新系统的设计与实现 网络游戏中需要处理的内容很多,如玩家网络数据的传输、玩家命令的解析、游戏 规则的实现等。因此游戏服务器需要分层来设计,使整体结构更加清晰。游戏服务器分 层来设计,如图.所示。最底层是网络层,负责网络数据的接受与发送。中间 层是 命令处理层,负责命令的接受、发送与解析。上层是最复杂的虚拟世界层,在这一层中, 游戏中的各种物体按既定的规则运行着,并发生交互关系。 虚拟世界层物件模型 命令处理层命令分析器 『 网络层 图.游戏服务器.. 游戏世界中的许多物体例如道具、玩家和等等,这些物体之间的相互作用构 成了一个复杂的虚拟世界。 .消息处理系统设计 网络游戏的网络部分实际上就是一个消息处理的过程,本消息处理系统包含部 分:网络通信底层模块和服务器端消息处理模块。网络通信底层模块通过对的 函数进行封装和处理,使得在调用时更加方便。服务器端消息处理模块实现了服 务器端消息处理的整个过程,开发人员在使用本引擎模块时,可根据自己的需要重写 方法来实现自己需要的功能。 ..网络通信底层模块 是一套用于网络数据传输的编程接口。它位于网络通信协议和应用程序之 间。使用开发网络通信程序可以避免直接面对复杂的网络通信协议,加快开 发 速度,并可以做到跨协议与跨平台开发。 .连接的过程东北犬学硕士学位论文 第三章消息处理与更新系统的设计与 实现 在应用中,为了建立一个网络连接实例的服务器端,只需设置本地 服务端口号,然后服务器调用方法进入阻塞状态,等待来自客户的连接请求。 与 此对应的客户端不但要将的属性置为服务器的名称地址或网 络代号,还应设置服务器所监听的相应服务的端口号,如服务在 号端口,在号端口等。然后调用方法.向服务器发出请求。 服务器接收到客户请求时,事件将被触发。如服务器愿意提供服务, 则可调用方法接受连接。 图‘和图.分别是服务器端和客户端连接的基本过程: 服务器端: 设置本地服务端口号 服务器进入监听状态 收到客户连接请求 』 检查状态 接受客户请求 接收/发送数据 处理客户数据 关闭 图.服务器端连接过程..东北大学硕士学位论文 第三章 消息处理与更新系 统的设计与实现 客户端 设置服务器相应服务端口号 』 向服务器发出连接请求 服务器响应连接 进行数据传输 关闭 图.客户端连接过程 基本的 的第一个函数。 :连结应用程序与 院明:此函数是应用程序调用 函数中的第一个,也唯有此函 数呼叫成功后,才可以再调用其他 的函数。 的使用。 :结束 时,需要调用此函数来注销 说明:当应用程序不再需要使用 使用,以便释放其占用的资源。 :建立。 说明:此函数用来建立一描述字,并为此建立其所使用的资源。 :关闭某一。 说明:此一函数是用来关闭某一。 :将一本地地址与一个描述字连接在一起。 说明:此函数在服务程序上使用,是调用监听函数必须要调用的函数。 :设定为监听状态,准备被连接。东北大学硕士学位论文 第三章消息处理与 更新系统的设计与实现 说明:此函数在服务程序上使用,来设定进入监听状态,并设定最多可有 多少个在未真正完成连接前的客户端的连接要求。 :接受某一的连接要求,以完成面向连接的客户端的连 接请求。 说明:服务端应用程序调用此函数来接受客户端连接请求,函数的 返回值为一新的,新就可用来在服务端和客户端之间的信息传递接收, 而原来仍然可以接收其他客户端的连接要求。 :要求连接某一到指定的网络上服务端。 说明: 此函数用在客户端,用来向服务端要求建立连接。当连接建立完成后, 客 户端即利用此来与服务端进行信息传递。 :从面向连接的接收信息。 说明: 此雨数用来从面向连接的接收信息。 :使刖面向连接的发送信息。 说明: 此函数用来从面向连接的发送信息。 :要求某一有事件发生时通知使用者。 说明:此函数用来请求 为窗口句柄发一条消息一无论它何 时检测到由参数指明的网络事件。要发送的消息由参数标明.被通知的套 接口由标识。本函数自动将套接口设置为非阻塞模式。 参数由下面列出的值组成。 欲接收读准备好的通知。 欲接收写准备好的通知。 欲接收带边数据到达的通知。 欲接收将要连接的通知。 欲接收已连接好的通知。 ’欲接收套接关闭的通知 网络通信底层模块的功能需求 网络通信底层模块必须完成从连接到数据通信的一系列过程,它的主要功能 如下: 发送数据、接受数据、请求连接、接受连接、绑定地址、监听、可读可写判 断、异常检 测判断、设罱非阻塞或阻塞状态等。 . 网络通信底层模块的设计 的是以函数形式提供的,本模块对这些函数进行了封装,并对这 些函数的功能进行了扩展。使之在应用时更加方便简洁。本模块不是一个具 备独东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 立引擎功能的模块,开发人员需要自己根据连接的过程,使用本模块的函数 组建自己的通信模型。函数设计如下: 表.网络通信底层接口函数设计 . 函数原型 函数功能 初始化网络通信协议和接受网络消息方式阻塞和非阻 塞 对远端的协议地址进行解析,建立连接 , 指定网络通信对象,给分配一个协议地址 ,监听连接状态 接受一条新的连接 【】“半 , 取得本地地址和端口号 , , 取得远程地址和端口号 ,在个上发送数据 设置接受网络消息方式阻塞和非阻塞 , 利用数据报方式进行发送数据 ? 柚 利用数据报方式进行接受数据, , / 重新设置发送消息缓冲区的大小 重新设置接受消息缓冲区的大小.在某个上接受数据 的异常检测 进行可读检测 进行可写检测 关闭连接 东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 ..网络通信底层模块的函数实现 函数用来初始化连接,在初始化时设定网络通信协议类 型,是还是。另外初始化时还调用方法设置接受网络消息的 方式是阻塞还是非阻塞。 , 实现了对 , ,函数的封装,是一个描述符, 指向包含有本机地址及端口号等信息的类型的指针;常被设置为 。本函数通过对.和.的赋值 来获取地址信息。 实现对接口函数的封装,当监听失败时,将错误信息写入日志。 , 实现了对函数 , ,的封装。通过对 .和..的赋值来获取地址信息。连接失败时,将失 败信息写入日志。 函数封装了 , 。成功连接时,连接数 加用于和最大连接数比较。 , 和. , 分别封装了. ,和,, 并通过转换后分别返回本地地址、端口号和远程地址、端口号。, 、 、% 和%, , , 分别实现了对,,、 ,,、 ,,, ,,, ‘的封装。在接受或发送数据 前分别调用和进行可写、可读检测。检测成功后进行数据传输, 返回实际发送的数据字节长度或在出现发送错误时返回.。 封装了,,,通过改变 的值来设定阻塞和非阻塞方式。 和 通过改变 ,?,函数中的类型 为 和 来设定缓冲区的大小。 另外在的函数中, ,,,,函 数用来检测的状态。其中表示中此函数无意义;表示进行 和 是一个.东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 可读检测的集合,表示进行可写检测的集合,表示异常 检测的集合。本模块中的函数,和分别通过调 用?函数,并对?中参数赋予不同的值,来完成各自的功能。 ..消息处理模块 常用的接受网络消息的方式有:阻塞式的接受。异步的非阻塞的接受。如果 使用方式,那么接受网络消息的函数就会一直等待消息,除非到达指定的时 间,与 此同时,程序的运行也停在此处。使用方式接受消息的函数只是去消息缓冲 区里检 查一下是否有新的消息,然后马上返回,中间不存在等待的过程。 异步模式 阻塞模式也称为同步模式,在这种模式下,函数直到全部操作完成后才返 回。比如要接收数据包时,必须等到对方将数据包发送过来为止,调用函数的 线程在这期间是被挂起的,所以程序看起来好像是停止响应了。显然,要以这 种方式执 行函数的话,几乎每个函数的使用都会违反“/秒规则”,所以必须考虑在不 同的线程中执行每个函数。 为所有的函数提供了非阻塞模式的版本,非阻塞模式又称异步模式,在这 种模式下,一个函数执行后会立即返回,即使是操作还没有全部完成,但是当函数最终 完成操作的时候,接口会通过某种形式如窗口消息通知应用程序,显然这 种方式非常适合于下的消息驱动体系。 通过异步选择函数来实现非阻塞通信。方法是由该函数 指定某种网络事件,如有数据到达、可以发送数据、有程序连接请求等,当被指定的网 络事件发生时,由对程序发送由程序事先约定的消息。程序中就可以根据这些 消息做相应的处理。 格式如下: ; , , 在这个函数中被自动设成非阻塞方式,是接收消息的窗口句 柄,非阻塞方式一是向窗口发出消息名称,用户可以任意定义。是被指定 的网络事件。当被指定的网络事件发生时,程序将收到消息,在消息的结构体中, 项就是被规定的消息名称,即为网络事件名称。 在异步模式下,端和端连接过程如下: 端接受端的连接 事件的,所以 由于端的是设定为异步模式,且是针对 送来的一个 当请求连接时,端的视窗会收到东北大学硕士学位论文 第三章消.息处理与 更新系统的设计与实现 的信息。这时应该先利用来检查 是否有错误:并由得知是什么事件发生;然后再 ?于叫相关的函数来处理此事件。对应于 的函数来建立端的 连接。 端向端主动建立连接 建立关系;然后同样呼叫 首先还是呼叫函数来与 来建立一一个来连接端的。和端的 不同的是,端的可以呼叫函数,由自己来指定地址以及端口号: 也可以由 来自动设定地址及端口号此动作在呼叫函数时会由 系统来完成。 ...消息处理模块的设计 由二采用多线程的方法,在大型多人在线游戏中,线程数量巨大,管理非常复 杂, 而且线程同步问题不易解决,因此下面采用异步的非阻塞的方式接受消息并 处理。 本模块设计的原理是这样的:服务器端为每一个成功连接的客户端创建一个 连接,服务器接受客户端消息的过程在每一个连接里进行。然后将所有客户 端消 息存入主线程缓冲区中,处理消息的过程统一在主线程中进行。所以消息的 处理过程仍 然遵循异步模式。接口函数设计如下: 表.消息处理模块接口函数设计 . 函数原型 函数功能 创建监听的过程清除所有客户端的连接 添加新的客户端连接,为每个客户端分配一个 删除指定客户端的连接 ? 接受客户端连接时触发 接受消息并放入消息缓冲队列接受新登录的客户端的玩家信息 ? 对要发送的公告进行拼接,并发送给所有玩家 , 东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 续表.消息处理模块接口函数设计 . 函数原型 函数功能 把消息保存到自定义的缓冲记录里 当应用程序空闲时调用 处理消息缓冲主要函数,引用时可对它重载消息处理模块的函数实现 建一个指定端口的,并在这个端上 进行监听。 ,使用命令删除所有客户端的连接。 这个函数是当有新的客户端连接时触发,通过调用 函数为新连接的客户端分配一个唯~的标识。 对每一个客户端,监听到消息来时,先判断是否已经登录, 如果没有登录,则为登录消息,通过调用 进行登录验证,如果已经登录则将消息保存在缓冲区里。 ,当接受到有新的玩家连接后,为该玩家分配一个唯一的 标识,并将该和指针对应起来。以后就可以通过处理指针来处理 对应的玩家的消息。并对数求得的进行地址解析,求出该玩家的 地址。 ,这个函数是在新玩家登录时调用的。当 有消息到来时,在 函数中判断用户是否已经登录过,如果没有 登录,那么这条消息就是登录消息。然后调用 函数对该消息进行解析,然后将解析后的玩家数据发送到数据库进行验证。 ,当玩家退出时,服务器删除指定玩家的连接,当 玩家断开与服务器的连接后,由于玩家是预留位置的数组中下标号:所以清 除一个 玩家后会将后面的玩家的数组数据前移一个位置。 例如: ;一; ; . . .一; ,设置一个消息查看的循环,当消息缓冲队列中存在消息时, 依次取出消息并解析出消息的类型,然后针对不同的消息类型,调用不同的 方法进行处 理。本引擎只列出了常用的几种消息的处理方法。在应用的时候可以对该方 法进行重载。 第三章消息处理与更新系统的设计与实现 东北大学硕士学位论文 ,将每一个客户端的消息保存到自定义缓冲区内。 . 消息处理模块的处理流程 在设计消息处理过程中,服务器端与客户端的消息采用相同的结构体。例如: 登录消息:; ; ; 一; 来定义登录消息。否则,服 客户端与服务器端必须用相同的结构体 务器端处理该消息时就会因不能识别而出错。 消息的定义 结构体的第一个成员变量是消息的类型,整条消息在内存中存放在一快连续 的存储 空间中。通过解析消息第一位的内容来判断消息的类型。 例如:。 消息的处理流程 当服务器端接受到新的客户端连接时,为每一个客户端创建一个 指针对象,然后通过将客户端发送的消息存放到该实例的消息缓冲区中。当 应用程序空闲时,就会执行函数。 南本模块采用的是异步的非阻塞方式,所以消息的执行过程全部放到主线程 中执 行。这个时候就自定义了一个主线程的消息缓冲队列。 重载数,调用函将每一个客户端实例对 象的消息缓冲区中的消息和该实例的指针存放到自定义的主线程的消息缓 冲队 列中。然后调用处理消息缓冲。东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 消息处理过程如图.所示 ? 二匪雪圉 。 。。 。 、、, ?:?????? : ’ 图.消息处理过程 .。.自动更新系统 网络游戏的一个重要组成部分是它的自动更新系统。正是由于程序内容不断更新, 才使得网游的可持续性较强。同时这个系统也方便了开发人员做更新和维护。 自动更新的原理就是为客户端的每个文件建立版本,服务器上拥有客户端的最新版 本,客户端连接上服务器以后,获取关于文件最新版本的数据,并和本地版本对比,发 现不同后服务器就把最新的文件传送到客户端,并更新版本号。 自动更新系统的处理流程如图.所示:东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 : 当.:帅蛳加。 :: 。 : , ?.:???咖川 ; 、 图.自动更新系统的处理流程 .. 要发送文件还需要对指定游戏客户端目录里的文件进行版本维护管理。具体做法 是:遍历目录下所有文件,然后进行压缩并产生一个版本信息的记录文件。 自动更新系统模块由三个子模块组成:文件版本管理模块、文件传输服务器模块和 客户端接受文件传输模块。 ..文件版本管理模块 文件版本管理模块,通过对指定目录里的文件进行版本维护管理,递归地遍历整个 目录和其子目录中的所有文件,并产生一个信息列表,同时压缩目录里的所有文件到指 定目录。 .. 文件版本管理模块的设计 实现文件版本的管理首先需要建立文件的版本,标识一个文件的版本可以有很多方 法:如手工为文件建立版本号或者利用文件的最后修改日期等。但是如果手工去产生文东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 件版本信息,那么文件数量巨大,很难人工维护而且容易出错。如果依靠文件的最后修 改日期也不能总是保证正确,因为老文件替代出错的新文件或操作系统的时间改变都会 影响修改日期。本文采用的是信息摘要算法。 信息摘要算法全称是?,它的主要作用是把一段数据 “摘要”为一个位长的数字,而这个数字可以唯一标识出这段数据。可以把整个 文件当作一个大文本信息,通过算法转换,产生唯一的信息摘要。以后传播这个 文件的过程中,无论文件的内容发生了任何形式的改变,只要重新计算这个文件的 值,就会发现是不同的,由此可以确定文件发生了变化。的算法不需要支付任何 版权费用,它包括个文件.,.,.,.。本模块利用这几个文件 来建立文件的版本。 本模块的接口函数设计如下: 表.文件版本管理模块接函数设计 . 函数原型 函数功能 设置文件信息列表里所有文件的操作标志 为’无效’ , 遍历指定目录所有文件,按执行特定操 作 添加单个文件信息到列表 ,’, ; 更新已有的单个文件信息 ,, 文件信息数据存盘存成文本文件 递归一个目录里所有文件包含子目录对指定目录创建版本信息 曲 从文件里读取版本信息 ?? , , , 、东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 续表.文件版本管理模块接口函数设计 .读入一个版本信息文件,和现有的版本信息 , 列表的内容做对比 ?, , , 更新或添某个文件的版本信息,并马上 重写文件 按照指定文件更新信息列表或当前文件信 ? 息列表的内容,把所有的文件按照原有的目 录结构压缩到指定目录中 . 使用压缩文件 . 文件版本管理模块的函数实现 ,程序开始,对文件信息列表中的所有文件,设置其操作标志 为无效。 , 遍历指定目录所有文件,并按照执行特 定操作。如果文件属性不是目录,则利用函数取得字符串,当 标记为创建版本时,调用??函数将该文件添加到信息列表。当标 记为更新版本时,调用??函数更新该文件。如果文件属性是目录则递 归渊用自身遍历该目录,算法流程如下: 目文件存在 取得文件的绝对名称含路径; 文件属性目录 取得文件的值: 建版本 将文件放入文件信息列表中; 更新版本 更新文件信息列表东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 递归调用自身; ,, 。添加新的文件信息到列表中。 将指定文件的、版本字符串、文件尺寸、操作标志符设为“需要更新”信息 添加到文 件信息列表。 ., 。更新已有的单个文件信息, 当文件信息表中存在该文件时,比较个文件的版本字符串值,如果不同则更 新文件信息表中该文件的值,并设置文件操作符为”需要更新”。当文件信息 表中 不存在该文件,则调用??添加该文件的信息到列表中。 ,将文件信息列表中那些操作标志被设为’有效’的文件保 存到指定文本文件。 , ,, 。从一个文本文件里读入文件信息列表,并保存到传 入的列表指针和索引指针里。:文件列表数组的指针,:列表数组下 标的索引指针,:文件名。首先按文本方式打开文件,然后依次读出并解 析文件版本信息:,版本,尺寸等。读出文件的信息后将文件操作符设为有效。 ,从指定目录创建文件版本信息列表。当 目录存在时,如果文件操作符为重新创建版本,则清除文件信息列表,并删除列表文件 索引。操作符为其它值时,调用??创建版本信息或更新文件信息。 ,’, , 。:用来比较的版本信息文件名。 :用来记录更新的列表。所有要更新的文件累加起来的尺寸。 :一个标志决定比较的双方,是新读入的文件比对现有信息,还是现有信息比 对新读入的文件。首先读入传入文件里包含的文件版本信息,如果文件里记录的管理目 录与现有的不同,发出一个警告,然后决定新读入的文件和现有的版本信息,谁和谁做比 对。比对时,遍历文件列表数组里所有文件,如果发现对应文件,如果版本不 同,则放入更新列表。而如果没有发现对应文件,则表明是新加的文件,也放入更新 列表。并在这个过程中累计更新文件的尺寸。 ,:文件信息的指针, . :是否马上重写文件。如果文件已经存在,则进行更新,如果不存在,则 添加新的文件版本信息到现有列表中,文件更新完后马上调用将文件信息写东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 入文件。 ‘,按照指定文件更新 信息列表或当前文件信息列表的内容,把所有的文件按照原有的目录结构压缩到指定 目录中。首先取得当前目录,如果更新列表为空,则直接使用当前的文件信息列表。遍 历列表中的文件,当文件的操作符是“需要升级”时,调用?压缩文件, 并设置压缩文件后的文件尺寸。然后生成记录版本信息的文件并压缩版本文件到目的地 目录,把版本文件的单独记录到一个文件中压缩后保存下来。 ..文件传输服务器模块 文件传输服务器是一个基于的服务器,允许多个客户端接入,并进行文件传 输。 文件传输服务器分为三个部分各自完成不同的功能。即负责文件传输控制部分, 服务器监听部分,和网络应用部分。 函数设计如下: 表.文件传输服务器模块接口函数设计 . 函数原型 函数功能 创建监听的过程 接受新的客户端的连接 接受消息后进入消息处理循环 记录断开连接的乱 消息处理 检查文件是否存在,并开始发送文件发送一段文件内容到缓冲区中 发送文件传输开始的消息 发送文件内容 发送文件结束的消息 流程控制主循环 这个设计过程比较简单,与消息处理系统处理方式比较相似,因此这里不再对每一 个函数的功能进行详细讲解,该模块的处理流程如下:服务器端首先创建一个监听 ,并在指定端口上进行监听。当接受到有新的客户端连接时,为新的 客户端连接创建新的连接.并将该连接添加到客户端连接列表中,对于列表中每一 个客户端连接依次按照如下方式来出来:接受到消息时,调用处理消息,如果消息类型为客户端要求传输文件则去检查该文件是否存在,该文件不存东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 在则通知客户端;如果消息类型为文件开始传输的消息,则调用开始发送 文件内容:如果消息类型为客户端已经成功接受了一段内容,则发送新的文件内容;如 果消息类型为文件接受已经结束,则进入空闲状态。处理完后清除断开的连接。 ..客户端接受文件传输模块 客户端接受文件传输模块的主要功能是:版本对比、接受文件传输并更新。 更新流程如下:提出文件发送请求,向服务器索取版本信息文件;接受版本信息文 件后进行版本对比,生成更新列表;根据更新列表的内容,依次请求文件传输并更新。 函数功能设计如下: 表客户端接受文件传输模块接口函数设计 . 函数原型 函数功能 读取配置文件、版本信息文件和值的记录。 尝试连接当前选中的服务器 连接成功后发送请求版本信息文件消息 接受文件处理 , 接受文件结束后进行更新处理 检查版本文件有无更新 把取得的版本信息文件和现有文件版本做比对,找到版 本不同的文件,生成一个文件列表 主体循环 读取配置文件 读取版本信息文件自身值的记录文件 , 上面的应用程序只需要生成一个此类的实例,并调用它的初始化和主体循环,就可 以具有自动更新功能,开发人员只需要在此基础上通过自己的更新界面调用不同的函数 即可。为了实现的方便,本模块提供了以下的虚函数接口,本身不提供任何功能,开发 人员通过可以继承本模块的虚函数接口来实现更新界面的功能。虚函数接口设计如下:东北大学硕士学位论文 第三章消息处理与更新系统的设计与实现 表.接受文件模块虚函数设计 .虚函数原型 函数功能 读取配置文件,针对不同值进行不同处 理 读取版本信息文件和值的记录,连接服 一 务器,发送请求新版本消息完毕,启动界面 操作。 成功连接上服务器 接受了版本信息发现无需更新 接受了版本信息发现需要更新 一 开始请求一个新文件 一 开始接受一个新文件 . 接受到文件内容 一 文件更新速度 一 更新结束 重建文件版本,取得文件列表 一 重建文件版本,处理文件列表中的新文件 , 一 重建版本结束 上面的虚函数接口的顺序基本上说明了客户端接受文件
/
本文档为【2D网络游戏引擎的设计与实现(可编辑)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索