在同一过程中运行服务器和客户端


9

我才刚刚开始与Lidgren和网络合作,并且我意识到可以在同一过程中同时运行服务器和客户端。

是否出于任何原因不鼓励这种做法?

语境

我问的原因是因为我从理论上讲,该概念可能使我将单人游戏模式和多人游戏模式都视为同一模式,这将非常有帮助。

按照我的思路,这是我想到的分布:

  • 单人游戏-1个服务器+ 1个客户端在同一过程中。通信速度有多快?
  • 多人游戏-与主机的单人游戏相同,彼此之间有 1个附加客户端。

我正在描绘的执行流程是供客户端接收用户输入并将通知发送到服务器的。然后,服务器对其进行验证,并广播将由所有客户端执行的操作。只有一个客户端(即单人游戏)还是多个客户端(即多人游戏)都没关系。

Answers:


7

这基本上是一个进程与线程的问题,两者没有太大区别,有时线程被称为轻量级进程。最大的区别是,一个单独的进程具有其自己的地址空间,但还有其他区别(1):

每个过程

  • 地址空间
  • 全局变量
  • 打开文件
  • 子进程
  • 待处理的警报,中断和信号处理程序

每个线程

  • 程序计数器
  • 寄存器

基于这些差异,在同一进程中拥有服务器线程和客户端线程可能很方便,以便您可以共享文件句柄和全局变量。这将是“在同一进程中”方法的一个论点,另一个(小的)论点是,每个进程仅获得一个“ Windows防火墙”弹出窗口。“不同过程”方法的一个论点是,一个人可以运行多个服务器而不必运行多个客户端。对于像设置这样的专用主持人来说,这是理想的选择,这是我们在第一人称射击游戏中经常看到的一种方法。

现在,对于即使是离线游戏(甚至可能是单人游戏)都具有服务器进程或线程的想法,这是一个在实践中经常使用的好主意。您可以通过查看加载屏幕来告诉很多游戏做到这一点,诸如“接收”之类的小提示将使它消失。这样做是合乎逻辑的,因为如果您要成为多人游戏,那么大多数游戏规则将由服务器控制,那么为什么不让它为单人游戏管理呢?这减少了您必须编写的代码,并使客户端和“游戏”之间的分隔更加清晰,这将提高您的代码质量。

现在如何在进程和线程之间通信?跨进程通信可以通过多种方式完成(命名管道),共享内存,COM,这实际上取决于您使用的技术。但是,如果要制造服务器,则可能需要使用套接字和类似TCP之类的网络变体,这当然是LIDGREN派上用场的地方。

这些技术中的很多对于跨线程通信也是有效的。但这更多地取决于您使用的技术。您可以再次使用TCP,但也许更简单的系统将是事件和编组,尽管这可能会使您的游戏循环变得不确定(2)。

资料来源

  1. 操作系统设计和实现(MINIX书),Andrew S. Tanenbaum撰写的第三版
  2. 通过Glenn Fiedler修正您的时间步长:http//gafferongames.com/game-physics/fix-your-timestep/

1
我唯一的补充是,如果要使用与远程客户端相同的代码无缝地使本地客户端与本地服务器一起工作,并且希望该客户端再次使用相同的代码来连接到远程服务器, 1)为服务器使用一个进程,以及2)使用网络,因为这是共同点。除非您想编写两个版本的运输代码,否则始终=)
Patrick Hughes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.