OpenGL多线程编程在网络游戏中的设计与实现

2009-9-28 作者: 胥友 肖飞 来源: 万方数据

关键字: OpenGL 多线程 UDP 

以一个网络游戏为例介绍了OpenGL多线程编程,阐述了VC++中使用Socket进行UDP网络编程的方法。

  1 、OpenGL概述

  OpenGL是一个性能优越的图形应用程序设计(API)接口.它以高性能的交互式三维网形建模能力和易于编程开发,已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。在OpenGL应川程序中可以使用多个线程。每个进行OpenGL调用的线程都必须有且只有一个自己的当前着色环境。对于多线程应用程序,必须采取措施确保一个线程的输出不影响另一个线程的输出。

  2、基于UPD协议的网络编程

  UDP(User Datagram Protoc01)是一个无连接的网络协议。它不要求很高的可靠性.所以它的数据传输速度快得多。本系统在设计通信方式的时候,考虑到了可靠性因素,采取了相应的措施,起到了避免可能丢掉数据封包所带来的影响。

  VC++进行网络编程需要在丁程中添加相应的函数库WS2_32.lib使用函数WSAStartup()启用socket,在设置好IP及端口然后就可以使用sendto()和recvfrom()发送和接收数据了。通信结束后使朋closesocket()来关闭socket。UDP主要涉及的函数及其功能见表1。

  UDP实现过程见图1。bind甬数是一个可选过程.作为服务器需要它将socket与端口关联。

  3 、OpenGL多线程编程在网络游戏中的实现

  网络游戏一般都是多线程的,网络游戏都要发送和接受远程数据,在接收数据时接受线程被阻塞.为了游戏能继续运行闲此用到多线程。OpenGL以其优越的性能和其跨平台的特性在游戏开发中具有重要的地位。下面将以一个网络游戏,也就是概要中提到的网络双人对战俄罗斯方块来说明OpenGL多线程编程以及UDP网络编程在网络游戏应用。

  3.1 系统功能

  网络双人对战俄罗斯方块的设计要求在经典游戏俄罗斯方块的基础上增加网络对战功能。对战体现在玩家在各自计算机上看到对手状况,并且如果一方得分会给对手增加难度,即给对手添加一行“垃圾”.所谓增添“垃圾”即是让对手屏幕上的所有方块上升一行。再给最下面一行随即生成一行方块。岗此我们的网络俄岁斯方块用户界面上有两个俄罗斯方块区域。一个区域显示本机玩家的俄罗斯方块.另一个区域显示对手情况。

  3.2系统结构设计

  网络双人对战俄岁斯方块需要实时的显示对手情况,网此一方数据变更时必需发送信息给对方。如果两个玩家的程序直接通信.那么必须需玩家自己设置对方lP地址和端口。这样会增加了使用的复杂性。闪此本系统采用了一个服务器程序来解决这个问题。服务器的T.作过程是客户程序先与服务器取得联系后.由服务器记录两个客户地址并编号(例如0号和1号)。编号完成以后服务器向两个地址发送游戏开始的消息。双方接受到服务器的消息后肩动游戏。游戏开始后服务器便开始客户端程序问的消息转发,服务器在接收到一条消息以后将源地址与记录的两个地址比较.如果是0号地址。就将该消息发送到1号地址。如果是1号地址就将消息发送到0号地址,按照前面的描述.本文介绍的网络双人对战俄岁斯方块是由两个应用程序构成.即客户端程序和服务器程序。服务器程序和客户端程序通过UDP协议进行通信。服务器程序完成客户程序问消息的转发(她网2)。当然也可以将服务器程序设计成一个UDP打洞服务器。由服务器建立通信通道后客户程序之问直接通信.也可以达到同样的效果。




责任编辑:熊东旭