问题标签 [mmo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
133 浏览

unity3d - Unity UNet 查询

我最近开始在 UNet 上工作,基本上是在一个 MMO 游戏上。我的设置是通过构建 linux 无头构建并在服务器上上传和运行它来托管我自己的专用服务器。所有客户端都连接到它,并且该服务器继续 24/7 运行。以下是我的问题:

  1. 据我了解,我不需要向 UNet 支付任何费用,因为我没有使用他们的配对服务,而是托管自己的服务器。这个对吗?

  2. 并发用户数没有限制。限制取决于专用服务器的强大程度。正确的?

  3. 在 NetworkManager 中,在高级配置下,我将最大连接数设置为 1000。这意味着它可以处理 1000 个并发用户?

  4. UNet API 用于客户端/服务器调用,不使用 Unity 服务器。正确的?

谢谢你。

0 投票
2 回答
124 浏览

python - Python - 更新核心数组循环 < 100ms 并保持 tkinter GUI 响应

我是一名机器人开发人员,但我是 Python 新手。我已经阅读了几个小时,计划设计一个新的机器人。

我希望您对运行 GUI 和非常快速的核心循环以保持适度的游戏实体数组更新的性能问题提出意见。

该机器人由一个无限循环中的主数组组成,该数组不断更新并运行计算。我从我过去的机器人中了解到,GUI 存在性能问题,因为它们需要等待检测事件。

我已经研究了第二个线程的可能性,但我读到 tkinter 不喜欢多个线程。

我已经检查了使用 .after 从 tkinter 主循环运行核心数组循环的想法,但我的直觉告诉我这将是不好的做法。

现在我觉得我所能做的就是尝试将 GUI 和核心阵列包含在一个循环中,但这对性能来说从来没有好处。

有没有更好的方法来设计我还没有发现的这个机器人的结构?

编辑

我决定从 tinker 中删除 mainloop,并简单地使用 .update() 来更新我拥有的任何 gui 组件,现在,这仅包含一些覆盖游戏屏幕的标签。

到目前为止,标签和机器人的功能都运行良好。

0 投票
0 回答
456 浏览

c# - Unity:哪种状态同步技术更好?

我正在 Unity 中实现简单的 2D mmo 游戏。

我想实现服务器和客户端之间的用户位置同步。你会建议哪种方法?

我的两个方法想法:

第一:

替代文字

描述:

  • ClientA 生成事件移动。他移动的 Delta 时间为 0,并通过套接字将此事件作为命令发送,并带有开始移动的本地时间戳 (T1)。
  • 服务器将记住并向现场的每个客户广播有关此事件的信息
  • ClientB 将在 (T3) 时间收到 ClientA 的事件,并从 dt (delta time) = T3-T1 开始执行移动动作。

(我们还可以以帧或服务器时间为 T3 和 T1 评分)。

第二个: 在此处输入图像描述

描述:

  • 每次我们都会为客户广播当前的场景状态
  • 场景状态将在服务器或客户端计算(没关系)
  • ClientA 将向服务器发送移动事件,服务器将接收它并记住它并广播给其他客户端。
  • ClientB 将获取 ClientA 对象的同步状态并使用对象的当前移动状态更新它们的位置)并每次插入。

出色地。问题是.... 这两种解决方案的优缺点是什么?也许你有比我想象的更好的解决方案。

解决方案可能在 Unity 引擎上,但应该比我想象的更有效。另外,什么解决方案将 Unity Networking 和 Photon 与 Photon 服务器一起使用?

谢谢!

0 投票
0 回答
70 浏览

performance - 一个分片的、最先进的 MMO 游戏可以同时处理多少个并发玩家?

一个写得很好的MMO能同时处理多少个彼此接近的并发玩家?让我们假设基本操作,例如:

  • 指向和单击移动
  • 只施放可瞄准的法术(地面上没有aoe法术)
  • 任何其他基本的点击交互

它可以轻松地将这种简单的交互传播到 1000 吗?10000?或者更多的并发玩家?

瓶颈在哪里?我曾经在 20xx 年玩过天堂 2 游戏,而且问题通常是使用单个 CPU 的客户端。服务器级别是否存在更重要的问题,或者使用当今的技术,对于简单的交互,是否可以在单台机器上为 10000 名玩家构建单实例游戏?其他可能的瓶颈是什么?

0 投票
2 回答
546 浏览

c# - C# MMO 应用程序中的 SqlCommand 超时

我有一个以异步方式使用 TCP 套接字的 C# 项目。

每个请求都来自客户端并从 SQL Server 存储过程中提出问题,在问题结束后打开和关闭 SQL 连接。

我用过这段代码:

我用过

计算打开和关闭的 SQL 连接。

问题是 SQL 连接数增加,它很少减少和倒计时。

主要问题,当我的程序在大约 30 分钟的大量请求下工作时,我得到

SqlCommand 超时错误(默认 30 秒过去)

重新启动我的 C# 程序后,SqlCommand超时将消失。

这是我的程序或 SQL Server 端的问题吗?

请记住,它总是调用 SQL Server 中的存储过程,而不是直接执行查询。

主要方法:

0 投票
3 回答
261 浏览

java - 处理在线游戏中的玩家速度

所以我写了这个在线游戏,我有点难以处理我应该多久接受一次移动包。问题是,如果不信任客户端一些数据,我就无法让它工作,我就无法让它工作。基本上我的想法是:

客户

服务器:

这个问题是那个服务器player.lastMove由于数据包到达所需的时间,客户端/服务器中的服务器将不一样。

