如果我的MMORPG服务器有1个线程运行异步套接字和异步数据包处理程序,那么在该1个线程中我有一个包含游戏中所有实体的静态世界。
如果说异步数据包处理程序接收到攻击消息,那么会出现任何线程问题,导致搜索世界上的实体以找出目标。
同时静态World Proc方法增加了包含怪物实体的Dictionary的大小,增加了产生的额外怪物。
如果这一切都在同一个线程上,那么服务器是否会爆炸?
答案 0 :(得分:2)
服务器会爆炸吗?
是的,你可能遇到问题(“爆炸”),因为异步的东西在不同的线程上运行(即使你没有显式创建那个线程),它也可能同时访问共享对象(世界)时间作为主线程。许多数据结构(包括词典)不是为这种情况设计的,可能会崩溃或返回错误的答案。
典型的方法是使用锁来保护您的共享对象:在修改之前获取锁,进行任何修改,然后释放锁。这样,一次只有一个线程访问世界(及其字典),因此一切都保持一致。爆炸避免了。
另一种方法是切换到更加同步的网络形式,可能是例如避免完成处理程序,而是等待每个玩家听到,然后对输入进行操作。这可以非常简单地完成,但简单的方法有缺点:任何一个慢速玩家都可以放慢整个过程。很遗憾,你可能不得不以这种或那种方式处理一些复杂问题。
答案 1 :(得分:0)
如果我在一行中给出答案。服务器将爆炸。由于网络活动和游戏逻辑在同一个线程中。正如您所提到的,您将需要高网络使用率。
如果你看一下F#,我真的很喜欢。它拥有您需要的所有东西。据我所知。很少有东西像收集更改,默认情况下async是语言。即使是Nodejs,也值得一试。但这又取决于要求。虽然我尝试解释一些可能有助于您做出决定的关键字。
非阻塞:这意味着线程不会阻塞事件。它不会等待函数等待另一个函数执行。但这并不意味着你无法阻止它。无论如何,它都是一个单一的线程。
异步:这是一些类似的东西。但是在C#5中,async带有关键字,因此您不必进行线程编程。
并行处理:在游戏开发中并行处理很重要。现在,您可以使用多个线程或只使用TPL。
在基于UI(有许多对象)游戏的情况下,我强烈建议您将处理线程和UI线程分开以改善用户体验。当您处理数据时,其他FPS将会关闭。
如果需要进一步的信息,请告诉我。
如果您不关心它,服务器不会停机。
答案 2 :(得分:0)
如果在同一个线程上,那么没有。如果你正在做一个线程上提到的所有工作,那么没有问题。但是,如上所述,如果您正在跨线程访问“共享”对象实例,那么是的,会出现问题,并且需要锁定(使用“lock(){...}”块。
随着您的用户群增加,您将不得不关注生成的线程数,或者如果对传入请求使用非阻塞事件模型,则必须关注事件消息。
在另一个相关的注释中,请关注这个基于C#的MMO服务器(具有脚本支持):https://dreamspace.codeplex.com/ - 它可能很快成为MMO游戏创建者的一大帮助(将支持Construct 2 by默认值)。