OpenGL多线程编程在网络游戏中的设计与实现_胥友.pdf





《OpenGL多线程编程在网络游戏中的设计与实现_胥友.pdf》由会员分享,可在线阅读,更多相关《OpenGL多线程编程在网络游戏中的设计与实现_胥友.pdf(3页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、科技情报开发与经济SCI-TECH INFORMATION DEVELOPMENT ECONOMY2009 年第 19 卷第 12 期函数名WSAStartupsocketsendtorecvfrombindclosesocketwascleanup功 能初始化进程对 Ws2_32.dll 的使用创建一个指定的形式 socket发送数据到指定目标接受数据包并保存源地址绑定 socket 到端口关闭一个现有的 socket结束对 WS2_32.d11 的使用1OpenGL 概述OpenGL,是一个性能优越的图形应用程序设计(API)接口,它以高性能的交互式三维图形建模能力和易于编程开发,已经成为
2、一种三维图形开发标准,是从事三维图形开发工作的必要工具。在 OpenGL 应用程序中可以使用多个线程,每个进行OpenGL 调用的线程都必须有且只有一个自己的当前着色环境。对于多线程应用程序,必须采取措施确保一个线程的输出不影响另一个线程的输出。2基于 UPD 协议的网络编程UDP(User Datagram Protocol)是一个无连接的网络协议,它不要求很高的可靠性,所以它的数据传输速度快得多。本系统在设计通信方式的时候,考虑到了可靠性因素,采取了相应的措施,起到了避免可能丢掉数据封包所带来的影响。VC进行网络编程需要在工程中添加相应的函数库WS232.lib,使用函数 WSAStart
3、up()启用 socket,在设置好 IP 及端口然后就可以使用 sendto()和 recvfrom()发送和接收数据了,通信结束后使用 closesocket()来关闭 socket。UDP 主要涉及的函数及其功能见表 1。UDP 实现过程见图 1。bind 函数是一个可选过程,作为服务器需要它将 socket 与端口关联。3OpenGL 多线程编程在网络游戏中的实现网络游戏一般都是多线程的,网络游戏都要发送和接受远程数据,在接收数据时接受线程被阻塞,为了游戏能继续运行因此用到多线程。OpenGL 以其优越的性能和其跨平台的特性在游戏开发中具有重要的地位。下面将以一个网络游戏,也就是概要中
4、提到的网络双人对战俄罗斯方块来说明 OpenGL 多线程编程以及 UDP 网络编程在网络游戏应用。31系统功能网络双人对战俄罗斯方块的设计要求在经典游戏俄罗斯方块的基础上增加网络对战功能。对战体现在玩家在各自计算机上看到对手状况,并且如果一方得分会给对手增加难度,即给对手添加一行“垃圾”,所谓增添“垃圾”即是让对手屏幕上的所有方块上升一行,再给最下面一行随即生成一行方块。因此我们的网络俄罗斯方块用户界面上有两个俄罗斯方块区域,一个区域显示本机玩家的俄罗斯方块,另一个区域显示对手情况。32系统结构设计网络双人对战俄罗斯方块需要实时的显示对手情况,因此一方数据变更时必需发送信息给对方。如果两个玩家
5、的程序直接通信,那么必须需玩家自己设置对方 IP 地址和端口。这样会增加了使用的复杂性。因此本系统采用了一个服务器程序来解决这个问题。服务器的工作过程是客户程序先与服务器取得联系后,由服务器记录两个客户地址并编号(例如 0 号和 1 号),编号完成以后服务器向两个地址发送游戏开始的消息。双方接受到服务器的消息后启动游戏。游戏开始后服务器便开始客户端程序间的消息转发,服务器在接收到一条消息以后将源地址与记录的两个地址比较,如果是 0 号地址,就将该消息发送到 1 号地址。如果是 1 号地址就将消息发送到 0 号地址。按照前面的描述,本文介绍的网络双人对战俄罗斯方块是由两个应用程序构成,即客户端程
6、序和服务器程序。服务器程序和客户端程序通过 UDP 协议进行通信。服务器程序完成客户程序间消息的转发(见图 2)。当然也可以将服务器程序设计成一个UDP 打洞服务器,由服务器建立通信通道后客户程序之间直接通信,也可以达到同样的效果。33系统实现本文介绍网络双人对战俄罗斯方块的实现过程是一个自下而上的逐步扩展的过程。首先设计一个传统的俄罗斯方块程序,在此基础上设计单机的双人对战俄罗斯方块程序,然后是网络双人对战俄罗斯方块。文章编号:10056033(2009)120104-03收稿日期:20090301OpenGL 多线程编程在网络游戏中的设计与实现*本文为黄冈师范学院院基金项目(项目编号:07
7、CA0850)的论文。胥友,肖飞(黄冈师范学院,湖北黄冈,438000)摘要:以一个网络游戏为例介绍了 OpenGL 多线程编程,阐述了 VC中使用 Socket进行 UDP 网络编程的方法。关键词:OpenGL;多线程;UDP中图分类号:TP317.4文献标识码:A表 1基于 UDP 协议编程的主要函数及功能?WSAStartupWSAClearupsocketbindrecvfromsendtoclosesocket图 1基于 UDP 协议编程的流程图 客户端程序(player1)服务器程序(Server)客户端程序(player2)图 2服务器程序与客户端程序的关系104系统实现采用面向
8、对象的设计方法,客户端程序主要由三类构成,分别是俄罗斯方块类 fk、OpenGL 应用程序类GameApp 以及网络俄罗斯方块类 netfk,见图 3。3.3.1俄罗斯方块类 fk俄罗斯方块类实现了经典俄罗斯方块游戏,init()方法完成方块界面的初始化,move()方法用来控制俄罗斯方块的移动和变形,方块落到底时调用 change()方法将完成消去方块记分等一系列任务并产生新的方块。makerubbish()是产生“垃圾”的方法。3.3.2OpenGL 应用程序类 GameAppOpenGL 应用程序类的作用是创建一个指定规格的窗口,并初始化 OpenGL,同封装了窗口的消息循环。3.3.3
9、网络双人对战俄罗斯方块类 netfk网络双人对战俄罗斯方块类是本系统的核心,实际上一个客户端程序就是一个 OpenGL 应用程序类和一个网络双人对战俄罗斯方块类的实例。网络双人对战俄罗斯方块类包含两个俄罗斯方块类的对象作为其成员,一个由本地玩家控制,另外一个显示对手情况。网络双人对战俄罗斯方块类主要有以下方法和成员:时钟响应 Timer()、键盘响应 move()、接受远程消息线程lisenThread()、远程消息响应 message()、本地俄罗斯方块对象hostfk、远程俄罗斯方块对象 remotefk。网络双人对战俄罗斯方块类的 timer()方法是响应时钟消息的方法,完成方块的定时下
10、落。move()方法是在接受到键盘消息后控制方块移动和旋转以及下落,同时还要在移动后发送消息给对方。lisenThread()是网络双人对战俄罗斯方块的侦听线程,在网络双人对战俄罗斯方块构造时该线程被创建,完成连接服务器和接受对方消息的作用。message()方法是在接收到对方消息后刷新远程俄罗斯方块对象的数据。由于网络俄罗斯方块增加了网络功能,需要访问俄罗斯方块对象的内部数据,所以它是俄罗斯方块类的友员。由于服务器程序只负责转发消息,而主要任务都由客户端完成。因此客户端程序在系统设计中占有更大比重。因此构成客户端程序系统的三个类也是本系统的主要组成部分。服务器设计需要的网络编程技术在客户程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 多线程 编程 网络游戏 中的 设计 实现 胥友

限制150内