因此,如果客户端发送 2 个移动数据包,第一个移动时间为 0 100ms,第二个移动时间99ms为服务器保存player.lastMove有点晚,在这种情况下,误差幅度听起来也不太好。

在此处输入图像描述

有任何想法吗?

编辑:发送到服务器的唯一数据是为了示例而玩家想要移动的方向,它只是碰巧是相同的变量名。服务器有自己的player.lastMove变量

解决方案 感谢@Lev M。

我还没有实现这个,但是我已经考虑过这个了,我找不到任何弱点,如果你这样做,请随时发表评论!

我认为可以肯定地说,客户端唯一可以做的就是更改时间戳,他也可以更改时钟,但这会产生相同的效果,所以我只考虑这个假设他正在更改数据包时间戳

在此处输入图像描述

添加一个额外的&& packet.timeStamp < server.clock

boolean isTimeStampValid = packet.timeStamp >= player.lastMove + 1000 && packet.timeStamp < server.clock

不会出错,它会将攻击 #1 标记isTimeStampValid为错误

0 投票
0 回答
40 浏览

unity3d - 如何正确设计巨型世界中游戏对象的生成?

我正在设计某种拥有数千名玩家的 MMO 策略游戏。由于游戏不会有频繁的操作,我认为使用 Unity HLAPI 不会有可扩展性问题。使用 HLAPI,每个具有 NetworkIdentity 的 GameObject 都会在每个客户端中生成。由于不同的玩家不需要知道每个游戏对象,我如何控制在每个玩家身上产生哪些游戏对象?

例如,假设有一张巨大的地图,以及一个离散的坐标系。在每一对 (x,y) 上都有一个玩家游戏对象。服务器应该知道他们每个人,但客户端不关心远离他们的玩家。所以我认为如果我在每个客户端上生成每个 GameObject,客户端性能会受到影响。

0 投票
1 回答
39 浏览

php - MMO 货币 - 使 493205 成为 49g 32s 5c

堆栈溢出

这很可能是一个非常非常简单的解决方案,但我疲惫的大脑根本无法想出它。

正如标题所示,我想编写一个能够转换数字的函数,例如:

493205

成一串:

“49g 32s 5c”

这样做最合乎逻辑的方法是什么?

0 投票
2 回答
199 浏览

mysql - 使用 SQL 处理“非常大”库存的最佳方法是什么?

我正在研究开发一款类似《炉石传说》的在线纸牌游戏。玩家将拥有无限的库存来存储他们拥有的所有卡片。

使用这种方法,每个玩家卡组合的 1 行数据量都会非常大,因此呈指数增长。

最初,我想要 3 张桌子:

  • 一个 Player_Table

    | Player_ID | Player_Name | Rank | Icon | ect...

  • A Card_Table

    | Card_ID | Card_Name | Attack | Defence | ect...

  • 然后是他们的 Inventory_Table

    | Player_ID | Card_ID | Quantity |

然后我可以使用 SELECT Card_ID FROM Inventory_Table WHERE Player_ID=YourID 之类的语句

显然,这里有一个缩放问题,我添加的卡越多,加入的玩家越多,获得卡列表所需的时间就越长。

我正在考虑使用 MongoDB 之类的东西作为 NoSQL 的替代品,以帮助解决这可能导致的潜在性能问题,但后来我发现它不像 mySQL 那样免费用于商业用途,所以我放弃了这个计划。

我想出的第三个也是最后一个想法是动态添加表格。当一个玩家被创建(创建一个帐户)时,我可以添加一个名为“Player_Cards_”+ Player_ID(EG Player_Cards_318)的表格,有些东西告诉我这是一个坏主意,但我不确定。

请有人指出我正确的方向。

0 投票
0 回答
56 浏览

multithreading - 哪个是 MMORPG 的最佳网络解决方案?

我们正在与一个小团队开发一个 mmorpg。我们可以在服务器端创建 2 个结构来管理客户端和处理包。我想知道什么结构更好。如果您可以推荐一个好的结构,我将非常高兴。

第一个结构

IdleSessionQueue 和 ActiveSessionMap

任务队列和发送队列

在这种结构中,最初创建空闲会话(IdleSessionQueue),并有一个线程(NetworkListenerThread)监听网络并接受用户。该线程在新用户到达时从空闲会话中获取会话,并使用 SessionId 和 Session 的值将该会话添加到活动会话表(ActiveSessionMap)中。然后创建一个线程(ClientListenerThread)来监听添加到表中的会话。为每个用户发生一个 ClientListenerThread。当客户端断开连接时,它会再次添加回 IdleSessions。

当客户端发送请求(数据包)时,该请求将添加到 TaskQueue。预先创建了一定数量的workerThread。只要TaskQueue中有一个包,WorkerThreads就会接收到这个包并对其进行处理,并将新的包添加到SendQueue中。SenderThreads 接收 SendQueue 中的每个数据包并将其发送给客户端。

第二结构

IdleSessionQueue 和 ActiveSessionMap

在这种结构中,最初创建空闲会话(IdleSessionQueue),并有一个线程(NetworkListenerThread)监听网络并接受用户。当新用户到达时,该线程从空闲会话中获取会话,并使用 SessionId 和 Session 的值将此会话添加到活动会话表 (ActiveSessionMap)。然后创建一个线程(ClientListenerThread)来监听添加到表中的会话。为每个用户发生一个 ClientListenerThread。当客户端断开连接时,它会再次添加到 IdleSessions。当客户端发送请求(数据包)时,该请求由 ClientListenerThread 处理,并将结果发送到一个或多个客户端。

哪个是更好的解决方案,或者这个问题的最佳解决方案是什么?