2010-06-24 38 views
1

我已经开发了一些使用服务器端编程(PHP和C++)和Flash(用于GUI)的在线游戏(如国际象棋,跳棋,风险克隆)。现在,我想开发某种游戏门户(如www.mytopia.com)。为了做到这一点,我必须决定什么是构建我的服务器逻辑的好方法。关于多种游戏服务器的建议

起初我想在为每个游戏编程分离的游戏服务器。通过这种方式,每场比赛将是一个孤立的程序,为客户打开一个特定的端口。我还想过为每个游戏室创建不同的服务器(每个游戏室允许同时连接100个客户端)。当然,我会使用数据库来链接一切(如高分等)。

然后,我想这不是构建游戏门户服务器的最佳方式。我正在阅读关于线程编程的知识,我认为这是最好的方式。所以,我想像做一个连接线程那样只会监听新的连接客户端(这样每种类型的游戏客户端将只连接一个端口),验证这个客户端(登录),然后将这个客户端转移到特定的游戏线程(如国际象棋线程,跳棋线程等)。我将使用select(或变体)来处理异步客户端(我猜这次“每个客户端一个线程”不适合)。这个结构似乎是最好的,但我如何在线程之间进行通信?我已经读过关于竞争条件和全局作用域变量的信息,因此一种解决方案是在每次更改时都需要通过连接线程或游戏线程锁定全局客户端数组(向量或映射)(新连接,注销,更改状态等)。这样对吗?

有没有人在这样的事情?任何建议?

非常感谢

回答

0

如果使用线程,你可能有一个更简单的分时数据,但是你必须要更加注意安全性完全相同的原因。这当然不能解决一般的MT问题。

0

TBH我一直在做一个voip系统,服务器可以发出很多流,客户端可以听很多流。到目前为止,我提出的最好的体系结构只是绑定到一个端口,并使用sendto和recvfrom来处理通信。如果我从一个新地址的客户端收到一个有效的连接数据包,然后我将客户端添加到内部列表并开始向它们发送音频数据。数据包接收和响应管理(RRM)全部发生在一个线程中。音频随时准备就绪,然后从音频线程发送到所有客户端。客户响应说他们收到了音频,并在RRM线程中得到处理。如果客户端未能响应超过30秒,则我发送断开连接并从我的内部列表中删除客户端。我不需要特别容错。

至于如何在游戏中做到这一点,我的主要想法是发送一组脉冲向量(当前的和前面的'n')。这样,如果客户端不同步,它可以通过检查它应该为给定对象接收到的最后几个冲动来检查它是如何不同步的。如果它不符合它的内容,那么它可以纠正,或者如果它太不同步,它可以要求游戏状态重置。这个想法是尝试并避免完整的游戏状态重置,因为这将是一件相当昂贵的事情。

很显然,每个数据包都会被散列,因此客户端可以检查传入数据包的有效性,但它也允许客户端忽略无效数据包,并且仍然可以获得下一次更新所需的信息,从而有助于防止状态重置。

除此之外,它值得做的事情就像留意客户的位置。当客户端朝另一个方向看时或者有某种方式(即客户端看不到被告知的对象)时,向客户端发送更新没有任何意义。这也限制了嗅探传入数据包的wallhack数据包的有效性。显然,在物体变得可见之前,你必须开始发送一些东西,否则你会在不方便的时候弹出一些东西。

无论如何......那只是一些随机的想法。我必须补充说,我从来没有真正为游戏编写多人游戏引擎,所以我希望我的思考能帮助你一点:)

1

门户需要健壮,可扩展和可扩展,以便您可以应对更大的受众,更多的游戏/服务器被添加等等。一个好的开始就是研究MMO和分布式系统的设计方式。这也可能有所帮助:http://onlinegametechniques.blogspot.com/

就我个人而言,我会通过拥有一个验证服务器来集中用户,然后为每个游戏提供一个单独的游戏服务器,以验证用户对验证服务器。