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 [2019/12/18 10:51] – [结论] lightcolour | zh_cn:tutorial:side [2022/11/06 17:37] (current) – lostpromise | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
- | Minecraft使用[[https:// | + | |
- | 过去,过去曾经将客户端和服务器简单地划分为一个部分,但是随着单人游戏模式向内部专用服务器的转换,这种简单的模型不再适用。 因此,在Minecraft中区分客户端和服务器时,我们有两个维度。 这些是物理和逻辑方面。 | + | Minecraft 使用 [[https:// |
- | 对于这两种类型的双方,都有一个'' | + | |
- | 逻辑方面在Minecraft的两个发行版的体系结构中都至关重要。 因此,了解逻辑方面对于使用Fabric进行任何mod开发至关重要。 | + | 客户端/ |
- | ===== 物理方面 | + | 这两种不同类型的端都有一个“客户端”和一个“服务器”。但逻辑客户端并不等于物理客户端,逻辑服务器也并不等于物理服务器。相反的,逻辑客户端是**被托管在(hosted by)**物理客户端上的,逻辑服务器也是被托管在物理服务器或物理客户端上的。 |
- | 物理方面或环境是指Minecraft游戏的两个发行版(jars),客户端(Vanilla 启动器启动的版本)和服务器(可从[[https:// | + | |
- | 客户端和服务器环境是同一程序的精简发行版,仅包含代码的必需部分。 | + | 逻辑端是这两个 Minecraft |
- | 在Fabric中,您经常可以看到诸如'' | + | ===== 物理端 ===== |
- | 在Fabric fabric.mod.json和mixin配置中,客户端/服务器引用环境。 | + | 物理端(Physical Sides)或环境(Environment)是指 Minecraft 游戏的两个发行版(两个 jar 文件):客户端(使用原版启动器启动的)和服务器(可从 [[https:// |
- | 每个物理端都附带其入口点使用的类以及入口点为'' | + | 客户端和服务器环境是同一程序的精简发行版,仅包含必需的部分代码。 |
- | ===== 逻辑方面 ===== | + | |
- | 逻辑方面是关于实际游戏逻辑的。 | + | 在 Fabric 中,你经常可以看到诸如 '' |
- | 逻辑客户端进行渲染,将玩家输入发送到服务器,处理资源包并部分模拟游戏世界。 服务器处理核心游戏逻辑,数据包并维护游戏世界的真实状态。 | + | |
- | 客户端维护服务器环境的部分副本,其中包含对象的副本,例如:< | + | 在 Fabric 的 fabric.mod.json 和 mixin 配置中,客户端/ |
+ | |||
+ | 每个物理端都会提供由入口点和带有 '' | ||
+ | |||
+ | ===== 逻辑端 ===== | ||
+ | |||
+ | 逻辑端(Logical Sides)是负责实际游戏逻辑的。逻辑客户端进行渲染、将玩家输入发送到服务器、处理资源包并部分模拟游戏世界。服务器处理核心游戏逻辑、数据包(data packs)并维护游戏世界的真实状态。 | ||
+ | |||
+ | 客户端维护服务器世界的部分副本,其中包含例如以下对象的副本:< | ||
net.minecraft.world.World | net.minecraft.world.World | ||
net.minecraft.entity.Entity | net.minecraft.entity.Entity | ||
net.minecraft.block.entity.BlockEntity | net.minecraft.block.entity.BlockEntity | ||
</ | </ | ||
- | 这些复制的对象允许客户端和服务器执行一些常见的游戏逻辑。 客户端可以与这些对象进行交互,而服务器负责使它们保持同步。 通常,要将逻辑客户端上的对象与逻辑服务器上的对象区分开,请访问对象的环境并检查其'' | + | 这些复制的对象使客户端和服务器能执行一些常见的游戏逻辑。客户端能够与这些对象进行交互,而服务器则负责保持它们的同步。通常,可以通过访问对象所在世界的 '' |
- | ===== 深入了解所有方面 ===== | + | |
- | With an understanding of which sides there are and how to distingish between them, we can now look into every single side with a detailed look. | + | ===== 深入了解这些端 ===== |
+ | |||
+ | 有了之前对这些端是什么以及如何区分它们的知识,我们现在可以分别深入了解这些端的细节。 | ||
==== 物理客户端 ==== | ==== 物理客户端 ==== | ||
- | 物理客户端是由原版启动器的minecraft jar。它包含一个逻辑客户端和一个逻辑服务器(集成服务器)。它的入口点是'' | ||
- | 物理客户端可以在单独的逻辑服务器中加载多个不同的环境,但一次只能加载一个。 | + | 物理客户端(Physical Client)是指由原版启动器下载的 Minecraft jar 文件。它包含一个逻辑客户端和一个逻辑服务器(内置服务器)。它的入口点(entrypoint)是 '' |
- | 与物理服务器(专用服务器)的逻辑服务器相比,物理客户端(集成服务器)的逻辑服务器可以由物理客户端上的逻辑客户端控制(例如,F3 + T重新加载数据包并关闭客户端)同时关闭集成服务器)。它还可以将捆绑在一起的资源包加载到物理客户端上的逻辑客户端。 | + | 一个物理客户端能够加载多个不同的世界,分别加载在单独的逻辑服务器内,但一次只能加载一个。 |
- | 所有逻辑客户端内容都是物理客户端专有的。因此,您会在渲染,声音和其他逻辑客户端代码上看到许多环境注释。 | + | 相比物理服务器(独立服务器)上的逻辑服务器,物理客户端上的逻辑服务器(内置服务器)能被物理客户端上的逻辑客户端控制(例如 F3 + T 会重新加载数据包(data packs),关闭客户端并同时关闭内置服务器)。它还可以将世界里捆绑的资源包加载到物理客户端上的逻辑客户端。 |
- | 一些模组专门针对物理客户端,例如Liteloader,Optifine和Minecraft PvP客户端(Badlion,Hyperium)。 | + | 所有逻辑客户端相关的内容都是物理客户端独占的,所以你会看到在渲染、声音和其他逻辑客户端代码上有许多环境注解。 |
+ | |||
+ | 一些模组只针对物理客户端,例如 Liteloader、Optifine 和 Minecraft PvP 客户端(Badlion、Hyperium)。 | ||
==== 物理服务器 ==== | ==== 物理服务器 ==== | ||
- | 物理服务器是java专用服务器。与物理客户端相比,它仅具有逻辑服务器(专用服务器)。它的入口点是“ net.minecraft.server.MinecraftServer”,物理服务器在运行时只能有一个世界。如果服务器应切换到另一个世界,则需要重新启动服务器。 | + | 物理服务器(Physical Server)是指 java 的专用服务器。相比物理客户端,它只有一个逻辑服务器(独立服务器)。它的入口点(entrypoint)是 '' |
- | 它的逻辑服务器与物理客户端的逻辑服务器略有不同,因为当物理服务器运行时,仅存在一个逻辑服务器实例。此外,物理服务器的逻辑服务器可以通过Rcon进行远程控制,具有名为server.properties的配置文件,并且可以发送服务器资源包。 | + | 物理服务器上的逻辑服务器与物理客户端上的略有不同,因为当物理服务器运行时只存在一个逻辑服务器实例。此外,物理服务器上的逻辑服务器能通过 Rcon 被远程控制,拥有名为 server.properties 的配置文件,也可以发送服务器资源包。 |
- | 尽管存在这些差异,但是大多数mod都适用于存在问题的物理客户端和物理服务器的逻辑服务器,只要它们不引用逻辑客户端内容即可。 | + | 尽管存在这些差异,大部分模组都同时适用于物理客户端上的和物理服务器上的逻辑服务端,只要它们不使用逻辑客户端的内容。 |
- | 但是,其单一世界和资源包发送的功能使得与客户端相比,香草mod(数据包和资源包组合)的安装要容易得多,因为香草物理客户端会在自动连接到服务器时进行设置。 | + | 由于它的单一世界和资源包发送特性,原版模组(数据包和资源包的组合)的安装在物理服务器上要比在物理客户端上容易得多,因为物理客户端会在连接到服务器时自动进行设置。 |
- | 一些MOD专门针对物理服务器。例如,Bukkit及其衍生产品(Spigot,Paper,Cauldron,Xxx-Bukkit混合产品)始终在物理服务器上运行。 | + | 一些模组只针对物理服务器。例如 Bukkit 及其衍生物(Spigot、Paper、Cauldron、某某-Bukkit 混合产物)始终在物理服务器上运行。 |
==== 逻辑客户端 ==== | ==== 逻辑客户端 ==== | ||
- | 逻辑客户端是玩家的接口。 渲染(LWJGL),资源包,玩家输入处理和声音在逻辑客户端上发生。 它在物理服务器上不存在。 | + | 逻辑客户端(Logical Client)是玩家的接口。渲染(LWJGL)、资源包、处理玩家输入和声音都在逻辑客户端上进行。它在物理服务器上不存在。 |
==== 逻辑服务器 ==== | ==== 逻辑服务器 ==== | ||
- | 逻辑服务器是执行大多数游戏逻辑的地方。数据包,世界更新,阻止实体和实体滴答,怪物 AI,游戏/ | + | 逻辑服务器(Logical Server)是执行大多数游戏逻辑的地方。数据包、世界更新、方块实体和实体刻的处理、怪物 AI、游戏/ |
- | 物理客户端上的逻辑服务器称为“集成服务器”,而物理服务器上的逻辑服务器称为“专用服务器”(这也是物理服务器本身的名称)。 | + | 物理客户端上的逻辑服务器称为“内置服务器(Integrated Server)”,而物理服务器上的逻辑服务器称为“专用服务器(Dedicated Server)”(这也是物理服务器本身的名称)。 |
- | 逻辑服务器甚至在物理服务器上也运行在其自己的主线程中,并具有一些工作线程。逻辑服务器的生存期取决于托管它的物理端。在物理服务器上,逻辑服务器的存在时间与进程运行的时间一样长。在物理客户端上,可以创建多个逻辑服务器,但一次只能存在一个逻辑服务器。当播放器加载本地保存时将创建一个新的逻辑服务器,并在播放器关闭本地保存时将其关闭。 | + | 即使在物理服务器上,逻辑服务器也运行在它自己的主线程中并拥有一些工作线程。逻辑服务器的生存周期取决于托管它的物理端。在物理服务器上,逻辑服务器的生存周期与进程的生存周期一样长。在物理客户端上可以创建多个逻辑服务器,但一次只能存在一个逻辑服务器。当玩家打开本地世界时将创建一个新的逻辑服务器,并在玩家关闭本地世界时将其关闭。 |
- | 大多数通用Mod都以逻辑服务器为目标,因此它们可以在单人和多人场景中使用。 | + | 大多数通用模组都针对逻辑服务器,因此在单人和多人游戏中都能运行。 |
- | ===== 通讯 ===== | + | ===== 通信 ===== |
- | 通过交换数据包在逻辑客户端和服务器之间交换数据的唯一正确方法。 数据包(在[[https:// | + | |
- | 逻辑客户端将C2S(客户端到服务器)数据包发送到逻辑服务器。 | + | 在逻辑客户端和逻辑服务器之间唯一正确的数据交换方式是交互数据包(packets)。这些数据包(文档在 [[https:// |
- | 逻辑服务器向逻辑客户端发送S2C(服务器到客户端)数据包。 | + | |
- | 数据包通过网络线程中的写方法发送,并通过网络线程中的读方法的调用接收。 | + | |
- | 有关如何处理网络的更多详细信息,请参见[[tutorial: | + | 逻辑客户端发送 C2S(客户端到服务器,Client-To-Server)数据包(packets)到逻辑服务器。逻辑服务器发送 S2C(服务器到客户端,Server-To-Client)数据包(packets)到逻辑客户端。数据包(packets)通过网络线程中的 write 方法发送,通过网络线程中的 read 方法调用接收。 |
- | 逻辑客户端将C2S(客户端到服务器)数据包发送到逻辑服务器。 | + | 关于如何处理网络的更多详细信息,请参见[[networking|这篇文章]]。 |
- | 逻辑服务器向逻辑客户端发送S2C(服务器到客户端)数据包。 | + | |
- | 数据包通过网络线程中的写方法发送,并通过网络线程中的读方法的调用接收。 | + | |
- | + | ||
- | 有关如何处理网络的更多详细信息,请参见[[tutorial:networking |本文]]。 | + | |
===== 关于逻辑服务器的常见误解 ===== | ===== 关于逻辑服务器的常见误解 ===== | ||
- | 大多数情况下,专门针对物理服务器的mod还可在物理客户端内部的逻辑服务器上运行。 | ||
- | |||
- | 但是,物理服务器的修改器通常具有不适用于集成服务器的假设,包括但不限于: | ||
- | | ||
- | | ||
- | | ||
- | |||
- | 为了使mods在逻辑服务器上运行,需要更正这些假设。 | ||
- | |||
- | ===== 结论 ===== | ||
- | Possible combinations of physical and logical sides: | ||
- | | ^ 逻辑客户端 ^ 逻辑服务器 ^ | ||
- | ^ 物理客户端 | 单例始终存在 | ||
- | ^ 物理服务器 | 不存在 | 单例始终存在 | | ||
- | |||
- | 最终,主要困惑来自于靠物理客户端存在的逻辑服务器的事实。 | ||
- | |||
+ | 大多数情况下,针对物理服务器的模组也能在物理客户端上的逻辑服务器上运行。 | ||
+ | 但是,模组作者时常会抱有一些并不适用于内置服务器的误解,包括但不限于: | ||
+ | * 误以为游戏运行时只存在一个逻辑服务器实例 | ||
+ | * 误以为任何世界和实体都应该计算游戏逻辑(也就是假设世界对象的 '' | ||
+ | * 误以为远程控制,资源包发送和图标(Favicon)一定是可用的 | ||
+ | 制作在逻辑服务器上运行的模组时必须更正这些误解。 | ||
+ | ===== 结论 ===== | ||
+ | 可能的物理端和逻辑端组合: | ||
+ | | ^ 逻辑客户端 ^ 逻辑服务器 ^ | ||
+ | ^ 物理客户端 | 始终存在一个实例 | ||
+ | ^ 物理服务器 | 不存在 | 始终存在一个实例 | | ||
+ | 最终,主要的困惑来源于物理客户端上存在着逻辑服务器这一事实。 |
zh_cn/tutorial/side.1576666289.txt.gz · Last modified: 2019/12/18 10:51 by lightcolour