经验分享
1.20.1 Forge模组开发教程(0) ——端(Side)的理解
在进行 Minecraft 模组制作时,理解客户端和服务端这两个概念至关重要。关于客户端和服务端的划分,存在许多常见的误解和错误,这些误解和错误可能会导致一些不会导致游戏崩溃的 bug,但会产生一些意想不到且难以预料的后果。
代码路径,对应三类运行逻辑:
专用服务端逻辑即独立的 minecraft_server.jar,拥有完整的权威游戏规则计算能力,负责多人联机下的世界状态判定、实体 AI、方块更新等所有核心玩法,是唯一的权威来源。
单人游戏客户端逻辑单人模式下,游戏逻辑和渲染渲染完全耦合在客户端进程内,没有独立的服务端线程。客户端自己直接运行全部世界计算、生物 AI、红石逻辑,同时负责画面渲染和玩家输入,相当于 “自己算、自己显示”。这套逻辑和专用服务端的逻辑是分开维护的两套代码。
多人游戏客户端逻辑当客户端连接外部服务器时,自身不运行完整游戏规则,只负责采集玩家输入、发送给服务端、接收服务端同步的世界状态、渲染画面。它有独立的网络同步、状态插值、输入处理代码,和单人模式的本地逻辑并不通用。
从开发维护的角度看,新增一个核心玩法特性,需要分别适配:服务端写一遍权威逻辑、单人客户端写一遍本地逻辑、多人客户端写一遍同步与表现逻辑,维护三套代码分支。
12w18a是Java版1.3.1的第4个快照,Mojang 把单人模式彻底重构为「后台启动集成服务端 + 客户端本地连接」的模式,同时加入了 “对局域网开放” 功能。至此,单人、局域网、专用服务器三者运行的是完全同一套游戏逻辑,架构彻底统一,从根源上消除了 “单人与多人行为不一致” 的问题,同时实现多人存档和单人存档可相互迁移。
为什么这么说呢,也就是从这个版本开始,单人游戏相当于你在玩只有你一个玩家的服务器,局域网联机相当于“房主”担当了服务器的角色,这样与专用服务器联机就一样了。
当然客户端内置服务器的游戏不仅仅有我的世界,如泰拉瑞亚、饥荒、星露谷都采用了相同的架构,这也是为什么这些游戏可以进行局域网联机。
此外并非所有可局域网联机的游戏都采用这种架构,一些老游戏如红色警戒采用帧同步 P2P 架构,这种架构没有中心服务端的概念。每个玩家的客户端都运行完整的游戏逻辑,地位完全平等,不存在 “谁是服务端、谁是客户端” 的固定职能划分。网络上只传输玩家的操作指令(比如 “选中单位 A 攻击单位 B”),不会同步整个世界的状态。因为所有客户端的逻辑代码完全一致,相同输入 + 相同初始状态就会得到完全相同的结果,从而保持全局同步,这种机制也叫 Lockstep(锁步)。单人模式只是少了网络输入同步的步骤,不需要额外 “内嵌一个服务端”—— 因为客户端本身就拥有全部逻辑。
代码路径,对应三类运行逻辑:
专用服务端逻辑即独立的 minecraft_server.jar,拥有完整的权威游戏规则计算能力,负责多人联机下的世界状态判定、实体 AI、方块更新等所有核心玩法,是唯一的权威来源。
单人游戏客户端逻辑单人模式下,游戏逻辑和渲染渲染完全耦合在客户端进程内,没有独立的服务端线程。客户端自己直接运行全部世界计算、生物 AI、红石逻辑,同时负责画面渲染和玩家输入,相当于 “自己算、自己显示”。这套逻辑和专用服务端的逻辑是分开维护的两套代码。
多人游戏客户端逻辑当客户端连接外部服务器时,自身不运行完整游戏规则,只负责采集玩家输入、发送给服务端、接收服务端同步的世界状态、渲染画面。它有独立的网络同步、状态插值、输入处理代码,和单人模式的本地逻辑并不通用。
从开发维护的角度看,新增一个核心玩法特性,需要分别适配:服务端写一遍权威逻辑、单人客户端写一遍本地逻辑、多人客户端写一遍同步与表现逻辑,维护三套代码分支。
12w18a是Java版1.3.1的第4个快照,Mojang 把单人模式彻底重构为「后台启动集成服务端 + 客户端本地连接」的模式,同时加入了 “对局域网开放” 功能。至此,单人、局域网、专用服务器三者运行的是完全同一套游戏逻辑,架构彻底统一,从根源上消除了 “单人与多人行为不一致” 的问题,同时实现多人存档和单人存档可相互迁移。
为什么这么说呢,也就是从这个版本开始,单人游戏相当于你在玩只有你一个玩家的服务器,局域网联机相当于“房主”担当了服务器的角色,这样与专用服务器联机就一样了。
当然客户端内置服务器的游戏不仅仅有我的世界,如泰拉瑞亚、饥荒、星露谷都采用了相同的架构,这也是为什么这些游戏可以进行局域网联机。
此外并非所有可局域网联机的游戏都采用这种架构,一些老游戏如红色警戒采用帧同步 P2P 架构,这种架构没有中心服务端的概念。每个玩家的客户端都运行完整的游戏逻辑,地位完全平等,不存在 “谁是服务端、谁是客户端” 的固定职能划分。网络上只传输玩家的操作指令(比如 “选中单位 A 攻击单位 B”),不会同步整个世界的状态。因为所有客户端的逻辑代码完全一致,相同输入 + 相同初始状态就会得到完全相同的结果,从而保持全局同步,这种机制也叫 Lockstep(锁步)。单人模式只是少了网络输入同步的步骤,不需要额外 “内嵌一个服务端”—— 因为客户端本身就拥有全部逻辑。
评论 (0)