/ParallelCraft

[Draft] ParallelCraft 并行化Minecraft服务端

Primary LanguageJava

ParallelCraft [Draft]

前言

  • 我们为何要起草此项目?Minecraft 服务器在并行计算方面一直是空白,也就是说对并行计算几乎不提供支持。而并行化是目前硬件发展的趋势,不支持并行计算就意味着会浪费或不能利用大量的计算资源。所以我们决定起草此项目以尝试改善 Minecraft 服务器对并行计算的支持,由此来允许 Minecraft 服务器提供不同以往的吞吐量。
  • Minecraft 具有较为复杂的游戏逻辑,并且对其的并行 化并不是一件容易的事情。而对于此项目,在一段时间内仅仅会以草案的方式呈现,因为我们尚不能确定我们的方案是否真实可行,是否会带来实质上的性能提升,离形成一个完整的方案还有很长的路要走,并且不能保证此项目不会被中断。
  • 我们有意愿在 FPGA 上开发此项目,但目前仅仅是一个设想。初步阶段我们将在Java虚拟机中验证此项目的可行性。
  • 该项目有可能支持 Java9+
  • 我们正在考虑该项目是否要支持 20tick+ 的游戏逻辑

概述

本节将会对目前草案中的组件与设想进行概括描述。

基于区块的并行化逻辑引擎

  由于Minecraft中存在区块(Chunk)的概念,我们便就从此获取了灵感,并行化工作或许就可以以单个区块或者多个区块为单位,如此设计也会使得游戏资源更加易于管理。
  而并行化必须要面对的问题就是线程间的内存资源共享以及线程安全问题。我们将会设计一种新的资源管理机制,包括对区块数据、玩家数据等的管理,保证线程之间可以可靠的共享数据,并且不会造成太大的性能损失。
  并行化是一个双刃剑。并非在任何情况下进行并行化都能达到提升效率的效果,线程数量也并非越多越好,所以我们要设计一种或多种线程调度策略,使得其能根据实际情况来调整并行化操作,由此来尽可能达到一种平衡。
  并行化同时意味着该系统的模组化存在着一定的要求。我们暂未确定模组的载入、卸载以及与游戏逻辑的互动是否允许异步,以及模组、模组接口的具体设计方案。

  • 基于区域位置的调度策略
      根据区块的位置,将单个或多个区块以簇的形式进行划分,再将这些区块簇分发给不同的线程进行处理。在地图载入量大、玩家数量多时可以一定程度上分散、均衡各个线程的负载。
  • 基于玩家活动的调度策略
      根据玩家的活动路线来将各个区块分配给不同的线程进行处理,在玩家数量较少、服务器规模不太大的情况下可充分发挥单核计算的优势。
  • 基于活动实体数量的调度策略
      待探究

红石逻辑引擎

  我们认为红石逻辑是在 Minecraft 游戏逻辑中极其重要的一部分,也是开销较大的一部分。所以我们打算将红石逻辑与世界逻辑相区分,将红石的计算开销分摊到其它的部分或线程当中去,并用相关算法来优化红石逻辑的计算。这同时意味着我们将对原版的方块更新机制进行修改,当然,此种计算方式可能会导致其红石特性与原版存在出入,所以该系统的设计仍需要斟酌与探究。

物理引擎

  为了利用并行化的优势,抛射物、击中判定、流水等物理效果可能将不在世界逻辑引擎当中计算。

面向切面编程

  本项目的开发将从模块化的角度出发,尽可能保证其灵活性,同时也不能舍弃其健壮性,所以我们将开发一种面向切面编程框架,并且使用特殊的挂载引擎,便于管理模块。