Questions tagged «client-server»

客户端-服务器模型是集中式计算模型,其中一个节点(服务器)为其他节点(客户端)执行某些服务。

2
这是适合我们的MMORPG手机游戏的架构吗?
这些天,我正在尝试为公司设计一款新的MMORPG手机游戏的体系结构。该游戏类似于黑手党战争,iMobsters或风险。基本思想是准备一支军队与您的对手(在线用户)作战。 尽管我以前曾从事过多个移动应用程序的工作,但这对我来说却是新事物。经过大量的努力,我提出了一个架构,该架构借助高级流程图进行了说明: 我们决定采用客户端-服务器模型。服务器上将有一个集中式数据库。每个客户端将拥有自己的本地数据库,该本地数据库将与服务器保持同步。该数据库用作存储不经常更改的内容(例如地图,产品,库存等)的缓存。 使用此模型后,我不确定如何解决以下问题: 同步服务器和客户端数据库的最佳方法是什么? 在将事件更新到服务器之前,是否应该将事件保存到本地数据库?如果应用由于某种原因终止,然后将更改保存到集中式数据库,该怎么办? 简单的HTTP请求是否可以达到同步目的? 如何知道当前登录的用户?(一种方法是让客户端每隔x分钟继续向服务器发送一个请求,以通知该请求处于活动状态。否则,认为客户端处于非活动状态)。 客户端验证足够吗?如果没有,如果服务器未验证某些内容,如何还原操作? 我不确定这是否是一个有效的解决方案,以及它将如何扩展。如果已经在此类应用程序上工作的人们能够分享他们的经验,这可能有助于我提出更好的建议,我将不胜感激。提前致谢。 附加信息: 客户端是在称为果酱的C ++游戏引擎中实现的。这是一个跨平台的游戏引擎,这意味着您可以在所有主要的移动操作系统上运行您的应用程序。我们当然可以实现线程化,这在我的流程图中也有说明。我打算将MySQL用于服务器,将SQLite用于客户端。 这不是回合制游戏,因此与其他玩家的互动不多。服务器将提供在线玩家列表,您可以通过单击“战斗”按钮与他们进行战斗,并在播放一些动画后宣布结果。 对于数据库同步,我想到了两种解决方案: 存储每个记录的时间戳。还应跟踪本地数据库的最新更新时间。同步时,仅选择时间戳较大的行并将其发送到本地数据库。为已删除的行保留一个isDeleted标志,以便每个删除行为都只是一个更新。但是我对性能有严重的怀疑,因为对于每个同步请求,我们都必须扫描整个数据库并查找更新的行。 另一种技术可能是保留针对用户进行的每次插入或更新的日志。当客户端应用程序要求同步时,请转到该表并找出已更新或插入了该表的哪些行。这些行成功传输到客户端后,请删除此日志。但是我想到了如果用户使用其他设备会发生什么。根据日志表,已为该用户传输了所有更新,但实际上是在另一台设备上完成的。因此,我们可能还必须跟踪设备。实施此技术比较耗时,但不确定是否会执行第一个。

3
在多人游戏中插值位置
为了节省多人游戏的带宽,我不会在每个服务器滴答声中更新每个对象,而是每个对象都有一个updateRate来告诉游戏该对象应在每个X服务器滴答声中进行更新。 当我收到某个对象的更新消息时,我会计算出我希望下次更新的时间: origin = serverCurrentPosition diff = serverNextPosition - origin arriveTime = now + timeBetweenTicks * updateRate 当我绘制对象时,我计算了到下一次更新为止的剩余时间,并据此插值位置: step = 100 / timeBetweenTicks * updateRate delta = 1 - step * ((arriveTime - now) / 100) position = origin + diff * delta 它可以工作...但是在图形中仍然有些抖动,尽管按照我的理论,每件事都可以解决,因为缩放应该照顾一些滞后,应该吗? 所以这里的问题是,这是最好的方法吗?我应该在计算中加入实际滞后吗?如果是这样,我该怎么做?我做了一些实验,但抖动只会变得更糟。

