LWJGL3 For MIPS64

为了在龙芯上玩Minecraft劳资拼了!

作为多年的Minecraft玩家,这个垃圾游戏消磨了我大量的时间。于是想着Minecraft Java版要是能在龙芯上跑起来就好了。寒假前稍微研究了下,发现MC的大部分Java组件在龙芯上都没问题,唯独有一个Native库LWJGL只有x86支持。要是给他加上MIPS64支持那大概就可以爽玩咯。到了寒假开干!

LWJGL全名 Lightweight Java Game Library 顾名思义是一套给Java游戏用的库,他其实是很多Native库的Java Binding集合,从Memory Allocator到物理引擎到图形引擎应有尽有。主要是使用JNI和dyncall wrapper在Java中调用这些库为游戏提供服务。感谢龙芯JVM组,OpenJDK下JNI JNA OpenJFX等功能都基本完善,所以只要把Native库都搞好就行了。

LWJGL上游使用Travis CI生成大部分Native库,在3.2.3版本中,上游已经加入了arm32/arm64支持,有了一些交叉编译的基础框架。然而上游使用强行安装Ubuntu MultiArch包的方法来获取编译时依赖的外部库,然而Ubuntu并没有MIPS支持。只好耍小聪明,强行加Debian源从Debian mips64el偷包用。上游使用GCC-4.8/GCC-4.9来跑各种native库(为了照顾各种古董系统的ABI?),然而Ubuntu只提供GCC-5开始的MIPS工具链,好在和上游一番沟通上游觉得对MIPS平台单独Bump到GCC-5问题不大。一顿BuildFix和解决依赖问题,还修了个dyncall里的ABI问题,大部分Native库都跑过了,除了tinycc没有MIPS支持,上游说是打算用tinycc作“Poorman”版JIT,不过目前版本暂时没有使用,个人也认为不是很现实,毕竟tinycc支持的平台太少了,这么一搞FreeBSD OSX用户都要怨声载道,不要说MIPS这种冷门架构了。

编译过之后修改Java部分,其实也没啥要改的,就是加个架构探测,给ant的xml里加上MIPS的编译支持。不得不吐槽一下这些xml的语法真的是奇葩中的战斗机,比Makefile还难写。

做完跑Test还踩了个坑,jemalloc一直闹Unaligned Access和Segament Fault,仔细研究了一下是jemalloc要求编译时定义的页大小大于系统页大小。而编译时默认页是4k页,龙芯上则因为Cache Alias问题是16k页,不满足这个条件,导致jemalloc各种自爆。开始我把jemalloc卡死在64k页,能跑,后来证明16k页也没问题。

于是 MC 跑起来辣!视频

OK,说了那么多有的没的,那么怎么跑龙芯版本MC呢?

首先,让我们从官网下载HMCL起动器的Linux jar版本,使用java -jar命令运行,然后在图形界面下载一个游戏版本,必须是1.15以上,安装完成后,在游戏版本的设置里勾选 “启用游戏特定设置” 和 “不检查游戏完整性”。

然后从我的GitHub Release中下载最新的 lwjgl3-mips64-release.tar.gz,解压。找到HMCL的根目录,进入.minecraft/libraries/org/lwjgl目录。注意.minecraft为隐藏文件夹,建议使用命令行操作。这里面会有lwjgl-×的一堆目录,一个个一层层进入进去,找到 lwjgl-×-3.2.2.jar lwjgl-×-3.2.2-natives-linux.jar 用我提供的tar.gz中的lwjgl-.jar 和 lwjgl--linux-mips64.jar替换对应lwjgl子库的上面的两个文件即可。

最后回到HMCL,开始游戏,如果有奇怪的错误请删除 .minecraft/versions/1.15.1/1.15.1-natives 目录然后重试。

Licensed under CC BY 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy