Geyser 是一个让MC的基岩版客户端能够访问Java版服务器的软件,有人说这个软件的用途是让手机版客户端能访问电脑版服务器,这样说其实是不准确的,因为 PojavLauncher 的存在,手机上也可以有Java版客户端。本文记录了一些在使用 Geyser 时可能会遇上的问题,希望对后来者有帮助。
系统 | Windows 10 企业版 LTSC |
Java | microsoft jdk17 |
服务端 | paper 1.19.3 |
Geyser 版本 | 独立版 |
插件依赖 | ViaVersion、Floodgate |
本文所说的geyser都是独立版的,不知道独立版的Geyser是否比起插件版能利用更多的CPU核心,选择它是因为更灵活。
服务器内存紧张,开启MC服务端以后远程桌面会变卡,浏览器会因为内存不足崩溃,导致下载插件,编辑配置文件都不方便,这时候就可以先把geyser关上,操作完毕再打开,启动只需6秒。因为是独立的进程,所以可以单独限制内存用量,甚至使用不同的jvm。寒暑假人多的时候不用在月租的高配服务器上再次安装geyser,只要修改配置文件里的服务器地址即可完成转发。
插件兼容性
AuthmeReloaded
使用独立版 Geyser 会导致所有基岩版玩家的ip都是127.0.0.1,和ip注册账号数限制有冲突,需要装 Floodgate 插件来解决。
Floodgate 会默认为基岩版玩家添加 .
前缀,这在 authme 默认的用户名限制里是不允许的,需要修改
restrictions:
allowedNicknameCharacters: '[a-zA-Z0-9_\.]*'
LuckPerms
lp 默认也不允许包含字母和数字以外字符的用户名,需要修改
allow-invalid-usernames: true
杂项
防火墙
基岩版的传输层协议是udp,所以需要在防火墙允许udp传输,但是不知道为什么我在实际操作的时候一直连不上,又允许tcp以后才连上了。
cli模式
Geyser 独立版自带一个 gui 页面,但是显示的信息在服务器配置好以后没什么用,从命令行启动,不使用gui应该能省点内存
java -jar Geyser-Standalone.jar
会报错说 WARNING: sun.reflect.Reflection.getCallerClass is not supported.
,这个应该是log4j对java8做的优化,不用在意
自动化
因为MC版本总是在不断更新的,所以 Geyser 也在不断的更新,每次都要打开网页->下载->上传 有点麻烦,我这里提供一个 ps 脚本,如果你的服务器能连外国网站可以省点事
#这是稳定版,如果想要最新版,把src换成
#https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/standalone/build/libs/Geyser-Standalone.jar
$src = 'https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/master/lastStableBuild/artifact/bootstrap/standalone/build/libs/Geyser-Standalone.jar'
$des = "./Geyser-Standalone.jar"
Invoke-WebRequest -Uri $src -OutFile $des
这个脚本也可以用来更新其他插件,不过没有插件会更新的那么快,而 ViaVersion 的链接是 https://ci.viaversion.com/job/ViaVersion/lastSuccessfulBuild/artifact/build/libs/ViaVersion-4.6.2-SNAPSHOT.jar 这种形式的,所以还需要额外做处理先获取当前最新的版本号,有点麻烦,有需要再写。
更换JVM
openj9是一种不同的JVM实现,我对基岩版玩家的定位是能玩就行,少占点java版玩家的服务器资源最好,所以openj9正合适。
graalvm据说也能降低内存占用量,不过这个还是更适合用在服务端本体上吧
GraalVM Native Image
没有银弹,但来都来了
我没用过,不知道效果
Geyser是自由软件,而且不需要加载mod,唯一的问题是更新频繁。如果它做的事真的非常单一,aot的效果肯定会好于jit的效果。但本来也没有几个基岩版玩家,所以省下的内存恐怕是杯水车薪。
Geyser 作为服务
如果 geyser 能做到在建立远程桌面后或者发现mc服务器内存不足时自动关闭,在断开远程桌面或内存足够后自动尝试打开,对于利用系统资源是有帮助的,即便无法做到如此精准,能做到开机启动也很省心。
相比于java服务端,geyser所需的配置文件很少,产生的用户数据也少,因此把geyser配置为服务相对容易一些,这为实现上一段描述的功能提供了理论依据。
Windows
GNU/Linux
参考资料
- https://www.bilibili.com/read/cv8621880
- https://geyser.superiormc.cn
- https://zhuanlan.zhihu.com/p/93808282
- https://www.jenkins.io/doc/book/using/remote-access-api/
话说这个文献来源看起来很不规范,我应该找一个粘贴url就可以自动帮我生成正经的格式的那种插件
