0

如果我的 MMORPG 服务器有 1 个线程运行异步套接字和异步数据包处理程序,并且在该 1 个线程中我有一个包含游戏中所有实体的静态世界。

如果说异步数据包处理程序收到攻击消息,会导致任何线程问题,导致搜索世界中的实体以找出目标。

同时,静态 World Proc 方法增加了包含怪物实体的字典的大小,添加了额外的怪物。

如果这都在同一个线程上,服务器会爆炸吗?

4

3 回答 3

2

服务器会爆炸吗?

是的,您可能会遇到问题(“explode”),因为异步内容在不同的线程上运行(即使您没有显式创建该线程)并且它可能与您同时访问共享对象(世界)主线程。许多数据结构(包括字典)不是为这种情况设计的,可能会崩溃或返回错误的答案。

典型的方法是使用锁来保护您的共享对象:在修改它之前获取锁,进行任何修改,然后释放锁。这样,一次只有一个线程访问世界(及其字典),因此一切都保持一致。避免了爆炸。

另一种方法是切换到更同步的网络形式,例如避免完成处理程序,而是等待每个玩家的消息,然后对输入进行操作。这可以非常简单地完成,但简单的方法有缺点:任何一个慢速玩家都可以减慢整个过程。很遗憾,您可能不得不以一种或另一种方式处理一些复杂性。

于 2013-02-22T03:01:57.290 回答
0

如果我在一行中给出答案。服务器会爆炸。由于网络活动和游戏逻辑在同一个线程中。正如您所提到的,您将需要高网络使用率。

如果你看一下F# ,我真的很喜欢。它有你需要的所有东西。据我从问题中得到。很少有像集合更改这样的事情,并且默认情况下异步是语言。即便是Nodejs也值得一试。但同样,这一切都取决于要求。虽然我试图解释一些可以帮助你做出决定的关键词。

非阻塞:这意味着线程不会被事件阻塞。它不会等待函数等待另一个函数执行。但这并不意味着你不能阻止它。在任何情况下,它都是单线程。

Async:有点像这样。但是在 C# 5 中,异步带有关键字,因此您不必执行编程的线程部分。

并行处理:在游戏开发中并行处理很重要。现在,您可以使用多线程或只使用TPL

对于基于 UI(有很多对象)的游戏,我强烈建议您分离处理线程和 UI 线程以改善用户体验。否则 FPS 会在您处理数据时下降。

让我知道是否需要任何进一步的信息。

如果您不关心它,服务器将不会关闭。

于 2013-02-22T02:33:07.063 回答
0

如果在同一个线程上,那么没有。如果您在单个线程上完成提到的所有工作,那么就没有问题。但是,如前所述,如果您正在跨线程访问“共享”对象实例,那么是的,将会出现问题,并且需要锁定(使用“lock(){...}”块)。

随着用户群的增加,如果对传入请求使用非阻塞事件模型,则必须密切关注生成的线程数或事件消息。

在一个不同但相关的注意事项上,请关注这个基于 C# 的 MMO 服务器(支持脚本):https ://dreamspace.codeplex.com/ - 它可能很快就会对 MMO 游戏创建者有很大帮助(将支持 Construct 2 默认)。

于 2013-03-27T04:32:29.440 回答