这是一个好的多线程服务器设计吗?

| 我有一个用于客户端-服务器游戏的服务器(最好是小型MMO的基础),我正在尝试确定组织所有内容的最佳方法。这是我所拥有的概述:
[server start]
load/create game state
start game loop on new thread
start listening for udp packets on new thread
while not closing
  listen for new tcp connection
    create new tcp client
    start clients tcp listener on new thread
save game state
exit

[game loop]
  sleep n milliseconds // Should I sleep here or not?
  update game state
  send relevant udp packet updates to client
  every second
    remove timed out clients

[listen for udp]
  on receive, send to correct tcp client to process

[listen for tcp] (1 for each client)
  manage tcp packets
这是用于管理游戏状态,tcp连接以及发送/接收udp数据包以进行状态更新的合理设计吗?有任何意见或问题吗? 我对进行游戏循环的最佳方式最感兴趣。我知道如果我有大量客户端,将会遇到问题,因为我为每个新客户端生成了一个新线程。     
已邀请:
这看起来是设计的合理起点。就扩展线程数而言,超过10个客户端(根据您的评论)也不错。只要线程主要在等待并且没有实际处理某件事,就可以在事态开始崩溃之前轻松拥有数千个线程。我记得5年前用类似的设计达到了一些极限,大约有7000个线程。     
看起来不错的设计。如果我是你,我会使用现有的nio框架,例如netty。 只需使用Google
java nio frameworks
,您就会发现几个带有示例和文档的框架。 更新资料   谢谢,但我宁愿自己做。这仅用于我的附带项目,其主要目的是 恕我直言,通过使用现有框架并专注于游戏设计,您将学到更多的知识,而不是一开始就自己做。 下次您将知道如何设计游戏,这也将使设计IO框架变得更加容易。     
我想说(尤其是在Java中),线程更多地是为了方便而不是性能(只有这么多的内核,我想您想对哪些线程具有优先级进行控制)。 关于消息交换的数量和客户端的数量,您什么也没有说,但是您可能希望从一个线程处理网络IO并使其紧密地分派传入请求的角度考虑更为自然。并将ACTUAL工作(即您在紧密循环中无法处理的请求)映射到线程池。 IIRC,在这种设置中,限制因素将是您可以等待在单个线程中同时输入的最大TCP连接数。 为了增加乐趣,可以将其与具有更轻量线程的语言的解决方案(例如Erlang)进行比较。 当然,就像@ WhiteFang34所说的那样,在您进行一些认真的模拟/代码使用之前,您将不需要这样的解决方案。相关技术(以及可以从中找到灵感的Netty等框架)也可以在此问题中找到。 创建线程有一定的成本,主要是每个线程的堆栈。     

要回复问题请先登录注册