本帖最后由 秦无心_Renoi 于 2020-3-16 16:22 编辑
前言
在 2018 年 12 月 10 日,Minecraft mod 界大佬
asiekierka 发表声明,Fabric 隆重登场,并随着 1.14 和 1.15 快照的发展一直走到今天。它的背后究竟有什么故事?为什么它在 1.14 的时候诞生而不是 1.13?
注:有问题需要楼主补充直接留言要求就行。
人物
asiekierka,常称 asie。个人网站是asie.pl。
在 Fabric 的故事中,asie 是当之无愧的主角。他从最早创立 Fabric 到现在 3 年一路走来,虽然他也有隐退,但是他还是坚持了下来。
他是波兰的一位快毕业的大学生。最早在社区中出人头地是在 2014 年左右;当时他从 SpaceToad 手里接坑建筑 mod BuildCraft。在时间积累的过程中,他也因为社区的一些活动吸引了注意力,让他人气暴增。后来他一直在社区各处做贡献,同时维护 FoamFix、Charset 和一些小 mod。
当然,除了 Fabric,他还开过几个坑,以 NovaAPI 尤为有名;但是后来除了 Fabric 都弃坑了。
Vazkii有过一个辛辣的比喻,体现了 asiekieria 的冒险精神。
asie 有个 mcbbs 账号,用 Google 翻译来看 mcbbs。
在 2019 年 9 月 9 日,asie 光荣“退休”,退出 Fabric Discord 群(仍然在 IRC 上),同时在 Fabric 开发中的活动也大幅减少。
|
Fabric 另外一个**物是 modmuss50。他为 Fabric 的内容,比如 maven 和构建系统提供架构,现在也对 Fabric 进行主要的维护。
他是一位英国人。他以前以维护科技重生(TechReborn)mod 出名,后在 1.10.2 左右开始维护 Steves Carts Reborn,接了 Steves Carts 的坑。
他一直以来对类似 Fabric 的轻量级 API 有兴趣,以前也做过其它的 API,是 Fabric 最早的创始人之一。同时还参与过和 Fabric 对立的工程(OpenModLoader)。
因 modmuss50 撤销资金支持,maven.fabricmc.net 域名过期,asie 被迫使用 modmuss50 的域名。
|
这个**家也许不知道,不过他的作品却是如雷贯耳——工业 2 实验版和 FastCraft。对,这就是工业 2 编写组领头人、FastCraft 作者、能让 Java 版比基岩鸡眼版跑得快的神人,所谓的 Player。
Player 是德国人。他除了维护工业和 FastCraft(和 FastCraft 2)以外,还写过 Matcher,一个重要的反混淆工具(它允许 intermediary 中间名称能够跨版本保存)。同时也是 Java 高级专家,精通如何提升程序的运行效率。
他本来维护 Matcher,后来开发了 tiny remapper 和 tiny 这种反混淆数据格式,给 Fabric 提供了不可或缺的技术支持。同时也主导 Fabric API 的设计,避免性能问题。
|
Prospector 是 modmuss50 的 TechReborn 组织的成员。原以开发生态群系 mod Traverse 而闻名。
Prospector 跟同 modmuss50 便进入了 Fabric。他在 Fabric 中进行一般开发。
他最有名的 Fabric mod 是 Mod Menu,是在 Fabric 中唯一在游戏中(不包括日志)查看 mod 列表的方式。
在 OpenModLoader 完蛋,Fabric 咸鱼翻身之际,是他好心伸手把我拉上 Fabric 这艘贼船的
最近和 asiekierka 一样潜水,同时 ModMenu 由 modmuss50 接坑。
|
Runemoro 是 DimensionalDoors 开发组的管理。他最有名的作品是 VanillaFix,同时也是 1.13 有名 mod API Rift 的作者。
然而,后来 Rift 因为分发 MCP 的 searge name 反混淆数据,被迫停止开发。于是他便转战 Fabric,并经常给 Fabric 的反混淆数据 yarn 进行贡献。
同时也是一位技术高超的开发者(能写出 VanillaFix 这种强大的 mod 水平够硬),修复了多种工具中的棘手问题。
现已全心全意投入 Fabric,基本不怎么动 Rift 或者 VanillaFix 了。最近还表示要将 VanillaFix 搬运至 Fabric。
|
Chocohead 和 Player 一样,也是德国人。同时他和 Player 一样,也是工业 2 开发组的成员。
他经常以一些特立独行的作品一鸣惊人,比如他是最早实现 Fabric 和 Optifine 兼容的人。
性格和 asiekierka 类似,都是最早吃螃蟹的人。还教育过群众如何构建可以运行的 Railcraft 包。
曾经在 Runemoro 弃坑 Rift 后在 1.13.2 接盘,但是也弃坑了。改写过 ForgeGradle 2,使其兼容 1.13。
也有一个魔改版的 fabric-loom,添加了许多功能;开发了 Fabric ASM,允许实现一些一般 Mixin 做不到的东西(比如添加枚举)
|
LexManos 是 Minecraft Forge 的作者。他脾气相对暴躁(常常在 Forge 爆粗口骂人),独断专行(大家曾经激烈讨论是否要添加 Forge 官方能源 API,但是 LexManos 没有征求任何意见就添加了 Forge Energy),自己也在 GoFundMe 筹资修卡车的时候承认名声并不大好(“but for a large chunk of you i'm also known as the Evil Guy who is ruining Minecraft Modding”)。一些人讨厌的对象。
同时也是 Mod Coder Pack 维护者。
他经常用开源许可和使用许可维权,创造过一个单身码农(就是 Lex)强迫网易开源魔改版 Forge 的奇迹。也用 Mod Coder Pack 的许可威胁过 Rift 和一些 Forge + Bukkit 合体端。
很反对大家写 coremod,但他写的 Forge 却是最大的 coremod。
允许大家在 Forge 的 Discord 群里面谈 Fabric,但是有人(Valoghese)提议用 yarn 代替 MCP 后被秒 ban。
|
Coded 是 Horizon (Hrzn) 工作室的**。Horizon 工作室以编写 matter overdrive 和 curseforge 更新检测机器人闻名。
工作室里面很多员工是 Fabric modder,还有一个 Fabric 工程(Fabric 星系 mod)。
然而他本人相对讨厌 Fabric,不信任 asiekierka,并多次错误预言 Fabric 的弃坑。他是 OpenModLoader 作者,是 Fabric 有一段时间的直接竞争对手。
Horizon 工作室和 Gilded Games 组织(天域 mod 作者组织)宣布合作后,Aether Legacy 的 Fabric 版本被下架并搁置。让人怀疑有py交易
虽然不喜欢 Fabric,但是喜欢 Fabric 的一些概念(enigma、轻量级加载器、mixin等)。对 Fabric API 模块化的结构并不赞赏,更希望写一个像 Forge 一样的整体化 API。和楼主观念相近
- 说过多少遍了,Fabric 早就有了。之前 asie 觉得无聊了,Fabric 就弃坑了。asie 所有工程都这样弃坑的。
复制代码
|
Thog, ShadowFacts, mezz, Nedelosk, Unascribed, copygirl
这几位都是当时 2016 年左右给 Fabric 贡献的人。其中有些人已经退坑(Una、Thog、shadowfact、Nedelosk),有些保持谨慎观望态度(mezz)。
copygirl 编写 Fabric mod,但不再参与核心开发和贡献了。但是 Thog、shadowfact 在 Fabric 组织中保留名额。
|
其它还有一些人物,比如 InsomniaKitten(Chloe Dawn)、jamierocks、Chocohead、kashike、liach
(不要脸的楼主把自己放进来了)、3TUSK(
u.s.knowledge)、Danielshe等为 Fabric 做过贡献。
术语
Fabric Loader 是 Fabric 最重要的部分。角色相当于 Forge Mod Loader (FML,1.8 以前 Minecraft Forge 的依赖)。Apache 2.0 开源许可。
Fabric Loader 对游戏兼容性优异,任何用 Java 编写的游戏都能安装 Fabric Loader。有愚人节新闻为证!(只能和 1.14 之前版本的 Forge 一起运行,能安在 3D Shareware v1.34 和别的游戏上倒是真实的)
同时因为它的优秀兼容性,一般 Fabric Loader 版本和 Minecraft 版本并没有强制对应关系,不像 Forge。
自带 yarn 反混淆数据、Knot(替代 LaunchWrapper)和 Mixin,便利用户。同时安装器有翻译,不用担心语言问题看不懂。
运行时将游戏变为 intermediary 名称(一种中间名,类似于 searge name),以便跨版本和跨反混淆数据兼容。
除了 Fabric API 以外,现在有些作弊客户端因为 Fabric Loader 带 Mixin、yarn 更新快等原因转战 Fabric 了,例如 aristois 作弊客户端。
|
Fabric API 是 Fabric 给 mod 提供接口的部分。角色相当于 Minecraft Forge 本身。Apache 2.0 开源许可。
在 CurseForge 上看到的 Fabric 下载就是这个 API,而不是 Fabric Loader。
Fabric API 是一个 mod。里面有很多个小模块包,都放在自己的包里面,每个小模块都是一个 mod(术语叫 jar in jar,由 Fabric Loader 实现)。大多数 Fabric mod 一般依赖其中的某一个或者某几个模块,所以一般安装 Fabric Loader 都会安装 Fabric API 包。
Fabric API 在不同 Minecraft 版本中有可能会因 Minecraft 改动而无法跨版本使用,需要看情况而定。
不像 Forge 打死补丁,Fabric API 使用 Mixin 暴露接口和打补丁。
|
yarn 是 Fabric 的反混淆工程(曾用名 pomf,publicly open mapping files)。角色相当于 Mod Coder Pack。CC0(公共领域)许可。
因为 Mod Coder Pack 对搬运其数据的限制和 Lexmanos 对 MCP 的控制,Fabric 开发组被迫维护自己的反混淆工程;但是同时也给了它超越 MCP 的机会。
yarn 本身是 Enigma 反混淆工具的存档。构建后会变成含 tiny 反混淆数据的 GZip 压缩文件,更轻量而且 Fabric Loader 和 mod 开发直接可用。
yarn 比 MCP 更好使用。Enigma 可以随时采用你的反混淆名,你起名时可以看清代码环境,不像 MCP 的机器人脱离源代码。
指令:
可以直接打开 Enigma 修改反混淆数据。完成后保存再用 Git 记录,就可以提交合并请求(Pull Request),为 yarn 做贡献了。
会用现在的反混淆数据反混淆原版包。反混淆的包(名称以 named 结尾)反编译后就得到 Minecraft 反混淆的源代码了,适合研究原版的人使用。
yarn 现在直接把官方混淆名称反混淆,没有使用像 MCP 的 searge name 这类中间名,虽然 Fabric 编写组有一套中间名(intermediary)并有意迁移。
|
loom 是 Fabric 的构建工具。角色相当于 ForgeGradle。MIT 开源许可。
loom 是专门为 Fabric Mod 开发使用的工具。有反编译、反混淆 Minecraft、将使用 yarn 名称的代码转为使用 intermediary 名称的(类似 ForgeGradle 把 MCP 转 Searge 名)、还有自带的 Mixin 编译支持。
楼主个人感觉 loom 总体上比 ForgeGradle 3 稳定,但是 loom 有时候会有下载错误。这时候就要打开用户根目录中 .gradle/caches/fabric-loom 文件夹并将出错的文件和它的 etag 文件(若存在,是记录下载信息的)一起删掉,就会恢复正常了。
使用 loom 编写 Fabric Mod 推荐导入 https://github.com/FabricMC/fabric-example-mod/ 作为模板(可以下载 zip 或者使用 GitHub 的导入模板功能放到你自己的仓库)
不同 IDE 使用方法:
- Intellij Idea:直接导入 Gradle 工程即可
- Eclipse:导入 Gradle 工程,然后运行
- VSCode:导入 Gradle 工程,然后运行
默认不会生成源码。需要执行
才会生成可以检索(找方法、字段用途之类的)的源码。多模块工程上暂时不能使用这个 Gradle 命令(例如 Fabric API 上不能用)
loom 和 yarn、intermediary 等反编译工具无关;它们在 Gradle 中使用外部命令行工具 (Stitch、Weave、Enigma)
|
Mod Coder Pack 是 Minecraft 历史最悠久的反混淆服务,由 Searge 创办。多位**成功登仙,例如 Searge 和 ProfMobius。现在由 bspkrs 和 LexManos 领导。
它的反混淆数据是通过跟一个 IRC 机器人(MCP Bot)交互进行修改和查询的。
最早会给一整套 python 脚本等,允许用户直接修改现场反编译的 Minecraft 源码。1.12 以后不再发行一整套东西,只把几个核心反混淆数据发布。
它的许可臭名昭著。主要限制:
1、未经 MCP 小组许可不许搬运 MCP 数据;
2、它的创意是保留权利的,所以不能被拿到公共领域(比如拿到 yarn 用 MCP 就可以打掉 yarn)
Rift 和某些 Forge+Bukkit 服务端由于第一点限制被迫改动;Rift 因此弃坑。
|
Rift 是 1.13 的一个 Mod API,作者是 Runemoro,后来 Chocohead 接坑至 1.13.2。相对于 Forge 比较轻量。
使用 Mixin。
和 Fabric 相比更加臃肿。
使用 LaunchWrapper 启动游戏。使用 MCP 反混淆。
使用 ForgeGradle 2 的魔改版本作为构建工具。
后来因为 MCP 版权问题逐渐弃坑。作者转战 Fabric。
|
LiteLoader 是 1.5.2 到 1.12.2 的一个 Mod API,作者是 Mumfrey。专用于客户端的轻量级 Mod API。
前身是 Risugami 的 ModLoader,但是 Mumfrey 觉得 ModLoader 太臃肿就开发了 LiteLoader。
从 Minecraft 1.8.9 起使用 Mixin,是最早使用 Mixin 的 Mod API。原因很简单,因为 Mumfrey 就是 Mixin 作者。
(SpongeForge 和 SpongeVanilla 虽然也携带 Mixin,但是 Sponge API 不包含 Mixin)
很轻量,一般升级新 Minecraft 版本比 Forge 快多了。
但是因为启动时有行代码会重新加载所有资源包,会导致有时在大型整合包中运行时增加启动时间。
提供修改客户端和内置服务器(局域网、单人游戏的服务器)的接口。
使用 LaunchWrapper 启动游戏。使用 MCP 反混淆。
使用 ForgeGradle 作为构建工具。(ForgeGradle 自带 LiteLoader 兼容)
后来 Mumfrey 逐渐潜水,LiteLoader 似乎就死在了 1.12.2。一些 LiteMod(比如 VoxelMap)就 1.13 转战 Rift,1.14 转战 Fabric。
|
OpenModLoader 是 1.13 和 1.14 快照版本的一个 Mod API,** Coded。成员有 Modmuss50、Gegy1000、Prospector 等人。
类似 Fabric 的轻量级 Mod API。(实际上直接舔了 Fabric 的包,把 2016 年剩下的基建直接拿过来用了)
前身是 Fabric。但是 Coded 的展望不一样,想做一个像 Forge 一样的大型 API 而不是零散化模块化的结构。(类似楼主的想法)
使用 ModLauncher 启动游戏。使用魔改版 pomf(yarn 前身的魔改版,直接从 MCP 抄了一些名称)反混淆。
使用 OpenGradle(loom 魔改版)作为构建工具。
后来 asiekierka 重新出山,OpenModLoader 大将 Modmuss50 弃暗投明反水回归 Fabric。OpenModLoader 便死在黎明前最后一刻的黑暗中。
|
Mixin 是 SpongePowered 为了更好地实现 Sponge API 而编写的一个可以修改 Java 字节码(Java assembly/ASM)的库。由 Mumfrey 负责维护。
Mixin 的目的是安全和方便地修改 Minecraft 的字节码。它跟 Forge 使用的字节码二进制补丁相比可以在其它 mod 打补丁后正常使用,而且编译时省下很多时间。有一套很优秀的安全系统。
Mixin 能够实现一般字节码修改的大多数目的,但是还是有些限制:
- 遇到包私有类束手无策(无法正确引用,需要 Access Transformer 解决)
- 不能修改某些继承类的东西(比如改一个类的父类)
但是 Mixin 已经涵盖了大多数字节码修改者需要做的事情,而且比纯 ObjectWeb ASM 更好理解,所以在 Sponge 之外用户很多,比如有 ForgeEssentials、Mal**core、Hyperium 等。
虽然介绍上说是基于 LaunchWrapper 的,但是实际上有一个兼容层允许任何人实现兼容(比如 asiekierka 就给 knot 肝了个 Mixin 兼容层,而截止 Forge 1.14 发布 ModLauncher 也没有 Mixin 兼容层都在等 Mumfrey 写)。
|
历史
你以为 Fabric 是 Forge 的分支
不肖子孙吗?
错了。
Fabric 的传承
一般大家概念中,Mod 加载器就是 Forge 一家独大,偶尔 LiteLoader 出来冒个泡。
但是 1.13 时 Forge 大重写给很多新型 Mod 加载器冒泡的机会。尝试过的 Mod 加载器也不止一个(Rift、OpenModLoader、Fabric),为什么 Fabric 在轻量级加载器的战争中获胜?
Minecraft Mod 加载器有很多,但是随时间推移,在 1.6 中 ModLoader 弃坑后,因为维护成本等原因,Forge 一家独大。(Sponge API 规模上也可以算重量级加载器,但是并不提供注册物品等非插件功能)
剩下就是轻量级加载器的战场了。
这中间最有名的是的 LiteLoader 了。
虽然 LiteLoader 主要加载客户端 mod,但是实际上也可以加载添加物品、方块等的大型 mod。有个
BlazeLoader就是基于 LiteLoader 加载器的一个 mod API。
在 Forge 一家独大的时候,风平浪静的表面下却是暗流涌动。
有很多 Mod API 存在过,又烟消云散了。
Paper Mod Loader运气还算好,在 GitHub 上留了个全尸;在现在的 OpenModLoader 之前实际上还有一个老的 OpenModLoader,连骨灰都不剩了(modmuss50 电脑本地有存档)。
说 Fabric 是 Forge 的竞争者,更不如说它是这些夭折工程中的幸运儿。
创作者走向
在 Fabric 的聊天群和 Mod 作者中,大概有这几类:
- 技术类玩家:MinecraftCommands reddit 的 Discord 群就在帮助中放了 Fabric 群的加群链接,Carpet Mod(一个原版技术 debug 类的模组)也搬运到了 Fabric
- 新快照玩家:有些 Minecraft Wiki 编辑员参与 yarn 工程以更好了解新快照的添加内容和变动,再添加至 Wiki 上。
- 想搬运 mod 到新快照的人:可以尝鲜
- 讨厌 Forge 的人:Fabric 气氛相对更自由
- 作弊端作者:Aristois 作弊客户端从独立 mod 变成了 Fabric 模组,可以更快更新,吸引用户
- 前 LiteLoader/Rift 作者:VoxelMap AutoFish 等多个 1.12.2 的 LiteMod 因为 LiteLoader 弃坑,1.13 改用 Rift,而 1.14 改用 Fabric。
为什么 Fabric 一炮成名
asiekierka 总结,Fabric 的成功和在 Feedthebeast reddit 上的帖子息息相关。的确如此;Fabric 群中大多数成员都是在 2018 年 12 月 10 日发帖后才加入的。
然而除此之外,Fabric 为什么能有如此好的基建呢?楼主认为还是 Fabric 作者们肝出来的,比如 Knot 启动器(兼容 Java 8 以上版本)和 Mixin 的 Knot 兼容层都是 asiekierka 自己写的。Forge 虽然有重构,但是本末倒置,基建一团糟就急功近利。ModLauncher 名义上高大上,但是实际使用并不多,连 Optifine 都不用;而 Knot 却成功很多,实现了更安全的字节码修改。ForgeGradle 3 稳定性还没有 ForgeGradle 2 好,所以 Rift 使用了修改版的 ForgeGradle 2。
Forge 的说法
Fabric 如火如荼,当然就有人去问 Forge 对 Fabric 的看法。Forge 开发组在 2019 年 6 月 2 日的 Forge Annual Parley 上也简单回答了几个问题。
某人写的 Forge Annual Parley 总结
Forge 和 Fabric 互动:
- Forge 不会加载 Fabric mod(正常,Forge 也不会加载 LiteMod)
- 共同运行:需要统一名称,Searge name 和 intermediary name 二选一(说实话,Forge + Bukkit 这种操作多的是,不会难的)
开发者合作:
Fabric 更新快的原因:
- Forge 在大动筋骨,Fabric 趁机出头(骗骗无知群众可以,看过 OpenModLoader 嗝屁的就知道没那么简单)
- Fabric 补丁少(如果是纯 Loader 补丁更少)
- Forge 更新快照的话维护成本太高(Forge 对自身的评估还是比较准确的)
- Forge 要维护 Searge name,Fabric 不用(不是也有 intermediary……楼主认为只是 MCP 用的匹配工具没有 sfPlayer1 写的 Matcher 高效而已)
- Fabric 的目标是轻量和模块化(很对)
- Fabric 年轻(也是 2016 年的了,有点年头了)
Fabric 的弱点
Fabric 亮点很多,但是也有弱点。
Fabric 的玩家用户不多。Mod 在 curseforge 上的下载量都偏低。Twitch 启动器也不支持 Fabric。
Fabric 的有些基础设施还需要改进,比如 Enigma 反混淆软件和 procyon 反编译器还有一些 bug。loom 也有些小问题。