zh_cn:tutorial:side
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:side [2021/07/30 12:06] – [通信] Add English reference nkid00 | zh_cn:tutorial:side [2022/11/06 17:37] (current) – lostpromise | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
- | Minecraft 使用 [[https:// | + | Minecraft 使用 [[https:// |
- | 客户端/ | + | 客户端/ |
- | 这两种不同类型的侧都有一个“客户端”和一个“服务器”。但逻辑客户端并不等于物理客户端,逻辑服务器也并不等于物理服务器。相反的,逻辑客户端是**被托管在(hosted by)**物理客户端上的,逻辑服务器也是被托管在物理服务器或物理客户端上的。 | + | 这两种不同类型的端都有一个“客户端”和一个“服务器”。但逻辑客户端并不等于物理客户端,逻辑服务器也并不等于物理服务器。相反的,逻辑客户端是**被托管在(hosted by)**物理客户端上的,逻辑服务器也是被托管在物理服务器或物理客户端上的。 |
- | 逻辑侧是这两个 Minecraft 发行版的体系架构中的重要核心。因此理解逻辑侧对任何使用 Fabric 的 mod 开发都至关重要。 | + | 逻辑端是这两个 Minecraft 发行版的体系架构中的重要核心。因此理解逻辑端对任何使用 Fabric 的模组开发都至关重要。 |
- | ===== 物理侧(Physical Sides) | + | ===== 物理端 ===== |
- | 物理侧或环境是指 Minecraft 游戏的两个发行版(两个 jar 文件):客户端(使用原版启动器启动的)和服务器(可从 [[https:// | + | 物理端(Physical Sides)或环境(Environment)是指 Minecraft 游戏的两个发行版(两个 jar 文件):客户端(使用原版启动器启动的)和服务器(可从 [[https:// |
客户端和服务器环境是同一程序的精简发行版,仅包含必需的部分代码。 | 客户端和服务器环境是同一程序的精简发行版,仅包含必需的部分代码。 | ||
- | 在 Fabric 中,你经常可以看到诸如 '' | + | 在 Fabric 中,你经常可以看到诸如 '' |
在 Fabric 的 fabric.mod.json 和 mixin 配置中,客户端/ | 在 Fabric 的 fabric.mod.json 和 mixin 配置中,客户端/ | ||
- | 每个物理侧都附带其入口点(entry point) | + | 每个物理端都会提供由入口点和带有 |
- | ===== 逻辑侧(Logical Sides) | + | ===== 逻辑端 ===== |
- | 逻辑侧是负责实际游戏逻辑的。 | + | 逻辑端(Logical Sides)是负责实际游戏逻辑的。逻辑客户端进行渲染、将玩家输入发送到服务器、处理资源包并部分模拟游戏世界。服务器处理核心游戏逻辑、数据包(data packs)并维护游戏世界的真实状态。 |
- | 逻辑客户端进行渲染,将玩家输入发送到服务器,处理资源包并部分模拟游戏世界。服务器处理核心游戏逻辑、数据包(data packs)并维护游戏世界的真实状态。 | + | |
客户端维护服务器世界的部分副本,其中包含例如以下对象的副本:< | 客户端维护服务器世界的部分副本,其中包含例如以下对象的副本:< | ||
Line 31: | Line 30: | ||
net.minecraft.block.entity.BlockEntity | net.minecraft.block.entity.BlockEntity | ||
</ | </ | ||
- | 这些复制的对象使客户端和服务器能执行一些常见的游戏逻辑。客户端能够与这些对象进行交互,而服务器则负责保持它们的同步。通常,可以通过访问对象所在世界的 '' | + | 这些复制的对象使客户端和服务器能执行一些常见的游戏逻辑。客户端能够与这些对象进行交互,而服务器则负责保持它们的同步。通常,可以通过访问对象所在世界的 '' |
- | ===== 深入了解这些侧 ===== | + | ===== 深入了解这些端 ===== |
- | 有了之前对这些侧是什么以及如何区分它们的知识,我们现在可以分别深入了解这些侧的细节。 | + | 有了之前对这些端是什么以及如何区分它们的知识,我们现在可以分别深入了解这些端的细节。 |
- | ==== 物理客户端(Physical Client) | + | ==== 物理客户端 ==== |
- | 物理客户端是指由原版启动器下载的 Minecraft jar 文件。它包含一个逻辑客户端和一个逻辑服务器(内置服务器)。它的入口点(entrypoint)是 '' | + | 物理客户端(Physical Client)是指由原版启动器下载的 Minecraft jar 文件。它包含一个逻辑客户端和一个逻辑服务器(内置服务器)。它的入口点(entrypoint)是 '' |
一个物理客户端能够加载多个不同的世界,分别加载在单独的逻辑服务器内,但一次只能加载一个。 | 一个物理客户端能够加载多个不同的世界,分别加载在单独的逻辑服务器内,但一次只能加载一个。 | ||
Line 47: | Line 46: | ||
所有逻辑客户端相关的内容都是物理客户端独占的,所以你会看到在渲染、声音和其他逻辑客户端代码上有许多环境注解。 | 所有逻辑客户端相关的内容都是物理客户端独占的,所以你会看到在渲染、声音和其他逻辑客户端代码上有许多环境注解。 | ||
- | 一些 | + | 一些模组只针对物理客户端,例如 Liteloader、Optifine 和 Minecraft PvP 客户端(Badlion、Hyperium)。 |
- | ==== 物理服务器(Physical Server) | + | ==== 物理服务器 ==== |
- | 物理服务器是指 java 独立服务器。相比物理客户端,它只有一个逻辑服务器(独立服务器)。它的入口点(entrypoint)是 '' | + | 物理服务器(Physical Server)是指 java 的专用服务器。相比物理客户端,它只有一个逻辑服务器(独立服务器)。它的入口点(entrypoint)是 '' |
物理服务器上的逻辑服务器与物理客户端上的略有不同,因为当物理服务器运行时只存在一个逻辑服务器实例。此外,物理服务器上的逻辑服务器能通过 Rcon 被远程控制,拥有名为 server.properties 的配置文件,也可以发送服务器资源包。 | 物理服务器上的逻辑服务器与物理客户端上的略有不同,因为当物理服务器运行时只存在一个逻辑服务器实例。此外,物理服务器上的逻辑服务器能通过 Rcon 被远程控制,拥有名为 server.properties 的配置文件,也可以发送服务器资源包。 | ||
- | 尽管存在这些差异,大部分 | + | 尽管存在这些差异,大部分模组都同时适用于物理客户端上的和物理服务器上的逻辑服务端,只要它们不使用逻辑客户端的内容。 |
- | 由于它的单一世界和资源包发送特性,原版模组(数据包(data pack)和资源包的组合)的安装在物理服务器上要比在物理客户端上容易得多,因为物理客户端会在连接到服务器时自动进行设置。 | + | 由于它的单一世界和资源包发送特性,原版模组(数据包和资源包的组合)的安装在物理服务器上要比在物理客户端上容易得多,因为物理客户端会在连接到服务器时自动进行设置。 |
- | 一些 | + | 一些模组只针对物理服务器。例如 Bukkit 及其衍生物(Spigot、Paper、Cauldron、某某-Bukkit 混合产物)始终在物理服务器上运行。 |
- | ==== 逻辑客户端(Logical Client) | + | ==== 逻辑客户端 ==== |
- | 逻辑客户端是玩家的接口。渲染(LWJGL),资源包,处理玩家输入和声音都在逻辑客户端上进行。它在物理服务器上不存在。 | + | 逻辑客户端(Logical Client)是玩家的接口。渲染(LWJGL)、资源包、处理玩家输入和声音都在逻辑客户端上进行。它在物理服务器上不存在。 |
- | ==== 逻辑服务器(Logical Server) | + | ==== 逻辑服务器 ==== |
- | 逻辑服务器是执行大多数游戏逻辑的地方。数据包(Data packs),世界更新(world updates),方块实体和实体刻(block entity and entity ticks)的处理,怪物 AI,游戏/ | + | 逻辑服务器(Logical Server)是执行大多数游戏逻辑的地方。数据包、世界更新、方块实体和实体刻的处理、怪物 AI、游戏/ |
- | 物理客户端上的逻辑服务器称为“内置服务器”,而物理服务器上的逻辑服务器称为“独立服务器”(这也是物理服务器本身的名称)。 | + | 物理客户端上的逻辑服务器称为“内置服务器(Integrated Server)”,而物理服务器上的逻辑服务器称为“专用服务器(Dedicated Server)”(这也是物理服务器本身的名称)。 |
- | 即使在物理服务器上,逻辑服务器也运行在它自己的主线程中并拥有一些工作线程。逻辑服务器的生存周期取决于托管它的物理侧。在物理服务器上,逻辑服务器的生存周期与进程的生存周期一样长。在物理客户端上可以创建多个逻辑服务器,但一次只能存在一个逻辑服务器。当玩家打开本地世界时将创建一个新的逻辑服务器,并在玩家关闭本地世界时将其关闭。 | + | 即使在物理服务器上,逻辑服务器也运行在它自己的主线程中并拥有一些工作线程。逻辑服务器的生存周期取决于托管它的物理端。在物理服务器上,逻辑服务器的生存周期与进程的生存周期一样长。在物理客户端上可以创建多个逻辑服务器,但一次只能存在一个逻辑服务器。当玩家打开本地世界时将创建一个新的逻辑服务器,并在玩家关闭本地世界时将其关闭。 |
- | 大多数通用 | + | 大多数通用模组都针对逻辑服务器,因此在单人和多人游戏中都能运行。 |
===== 通信 ===== | ===== 通信 ===== | ||
- | 在逻辑客户端和逻辑服务器之间唯一正确的数据交换方式是交互数据包(packets)。这些数据包(文档在 [[https:// | + | 在逻辑客户端和逻辑服务器之间唯一正确的数据交换方式是交互数据包(packets)。这些数据包(文档在 [[https:// |
- | 逻辑客户端发送 C2S(客户端到服务器,Client-To-Server)数据包(packets)到逻辑服务器。 | + | 逻辑客户端发送 C2S(客户端到服务器,Client-To-Server)数据包(packets)到逻辑服务器。逻辑服务器发送 S2C(服务器到客户端,Server-To-Client)数据包(packets)到逻辑客户端。数据包(packets)通过网络线程中的 write 方法发送,通过网络线程中的 read 方法调用接收。 |
- | 逻辑服务器发送 S2C(服务器到客户端,Server-To-Client)数据包(packets)到逻辑客户端。 | + | |
- | 数据包(packets)通过网络线程中的 write 方法发送,通过网络线程中的 read 方法调用接收。 | + | |
- | + | ||
- | 关于如何处理网络的更多详细信息,请参见[[tutorial: | + | |
+ | 关于如何处理网络的更多详细信息,请参见[[networking|这篇文章]]。 | ||
===== 关于逻辑服务器的常见误解 ===== | ===== 关于逻辑服务器的常见误解 ===== | ||
- | 大多数情况下,针对物理服务器的 | + | 大多数情况下,针对物理服务器的模组也能在物理客户端上的逻辑服务器上运行。 |
- | 但是,mod 作者时常会抱有一些并不适用于内置服务器的错误假设,包括但不限于: | + | 但是,模组作者时常会抱有一些并不适用于内置服务器的误解,包括但不限于: |
- | * 假设游戏运行时只存在一个逻辑服务器实例 | + | * 误以为游戏运行时只存在一个逻辑服务器实例 |
- | * 假设任何世界和实体都应该计算游戏逻辑(也就是假设世界对象的 '' | + | * 误以为任何世界和实体都应该计算游戏逻辑(也就是假设世界对象的 '' |
- | * 假设远程控制,资源包发送和图标(Favicon)一定是可用的 | + | * 误以为远程控制,资源包发送和图标(Favicon)一定是可用的 |
- | 制作在逻辑服务器上运行的 | + | 制作在逻辑服务器上运行的模组时必须更正这些误解。 |
===== 结论 ===== | ===== 结论 ===== | ||
- | 可能的物理侧和逻辑侧组合: | + | 可能的物理端和逻辑端组合: |
| ^ 逻辑客户端 ^ 逻辑服务器 ^ | | ^ 逻辑客户端 ^ 逻辑服务器 ^ | ||
^ 物理客户端 | 始终存在一个实例 | ^ 物理客户端 | 始终存在一个实例 | ||
^ 物理服务器 | 不存在 | 始终存在一个实例 | | ^ 物理服务器 | 不存在 | 始终存在一个实例 | | ||
- | 最终,主要的困惑来源于物理客户端上存在着逻辑服务器的事实。 | + | 最终,主要的困惑来源于物理客户端上存在着逻辑服务器这一事实。 |
zh_cn/tutorial/side.1627646784.txt.gz · Last modified: 2021/07/30 12:06 by nkid00