User Tools

Site Tools


zh_cn:tutorial:side

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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