这基本上是一个进程与线程的问题,两者没有太大区别,有时线程被称为轻量级进程。最大的区别是,一个单独的进程具有其自己的地址空间,但还有其他区别(1):
每个过程
- 地址空间
- 全局变量
- 打开文件
- 子进程
- 待处理的警报,中断和信号处理程序
每个线程
基于这些差异,在同一进程中拥有服务器线程和客户端线程可能很方便,以便您可以共享文件句柄和全局变量。这将是“在同一进程中”方法的一个论点,另一个(小的)论点是,每个进程仅获得一个“ Windows防火墙”弹出窗口。“不同过程”方法的一个论点是,一个人可以运行多个服务器而不必运行多个客户端。对于像设置这样的专用主持人来说,这是理想的选择,这是我们在第一人称射击游戏中经常看到的一种方法。
现在,对于即使是离线游戏(甚至可能是单人游戏)都具有服务器进程或线程的想法,这是一个在实践中经常使用的好主意。您可以通过查看加载屏幕来告诉很多游戏做到这一点,诸如“接收”之类的小提示将使它消失。这样做是合乎逻辑的,因为如果您要成为多人游戏,那么大多数游戏规则将由服务器控制,那么为什么不让它为单人游戏管理呢?这减少了您必须编写的代码,并使客户端和“游戏”之间的分隔更加清晰,这将提高您的代码质量。
现在如何在进程和线程之间通信?跨进程通信可以通过多种方式完成(命名管道),共享内存,COM,这实际上取决于您使用的技术。但是,如果要制造服务器,则可能需要使用套接字和类似TCP之类的网络变体,这当然是LIDGREN派上用场的地方。
这些技术中的很多对于跨线程通信也是有效的。但这更多地取决于您使用的技术。您可以再次使用TCP,但也许更简单的系统将是事件和编组,尽管这可能会使您的游戏循环变得不确定(2)。
资料来源
- 操作系统设计和实现(MINIX书),Andrew S. Tanenbaum撰写的第三版
- 通过Glenn Fiedler修正您的时间步长:http://gafferongames.com/game-physics/fix-your-timestep/