我在龍芯上開發遊戲

為了在龍芯上玩Minecraft,拼了!先上跑起來的視頻。


我在龍芯上開發遊戲

作為多年的Minecraft玩家,這個垃圾遊戲消磨了我大量的時間。於是想著Minecraft Java版要是能在龍芯上跑起來就好了。

寒假前稍微研究了下,發現MC的大部分Java組件在龍芯上都沒問題,唯獨有一個Native庫LWJGL只有x86支持。要是給他加上MIPS64支持那大概就可以爽玩咯。到了寒假開幹!

這次使用的是新買的龍芯3A4000開發主機,我之前有介紹過。


我在龍芯上開發遊戲

3A4000主機參數


LWJGL移植

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 跑起來辣!


我在龍芯上開發遊戲

怎麼跑龍芯版本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 目錄然後重試。


分享到:


相關文章: