2010-09-21 65 views
1

我正在尝试制作多人网络游戏。每个玩家在屏幕上用矩形表示。我使用的OpenGL的图形和用户输入(MOVE-LEFT,MOVE-RIGHT等命令)将由它处理(或GLUT或sumthing)。对等通信线程

我有以下的游戏架构。

游戏中有4名玩家(节点)。每个玩家都使用UDP发送和接收数据。每个玩家可以发送数据给其他玩家。

如果来自相应用户的任何输入,数据需要由玩家发送。 (例如MOVE-LEFT命令等)。 只要玩家(比如p1)从任何其他玩家(比如p2)接收到任何数据(比如玩家p2在屏幕上的新位置),玩家p1的屏幕应该立即更新。

我在想以下几行: 创建一个处理图形的线程。 使用UDP创建另外2个线程,每个线程用于接收和发送数据。

每当图形线程从用户获取'myposition'的输入时,它就会更新共享全局变量'myposition'。正在等待这个变量的网络发送线程被激活,并且告诉其他玩家关于它的新位置。

类似地,每当从任何其他玩家'i'收到'位置'更新时,网络接收线程更新全局变量player [i] .position。图形线程现在将使用更新后的位置重新绘制场景。

此设计是否正确。如果是的话,这个设计有多好,我该如何改进它

回答

5

网络游戏编程是一个话题的怪物,所以很难说“是的,这是你如何设计网络架构”。它完全取决于你的游戏需求。你计划发送什么样的数据包?每帧都会发送一个数据包,表明玩家A正在拿着左键吗?这种流量局限于局域网吗?

对于在4个客户端之间同步移动这样简单的事情,将发送,接收和呈现放在单独的线程中似乎是矫枉过正。也许作为一个起点,你应该从一个更简单的设计开始,并且当你感觉你的数据包不够快时,转向多线程。

例如,您可能希望有一个游戏循环如下内容(全部在同一个线程):

while (running): 
    readUpdSocketForIncomingPackets(); 
    updateGameObjects(); 
    renderGameObjects(); 
    sendPacketsToPeers(); 

在每一帧的开始,您可以读取UDP套接字传入数据包,更新职位(以及其他任何你发送给你的同龄人),然后绘制。随着游戏输入的处理,数据包被创建并累积在数据包队列中。这样做,可以让你执行优化,例如将多个消息填入/合并到一个数据包中,删除重复的消息(例如,只发送最新的位置更新)等等。因此,在每个游戏循环结束时,最终队列数据包被处理并发送给对等体。

但是,这是一个很大的话题,我对许多细节进行了描述。

看看老头子的博客: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/

他得到了解决网络游戏编程的一些基本面的一些伟大的文章。