在我们的博客上我们已经
在 9 年的历史中(从发布日期算起),《我的世界》在普通玩家和极客中赢得了数量惊人的粉丝和仇恨者。 由块组成的世界的简单概念已经从一种简单的娱乐形式发展成为一种用于交流和创建现实世界中的各种对象的通用媒介。
除了建造之外,游戏还可以创造
但是,我们不要进一步讨论玩家到底创建了什么,而是让我们看看应用程序的服务器部分,并重点介绍在负载下运行期间可能出现的问题(有时非常复杂)。 我们马上预约一下,我们只讨论 Java 版。
服务器类型
最简单的选择是在游戏客户端中内置服务器。 我们创建了一个世界,按下一个按钮,服务器就可以通过本地网络访问。 该选项无法承受任何严重的负载,因此我们甚至不会考虑它。
香草
Mojang Studios 将游戏的服务器部分作为 Java 应用程序免费分发
这种方法有一个严重的缺点,即缺乏连接插件的开箱即用功能,这些插件可以扩展服务器的功能,不仅可以自动化许多流程,还可以优化性能。 此外,官方服务器对每个连接的玩家都有相当大的内存消耗。
布基特
爱好者基于Vanilla版本创建的服务器应用程序
安装 Bukkit 并不困难;相应的说明在资源上
SpigotMC
为了让插件开发人员的生活更轻松,需要一个 API 来与游戏世界进行交互。 这正是创作者要解决的问题。
目前,SpigotMC正在积极开发和使用。 它支持为 Bukkit 创建的所有插件,但不向后兼容。 为了绕过 DMCA Takedown,发明了一种名为 BuildTools 的优雅方法。 该工具无需分发已编译的应用程序,并允许用户从源代码编译 Spigot、CraftBukkit 和 Bukkit。 所有这些都使得 DMCA 禁令毫无用处。
纸MC
一切看起来都很酷,Spigot 成为了一个不错的选择。 但这对于一些爱好者来说还不够,他们“在类固醇上”创建了自己的 Spigot 分支。 在
PaperMC 具有出色的兼容性,因此为 SpigotMC 编写的插件可以轻松地在 PaperMC 上工作,但无需官方支持。 还具有与 SpigotMC 的向后兼容性。 现在我们已经列出了创建服务器的各种选项,让我们继续讨论可能出现的性能问题。
问题和解决方法
您需要了解的主要一点是,与处理游戏世界相关的所有内容都将仅在物理服务器的一个计算核心上处理。 因此,如果你突然拥有一台拥有十几个计算核心的优秀服务器,那么只会加载一个。 所有其他人实际上都将闲置。 这是应用程序的架构,您对此无能为力。 所以在选择服务器的时候,应该关注的不是核心数量,而是时钟频率。 它越高,性能就越好。
关于RAM容量的问题,我们应该从以下几个指标出发:
- 计划的玩家人数;
- 服务器上计划的世界数量;
- 每个世界的大小。
应该记住,Java 应用程序始终需要预留 RAM。 如果您预计内存消耗为 8 GB,那么实际上需要 12 GB。数字是相对的,但本质没有改变。
要启动服务器部分,我们建议使用文章中指定的标志
生成块图
“你真的认为月亮只有在你看到它的时候才存在吗?” (艾尔伯特爱因斯坦)
全新的服务器。 一旦玩家第一次成功连接,游戏角色就会出现在总聚集点(出生点)。 这是服务器预先生成游戏世界的唯一地方。 同时,客户端看设置,关键参数是绘制距离。 它以块为单位(地图区域为 16×16,高 256 个块)。其中指示有多少块,就准确地向服务器请求了多少块。
服务器存储世界的全局地图,如果游戏角色出现时其中还没有生成的块,则服务器动态生成它们并存储它们。 这不仅需要大量的计算资源,而且还不断增加世界地图的尺寸。 在最古老的无政府主义服务器之一上
围绕一名玩家生成一个世界不是问题。 生成一个包含数百名玩家的世界将导致服务器在短时间内出现轻微的速度下降,之后负载将会减少。 在客户端渲染距离生成一个大约有一千个玩家的世界已经能够“丢弃”服务器并由于超时而将所有客户端抛出。
在服务器软件中有一个值,例如 TPS (每个服务器的滴答数 - 每秒滴答数)。 通常,1 个时钟周期等于 50 ms。 (现实世界的 1 秒等于游戏世界的 20 个刻度)。 如果一周期的处理时间增加到 60 秒,服务器应用程序将关闭,并抛出所有玩家。
解决方案是将世界限制在某些坐标并执行初步的块生成。 因此,我们消除了游戏过程中动态生成的需要,服务器只需要读取现有的地图。 这两个问题都可以通过一个插件解决
最简单的方法是使用一个命令以相对于生成点的圆形形式设置世界边界(尽管您可以将其设置为任何形状):
/wb set <радиус в блоках> spawn
如果玩家角色试图越过边界,他将被推回几个街区。 如果在有限的时间内多次这样做,违规者将被强制传送到重生点。 世界的预生成更加简单,使用以下命令:
/wb fill
由于此操作可能会影响服务器上的玩家,因此请务必确认:
/wb confirm
在 Intel® Xeon® Gold 5000 处理器上生成一个半径为 40 个块(约 2 亿块)的世界总共需要大约 6240 个小时。因此,如果您想预先生成更大的地图,请注意:这个过程会花费相当长的时间,并且服务器的TPS会严重降低。 另外,请记住,即使半径为 5000 个块也将需要大约 2 GB 的磁盘空间。
尽管该插件的最新版本是为 Minecraft 1.14 版本开发的,但实验发现它在后续版本中运行良好。 提供了带有解释的完整命令列表
问题块
Minecraft 中有各种各样的方块。 但是,我们想提请读者注意这样的块: TNT。 顾名思义,这个方块是一个爆炸物 (编者注 - 这是虚拟世界的游戏物品,该物品与真实的炸药无关)。 它的特殊之处在于,在激活的那一刻,重力就开始作用在它上面。 如果此时方块开始下落,这将迫使服务器计算所有坐标。
如果有多个 TNT 块,则其中一个块的爆炸会引起相邻块的爆炸并激活重力,将它们分散到各个方向。 服务器端的所有这些美丽的机制看起来都需要进行大量操作来计算每个块的轨迹,以及与相邻块的交互。 该任务非常耗费资源,任何人都可以轻松检查。 用 TNT 块生成并引爆一个尺寸至少为 30x30x30 的立方体。 如果您认为自己拥有一台性能优良、功能强大的游戏电脑,那您就大错特错了 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
在采用 Intel® Xeon® Gold 6240 的服务器上进行的类似“实验”导致 TPS 严重下降,并且在整个块爆炸时间内 CPU 负载达到 80%。 因此,如果任何一个玩家能够做到这一点,那么性能问题就会影响到服务器上的所有玩家。
一个更艰难的选择—— 边缘水晶。 如果 TNT 仍然顺序爆炸,那么 Edge Crystals 会同时引爆,理论上可以完全停止服务器应用程序的运行。
只有完全禁止在游戏世界中使用这些方块才能避免这种情况。 例如,使用插件
结论
正确管理游戏服务器并不是一件容易的事。 困难和性能下降将随时等待着你,特别是如果你不考虑游戏机制本身。 预见一切是不可能的,因为玩家有时会非常有创意地试图迫使服务器做一些原本不该做的事情。 只有在风险和既定限制之间取得合理的平衡,服务器才能持续运行,并且不会将其性能降低到临界值。
在隔离期间,我们的一些员工错过了他们最喜欢的办公室,并决定在 Minecraft 中重新创建它们。 您还有机会来拜访我们,而不会危及您的健康或在路上浪费时间。
为此,我们邀请所有人访问我们的服务器 我的世界.selectel.ru (客户端版本 1.15.2),其中重新创建了数据中心 Tsvetochnaya-1 和 Tsvetochnaya-2。 不要忘记同意下载其他资源,它们对于正确显示某些位置是必要的。
任务、促销代码、复活节彩蛋和愉快的沟通等待着您。
来源: habr.com