【问题标题】:Dedicated server vs combined client-server?专用服务器与组合客户端-服务器?
【发布时间】:2012-01-22 14:49:20
【问题描述】:

我正在编写游戏服务器和客户端。服务器生成一个世界并将其提供给各种玩家客户端。它不是大型多人游戏。

客户端(至少目前)运行要求相当高的软件渲染器,以及执行标准客户端模拟(然后需要经过权威服务器的批准),因此任何可用的处理可扩展性都将是好的。

服务器也将是处理器密集型的,并且鉴于项目的性质,可能只会随着项目的进展而变得更多。世界是程序化的,其中一些发生在游戏中;世界选项是在游戏开始之前根据当时的系统功能设置的(理想情况下运行的外部进程最少)。因此,硬件线程数量的可扩展性对于服务器来说是绝对必要的。

同样,由于这不是 MMO,玩家都可以访问客户端和服务器,以便他们可以设置自己的服务器。许多玩家将只有一台机器来托管服务器并运行客户端,以便能够与他们的朋友一起玩。基于这个事实,哪个更适合我?

  • 结合的客户端和服务器进程
  • 独立的客户端和服务器进程

...为什么?

PS。即使上述一些复杂性只是在以后才出现,我也需要尽早使架构(在这方面)正确。

【问题讨论】:

    标签: multithreading networking scalability


    【解决方案1】:

    我想说,帮助您做出决定的最重要方面是 - 是否存在客户端和服务器共享的计算密集型任务?如果您可以为客户端和服务器进行一次计算而不是两次,那么拥有一个进程是有意义的(但这可能很难实现)。否则我说分开。

    我发现分离进程的优势很少:

    • 当客户端崩溃时(我想说更可能是复杂的渲染器和/或有缺陷的图形驱动程序)服务器保持正常运行
    • 意外(和/或愤怒的 QQ)退出游戏不会为其他玩家杀死游戏
    • (如果需要)将服务器绑定到少数内核并将客户端绑定到其他内核会更容易
    • 您可能无论如何都需要编写专用服务器(因此它可以托管在远程服务器上,可能没有图形)并将其移植到其他操作系统可能更容易......
    • 使客户端代码整体不那么复杂

    (如果我想出的话,我以后可能会在列表中添加一些东西)

    【讨论】:

    • 我发现您的第 1 到第 3 点特别有见地,谢谢您。至于 4,这并不完全正确;可以编写一个带有嵌入式客户端的服务器,然后简单地关闭客户端方面。至于 5,可能,但当然,正如您在帖子开头所建议的那样,客户端和服务器之间会有重复的逻辑。但是,在同一机器上运行两者时,您不会解决客户端与服务器之间的限制问题。唯一真正阻止我使用纯客户端服务器的是这个问题。
    • 好吧,我一开始就试图建议的不仅仅是对代码进行重复数据删除,而是删除实际的执行冗余。意思是,如果客户端和服务器都必须做某事 - 即。一些物理计算 - 您可以在客户端和服务器之间共享结果,然后将它们放在一个进程中并共享结果是有意义的。但是这个效率主要取决于可以共享多少工作以及实现共享的难度。
    • 我意识到,问题在于服务器是权威的,所以如果不将服务器安全置于某种程度的风险中,我真的无法结合该逻辑。另一个指向纯客户端服务器的指针。
    • 您有什么安全问题?只要用户控制服务器,他就可以在这两种情况下滥用它。如果服务器比客户端做更严格的计算,你仍然可以使用服务器的结果。
    • "当客户端崩溃时..."
    【解决方案2】:

    关注点分离始终是一个重要因素,因此最好将它们保持为单独的进程。它对性能也更好。如果我只想使用客户端功能,则没有理由将与服务器相关的代码也保留在同一个应用程序中。我只会在需要时启动它。

    【讨论】:

    • 您建议如何管理在高需求下运行的服务器模拟,同时在同一个机器上运行客户端?记住服务器设置是在游戏开始之前在游戏大厅中设置的,并且在运行时不会更改?我认为使用组合的客户端-服务器应用程序可以更好地进行整体控制,因为我们可以最大限度地减少线程竞争,并将服务器优先于客户端。
    • 这取决于这个需求有多高。标准台式 PC 为客户提供服务的能力非常有限。除了在同一台机器上运行的客户端之外,不要期望连接超过 3-4 个客户端。一台简单的 PC 没有必要的资源。
    • 嗯。我觉得这是非常主观的。这就是我讨论可扩展性的重点……在设计时,您实际上不知道用户将拥有什么。 Total Annihilation 是可扩展服务器的一个很好的例子,它使用了很多年,超出了设计师的实际预见。十多年来,这种可扩展性非常非常好。
    • @Nick Wiggill:关于优先级,您还可以启动具有更高或更低优先级的单独进程(客户端和服务器),而不仅仅是线程。在我看来,将合并的线程一起管理是非常容易出错的。
    • 我会看到使用组合池的问题是,如果您从池中获取一些线程来为服务器执行 I/O 操作并且它们阻塞等待输入,那么您将限制客户端,因为它可以使用的线程较少(因为池线程由于 I/O 而无法使用)。保持单独的进程将确保这种干扰是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2019-03-18
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多