3
实时多人游戏的Javascript和PHP?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 2年前关闭。 我想知道将Javascript客户端与PHP / mysql服务器端相结合对于HTML5实时多人(小型)浏览器游戏是否是一个好主意? 我的技术知识非常有限,即使我将来打算学习node.js,现在的学习难度也很大。 因为我已经熟悉PHP,所以我认为它的运行速度会更快。 我当时认为的规模是2-8位玩家。并尝试使客户端到服务器的消息计数尽可能少。 我打算存储/处理的值是: 玩家名称和ID。 X和Y位置。 健康。 配备的物品(最多8个插槽,可能更少)。 动作(步行,攻击,使用等,但一次只能有1个动作/玩家)。 项目符号X,Y坐标和轨迹。 公会/氏族名称。 以及一些基本的聊天/邮件功能。 我的猜测是,即使这不是最佳解决方案,但只要我保持逻辑小,这是完全可行的。我对吗?

4
实时多人游戏使用哪个数据库(RDBMS,NoSQL和BOTH)?
我正在开发一个实时多人游戏,该游戏将需要一个数据库(用于诸如播放器配置文件,朋友,解锁,新闻等功能)。这是一个标准PC游戏(不是基于浏览器的游戏),将使用客户端服务器建筑。我刚接触数据库,过去几天,我偶然发现了激烈的争论:RDBMS与NoSQL,进行了一些研究。目前,我倾向于NoSQL,但是在阅读了每种用法(RDBMS和NoSQL)之后,我很想同时使用两者。我知道这似乎很奇怪,但让我解释一下我的情况: 我的团队有一个共享的虚拟主机程序包,该程序包提供无限的mySQL存储和带宽,唯一的警告是我们一次只能打开25个连接(共享主机规则)。我打算将其用于我的网站(无疑是一种典型用法),以便发布新闻更新,支持社区功能(例如评论,上传粉丝艺术等)等。一切都很好,但是-!这是事情变得有趣的地方...我想在游戏中显示发布在我的网站上的相同信息。这意味着我的网站和游戏都使用mySQL。除了新闻发布之类的内容外,我还计划在游戏中将其用于聊天和服务器列表之类的事情。我最关心的是25连接规则。 这就引出我问问题1:这是否可行,还有更好的选择吗? 现在,除此之外,我还阅读了有关NoSQL的性能以及适用于实时游戏的信息(我可能是错的,我经历了一场巨大的RDBMS与NoSQL的火焰之战,到达这里并可能被烧死了)。基本上,我想对所有游戏对象数据使用MongoDB。 同样,如果我提供一些背景信息将对您有所帮助:我找到了一个主机(MongoLab),该主机免费提供240MB的MongoDB软件包,我打算在需要升级之前使用它。假设有240MB,我已经计算出能够存储大约60,000个播放器(如果每个播放器大约为4KB,而我们忽略了可能存储的其他内容)。存储空间以及将来必须支付更多费用(我们的游戏应该成功)不是问题。我目前打算对所有游戏对象数据使用MongoDB的唯一原因是由于将访问该游戏对象数据的频率(例如,每当玩家被杀死,拿起物品,开枪等时)也喜欢无格式的直接文档(这使得映射游戏对象数据更加容易)。我应该注意到,一次 我打算在我的网站上使用相同的MongoDB来显示玩家资料信息(我不关心完全的一致性,可以从游戏中进行更新有些延迟)。这使我想到第二个问题,即问题2:这是个好主意还是应该做得更好? 游戏将具有类似于以下的启动体验: 客户端登录(MongoDB) 客户端位于带有聊天室的游戏首页(MySQL) 客户端转到服务器列表(MySQL) 客户端连接到服务器并在其中播放 服务器传达所有播放器的更新(MongoDB) 这就是我想象中的工作方式。这对您来说看起来不错,还是对如何改进此计划有建议?

