你将只在游戏中直接控制一个人。但是,你可以发出模糊的命令,比如在这里建东西或者攻击这个广场。
所以我想做一个多人游戏。但是,我在理解如何向服务器发送和接收数据方面有一点问题。
想知道我怎么用线程来做这件事?
我有两个c++项目。一个用于服务器,一个用于客户端。我可以创建多个客户端并将其连接到服务器。
因此,我只需在服务器上为每个播放器创建线程,以侦听客户端输入。所以我会等待100毫秒的输入,然后发送到更新游戏,然后再重复?
我只想知道怎么设计。我也许能自己想出怎么做细节。只是需要大局。
所以我在想,如果我有两个网络线程。一个用来听客户端的输入,一个用来发送更新的东西给客户端。虽然,您可能需要在一个线程上进行网络连接,并且不能像不能在两个线程上使用openGL一样将它们分开。
发布于 2013-08-07 09:12:02
你说过是假的,是基于转弯还是实时的?通常情况下,如果你想玩一款带有计时关键元素的实时游戏,你应该把玩家的命令稍微放到未来,以弥补延迟。这最多只能是几百毫秒。
通常,服务器上的每个客户端都有一个线程。此线程处理读取数据和向特定客户端发送响应。如果您计划在服务器上存储游戏逻辑,那么您将需要一个具有并发处理的通用数据存储。请查看互斥量/信号量,以获得有关如何执行此操作的更多信息。
另一种选择是让服务器仅仅作为消息传递服务。这意味着你应该将玩家的动作编码成动作,通过服务器发送给游戏中的其他玩家。游戏本身则负责维持同步状态。
这两种方法都是有效的,这取决于您想要怎样做。如果您希望在服务器之外有一个主进程,但在客户端,您可以设置它,以便游戏的创建者拥有“额外的特权”,例如将怪物产卵到地牢。服务器会随机地做一些事情,但前提是您想要一个通用的消息传递服务器,并在游戏中包含所有特定于游戏的内容。
至于在服务器端接收数据,取决于您是在使用UDP还是TCP,您可以让线程随时监听套接字,并尝试读取数据包(您定义的格式),并在它到达时对其作出反应。
值得注意的是,您通常不需要同步所有数据,而只需要同步已更改的内容。如果时机不重要,您可以一直发送三角洲(即更改的内容)。
在这样的设计中,需要考虑的一件事是,有时有人因为网络滞后或其他原因而迟到。如果漏掉一个命令,如何解决这个问题。您应该设计游戏,以便( a)可以从过去计算动作,或者( b)实现重新同步(即将所有对象发送给所有玩家;同时暂停游戏一段时间)。
然后,我第一次在Unity中遇到的方法是将通信划分为增量更新和RPC调用。大的东西,如杀死一个怪物,捡起一个物品,等等,都会通过RPC。然而,精确的播放器运动使用增量更新和移动预测(后者意味着绘图线程可以使用前一个移动到它假定实体移动到的方向)。
至于通信本身,您可以使用轮询,也可以随时监听服务器套接字进行更新。在这种情况下,您可能希望在C++ (全双工)中使用非阻塞IO。下面是来自StackOverflow:https://stackoverflow.com/questions/4675824/how-to-implement-a-full-duplex-channel-over-tcp-with-a-single-thread的一个线程
我知道很多这是模糊的,但你的问题也有点宽泛。我建议你尽量把你的问题缩小一点,在未来提供更多的细节。
发布于 2013-09-06 20:49:35
为了对世界上所有正确的人的爱,不要为每个客户端创建一个线程。Java在早期版本中没有给您很多选择,从而造成了设计上的灾难,但没有理由将其引入现代C++代码中。
你想要一种复用器。您可以监听套接字的集合,并在它们中的任何数据可用时作出反应。都在一条线上。您可以在这些套接字上发送数据,而不需要其他线程。由于延迟原因,大多数AAA游戏都将其放入一个专用的网络线程中,但对于大多数游戏来说,它在主线程上工作得同样好。
你需要处理的最困难的部分是你要如何设计这个游戏。请注意,许多人(大多数?)RTS游戏使用网络的锁定步骤形式,这意味着服务器向每个客户端发送下一个“框架”状态,并等待某种同步事件才能执行下一个步骤。这确实意味着,如果客户端开始滞后,所有客户端都将经历相同的滞后。在考虑客户端不同步(或者需要重新同步整个状态,或者只是断开客户端)之前,限制您可以忍受多大的延迟。当然,还有很多其他的游戏网络方式,尽管我能想到的大多数文章更多地集中在对延迟敏感的射击者或大规模的MMO上,可能对你的项目不一定是很好的建议。
还要注意的是,许多文章实在过时了。例如,在像RTS这样的游戏中,TCP是一个非常好的网络选择,尤其是使用锁步网络,甚至是许多较小的MMO的首选协议。尽管如此,几乎所有关于网络的文章都是关于构建自定义UDP协议的。
总之,做最简单的事情,直到你有确凿的证据证明你需要更复杂的东西。
https://gamedev.stackexchange.com/questions/60162
复制相似问题