GJ的个人博客

分享技术日常

前言

Kilt 是一个让 Forge ModFabric 上加载的 Mod 你为什么要这样做?

Kilt 目前只支持 Fabric 1.20.1 并且需要 Fabric Loader 0.18.0 及以上版本

环境

  • Fabric Loader 0.18.4
  • Minecraft 1.20.1
  • OpenJDK JRE 25 (Client)
  • Azul Zulu JDK 21 (Server)
  • Carpet全家桶 + Create + ProjectE

注意

使用 Kilt 请确保安装的 Forge Mod 没有 Fabric 版本
因为 Kilt 的运行效率堪忧,并且兼容不好,尽量使用Fabric版本

正文

兼容性

Kilt 兼容性并不好,并不如某些人所说的比 信雅互联 还要好
虽然它确实可以运行灾变,但性能和功能的兼容不好

例: 贤者之石 变成了消耗品,合成会直接被用掉

并且 启动速度大幅下降 老设备上更明显

还有一些本来不该有的Bug

性能

只有ProjectE时 就出现了严重的掉帧,在比较老旧的设备上掉帧超过 50% ,把Fabric的性能优势给干没了

Bug

开启 假人驻留 并召唤一个假人在开启时会导致崩溃(服务器,单人存档未测试)

总结

未来可期,暂时观望,必要再用

环境

  • Debian 13
  • Android Studio + Android SDK 24(mim) + Android SDK 36(target) + Android NDK + CMake
  • Rust 1.92.0
  • Nodejs 24 LTS
  • Tauri2 (js, npm, vanilla)

Tauri

缺点

  1. 编译比机械硬盘写入1PB数据还tm慢
  2. Rust太诡异了
  3. 系统的WebView太诡异了
  4. (Rust的缺点) Linux安装太诡异了,命令安装不了,开代理也一样,下载tar.xz归档包安装上结果没rustup,tauri又要rustup添加android架构

优点

  1. 没看出来有啥优点

Cordova

缺点

  1. 配置比较繁琐,还有各种奇葩问题(比如死活访问不了网络)

优点

  1. 手机用Termux也能构建(比Rust快一亿倍,没那么慢)
  2. 老牌稳定
  3. npm包,前端框架兼容好
  4. 开发体验不错

Android 原生WebView

缺点

  1. 新手可能不会写一个WebView的activty
  2. 创建Empty Activty项目强制使用Kotlin(如果不会的话算缺点)
  3. 可能有一些奇怪的问题
  4. Android Studio没中文
  5. 必须挂梯(大概不算缺点)

优点

  1. 原生开发,性能好
  2. 使用Kotlin
  3. Android Studio好操作,基本点点就能配置好环境(如果看得懂English的话)

总结

水太深,新手把握不住

温馨提示

千万不要在没有卸载之前的一个版本前就安装相同包名相同名称相同版本的不同功能的APK!!!
千万不要在没有卸载之前的一个版本前就安装相同包名相同名称相同版本的不同功能的APK!!!
千万不要在没有卸载之前的一个版本前就安装相同包名相同名称相同版本的不同功能的APK!!!

在之前一次关服,服务器又卡在了Stopped IO Workder!
气死我了,直接看看是什么在搞鬼

环境

fabric 1.20.1 - fabric loader 0.18.4
Zulu JDK 25

Mods

有Create 0.5.1-j-build.1631
有各种辅助mod
有Xaero小地图和世界地图
有Carpet和各种拓展

分析

获取PID

  • 首先服务器带着MCDR运行,首先 !!MCDR status 看看服务端的PID

PID 197

如果没有MCDR,可以lsof server.jar 换成实际JAR文件 Windows可以去死了(bushi)
Windows可以用任务管理器看

1
lsof fabric-server-mc.1.20.1-loader.0.18.4-launcher.1.1.1.jar

查看非daemon线程

拿到PID之后,掏出 jstack 来看一下是不是非daemon线程导致的

1
2
jstack 197 > jstack.out
cat jstack.out | grep ' #' | grep -v daemon

看到了2个线程,一个 DestroyJavaVM ,这是Java自带的,只能是另一个 Auto-Sync 线程有问题了

转储

  • 推测是有一个byd创建了一个非daemon线程没有关

存一份heap dump再说

1
jmap -dump:format=b,file=heapdump.hprof 197

分析转储

  • 用jprofiler打开转储

去线程转储过滤 Auto-Sync 看看是哪个byd搞鬼

看到了关键的类: dev.toma.configuration.config.io.FileWatchManager

Bing 搜索一下,找到了这个byd的文件

可以看到第 37 行创建了这个byd线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public FileWatchManager() {
WatchService watchService = null;
try {
watchService = FileSystems.getDefault().newWatchService();
} catch (IOException e) {
Configuration.LOGGER.error(MARKER, "Failed to initialize file watch service due to error, configs won't be automatically refreshed", e);
} finally {
this.service = watchService;
this.executorService = Executors.newSingleThreadScheduledExecutor(r -> {
Thread t = new Thread(r);
t.setName("Auto-Sync thread");
return t; // 非daemon线程
});
}
}

而它确实有关闭的逻辑,但 stop 方法是:

1
2
3
4
5
6
7
8
public void stop() {
try {
executorService.shutdown();
service.close();
} catch (IOException e) {
throw new IllegalStateException("Error while stopping FileWatch service", e);
}
}

可能有任务一直在运行导致它不会关闭

所以我做了一个mod,通过mixin把这个线程设置为daemon线程,完美解决,至于其它问题有了再说

我看到Fallen_Breath的博客受到了启发,也搞了一个
就这样
我会分享我的开发经验开服经验
可能也有一些奇妙的东西

部署

由Hexo和NexT.Gemini强力驱动

Hexo是一个博客框架,而NexT.Gemini则是NexT风格的一种,比较好看 Fallen_Breath同款

我把它部署在了Vercel上
就这样

0%