2
多人FPS服务器端性能
这与MMO的性能有关,除了有关带宽的问题。这与cpu负载有关。 我使用node.js和webGL编写了一个简单的FPS。这非常简单,就像MIDI Maze的BuddyMaze克隆一样。发生的事情很少,每个人都可以二维移动(没有高度),发射简单的弹丸,然后撞到墙壁上。 现在,如果我与服务器建立多个连接,每个玩家在旋转时迅速射击,那么在服务器最大化核心并放慢速度之前,我可以在游戏中获得约15-20名玩家。这是在服务器上以30 fps的速度运行时。在10 fps下,我获得约25-30个连接。这是非常糟糕的,因为游戏很快将有更多工作要做,而我需要让更多的玩家适应这一点,这是可行的努力。 我的兄弟刚刚指出了有关其同事的TF2服务器的一些统计信息。他的服务器的规格低于我们的服务器,但它运行的是TF2,显然是一个复杂得多的游戏,每秒高达500滴答声,每个核心36个用户。另外,我们目前消耗的带宽比它们消耗的要多得多,但是我们还没有试图降低太多带宽。 这怎么可能?有什么样的技巧可以将服务器性能提高到这种程度?我知道的一些东西包括: 降低服务器上的帧速率,并在客户端上插入位置。我得到了一些好处,但是显然TF2服务器甚至都没有为此烦恼。 在客户端上执行诸如冲突检测之类的昂贵工作,并在服务器上很少进行验证。我还没有搬过来,今晚我会。即使这样,我也不希望获得如此巨大的收益。 将运动场划分为区域(四叉树)以最小化计算。还没有机会。 我考虑过不幸的是,node.js的速度比TF2正在使用的速度慢得多,并且可能不适合这种高强度任务。 这一切都在服务器配置魔术中吗? 那么,行业中的其他窍门是什么,即仅执行服务器上的最低要求,又具有完美的游戏体验?“推迟到客户端以节省CPU时间”与“不信任客户端”之间存在很大的冲突,因此也许有助于了解在各种情况下的界​​限如何? 更新资料 剖析确实是我所发现的唯一绝对可靠的咒语。我很快在代码周围包装了一些计时功能(感谢FP!),发现了我从未想到的东西:将数据广播到客户端的行为几乎占了整个执行时间。具体来说,约占90%。进一步的测试表明,这段时间取决于客户端数量和数据大小,而后者则更多。在20位用户的负载下,我只发送“ {}”而不是全部数据,从而将广播时间从24ms缩短为2ms,降低了90%。但是只有5个用户,广播大约需要0.5毫秒。因此,我显然需要在此处进行一些优化。 最明显的改进是视线检查。这样既可以减少关心数据的人数,也可以减少发送给感兴趣的各方的数据量。我可以尝试一下这个领域中的其他技巧,以便将广播操作的成本降至最低吗?

3
如何使用Google App Engine进行客户端/服务器游戏(寻找教程。)
(注意:这是我在SO上提出的一个问题的副本,暂时忘记了GameDev <挂在头上的耻辱>。回答一个后,我会将其链接回另一个。) 我正在尝试使用Google Apps Engine作为我的后端(规范要求)来做我的第一个客户端/服务器游戏。我已经完成了教程(Java),但这一切似乎都以浏览器为中心。 基本上,我希望我的(移动设备,无关紧要)应用程序能够: 允许用户创建游戏帐户(不是他们的Google帐户!) 使用该帐户登录。 按下“ MARCO”按钮将帐户识别的请求发送到服务器。 从服务器获取“ POLO”响应。 作为数据(例如JSON对象,XML-DOM或类似数据),而不是网页。 谁能给我指出一个好的教程/示例项目/详细阅读以帮助我实现这一目标?我很确定,一旦我能够正常工作,我就可以完成所有其他工作-但我遇到了“卡在起始门”的问题,无法进行基本的帐户登录,并且非HTML数据交换。 谢谢!

2
如何通过客户端预测处理实时随机运动
我正在构建一个实时多人游戏,该游戏在客户端和服务器上运行相同的“物理”循环。我使用的转向行为“徘徊”是必不可少的随机运动。运行漫游算法时,客户端和服务器生成不同的随机数。 我想知道如何保持自然随机的运动,但使用一些常数来确保客户端和服务器得出相同的结论。

