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