1
发送播放器速度更改时如何同步客户端和服务器?
我正在执行客户端预测。大多数说明都假定客户端发送诸如“ 将我的播放器上移1个位置 ”之类的消息。如果我发送诸如“ 将播放器的速度设置为x ”之类的消息怎么办? 在客户端上,播放器在服务器之前设置自己的速度(通过客户端预测),导致两者不同步。即使考虑平均延迟,此问题仍然存在。 我该如何解决?

2
最终基于网络的游戏引擎应该作为网络服务启动吗?
我最近决定开始为纸牌游戏编写引擎。我不是“纸牌”游戏玩家,但有一位朋友向我介绍了这款游戏(这是丹麦游戏的一个转折),我坠入了爱河。 我想在3个方面开发游戏: 基本引擎,处理卡/牌组/游戏状态等 用户界面(以移动/桌面Web应用程序的形式。) 具有各种策略/困难等的人工智能 在我看来,这些都是截然不同的项目……从长远来看,我很努力地看到它们如何融合在一起。一开始,我什至不希望能够使用引擎“玩”游戏。发动机将主要通过单元测试进行测试。在客户端存在之前,不会开始播放测试。因此,这里存在一种客户-服务器关系。 发动机是很大的难题。我想知道的是:您将如何为该引擎开发“公共API”? 我当时以为引擎可能是一个非常基本的Web服务,可以通过向RESTful API的查询返回其状态,但是我担心将引擎本身开发为Web应用程序可能会导致糟糕的编程决策。(例如,如果我选择了MVC微框架,那么该API并不会真正拥有视图...它只是通过JSON返回序列化的对象,或者类似的东西。将MVC用于类似这样的服务是否不好?这个? ) 我的另一个想法是,该引擎将只是一个控制台应用程序,稍后我将编写某种形式的桥梁,以在其与Web应用程序之间传递数据。(桥接实际上可以是任何东西。我的意思是,Web服务器和游戏引擎都可以在IRC服务器中闲置并在通道中共享其状态。) 您将采用哪种方法(作为Web服务开发,或者作为独立应用程序开发并在以后进行桥接),为什么? 谢谢,罗比。 编辑:所以我想这属于游戏开发。为了澄清,我将编写一个纸牌游戏引擎。我正在尝试找出公开引擎API的最佳方法,以便将来可以与Web客户端和AI客户端集成。 我什至在这里都没有帐号,所以您好:)

2
实时游戏的最佳服务器架构是什么?
我正在开发一款实时游戏,该游戏应能实时容纳数千名玩家(FPS,最大延迟为1秒)。最好的基础架构是什么? 我的想法是使用2个服务器群集-一个用于服务器端(所有计算端),一个用于数据库端,其中负载均衡器对每个群集都是“负责任的”。一台主服务器将接收来自用户的请求,并发回相关服务器的IP地址,以便用户可以使用该服务器。 数据库集群将使用数据库复制来确保数据库之间的一致性。 还应该有一个地理负载均衡器-因此它将为每个用户分配区域负载均衡器以获得最佳响应。 我正在使用.NET + MSSQL进行游戏。 谢谢!

4
有什么方法可以验证从客户端收到的GPS位置数据吗?
这个问题的答案可能是“否”,但这很重要,所以我想我也应该问。 对于所有客户端-服务器位置感知游戏而言,这应该是一个问题,在这些游戏中,世界上的玩家位置对于游戏而言至关重要。有什么方法可以确保来自客户端的位置数据是真实的(即播放器实际上在那儿)? 在开发客户端-服务器游戏时,我们都知道我们永远不应该信任来自客户端的任何信息,因此所有重要的游戏逻辑都应在服务器端完成。但是,对于位置信息,我们必须从客户那里收到。有没有办法再次检查以防止作弊?

3
安卓/ iOS回合制棋盘游戏的游戏服务器
我目前正在编写iPhone游戏,我想创建一个在线多人游戏模式。将来,该应用程序将移植到Android设备,因此我想知道如何创建游戏服务器? 首先,我应该选择哪种语言?如何使服务器能够与用Objective-C和Java编写的程序进行通信? 那么,如何有效地做到这一点呢?如果我通过客户端打开套接字(有2个),那好吗?我应该向服务器发送什么样的信息?给客户?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.