iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0

Hakoniwa,出自日語「箱庭」的拼音。目的在於開發一個系統用於運行 Minecraft-like (Voxel) 世界。

本次鐵人賽的原型建構 (Prototyping)

預期實現的功能:

  1. 遊戲環境
    1. 應該是一個自動生成 (Procedural) 的 Voxel 環境。
  2. 渲染
    1. 能夠渲染各個遊戲角色的第一人稱視角影像。
    2. 能夠串流渲染結果給其他系統。
    3. 能夠執行於非桌面環境。
    4. 能夠儲存渲染結果供調閱紀錄。
  3. 遊戲規則
    1. 一個簡單的 FPS。
    2. 隨機生成血包與彈藥。

一些關於本專案的歷程

建構一個 Voxel 世界其實是一個浩大的工程,使用現成的 environment 似乎是比較合理的方式,這也確實是在我考量之內的方案,但是基於種種考量目前並未採用,但是也不打算從選項中完全排除,接下來我會解釋為什麼最後沒有選擇使用現成的 Voxel 世界。

Minecraft

畢竟這個專案發想源自 Minecraft ,Minecraft 本身理所當然是作為 environment 的首選,然而它的 MOD 生態是基於 Java :一個我不是這麼熟悉的語言,除了它並不是開源專案造成一些先天上的限制,加上一些需求上的限制,使我不得不放棄這個方案。

它本身是一個封閉的專案,MOD/Plugin 圈是透過逆向工程安插 hook 的方式來建造 API 來給開發者使用。這個前提使得開發體驗極差,因為版本迭代,缺乏一致性的文件,並且部份功能依靠 MOD 提供的界面根本無法實現,必須使用 NMS (net.minecraft.serve),一個通常不會被 MOD 供應方完全解析的部份。

這裡有一個 Commit可以讓人更好的理解社群逆向工程後解析 Minecraft 的過程,也就是在文件不齊全的情況只能仰賴閱讀程式碼來理解 Minecraft 的運作,但是未被解析的部份會充斥著 aa, g, c 等不可讀的變數與方法。

Malmo

Malmo 是由微軟釋出;一個基於 Minecraft 的機器學習框架。其本質上就是 Minecraft 加上 Minecraft Forge 和一個以機器學習為目的的 MOD 打包而成的東西,可以說是以 Minecraft 官方立場唯一正面支持的 MOD。並且只要你去 clone 它的 repo 並且跑一下 gradle,就能合法的免費獲得 1.11.2 版的 Minecraft 喔~

遺憾的是這個專案從 2019 年開始就沒有維護了,關於它的一些細節可以參考我之前寫過得文章

MineRL

也是一個把 Minecraft 拿來跑機器學習的專案,說是 Malmo 的繼任者也不違過。如果你有看過「想用 AI 在《MineCraft》挖礦躺贏?660 支隊伍全部失敗」之類的新聞,它描述的就是使用這個框架在 NeurIPS 2019 舉辦的比賽的事情。

Malmo 在框架的設計上允許它的使用者自訂地圖參數以及獎勵 (Reward) 等參數,MineRL 而則是往外再包一層 API,並且把環境限制成「挖到鑽石」這一目標。

「挖到鑽石」聽起來很簡單對吧?然而事情並沒有你想像的麼簡單。

Baritone 這類 BOT 是直接讀取遊戲參數來獲得環境資訊,因此它可以透視地底下的方塊,甚至能知道自己後面是否有其他玩家、對方裝備著什麼。

然而這個比賽的 AI 使用的資訊源是視覺化資料,而且只有 64x64 pixel,長得像這樣:

https://minerl.io/assets/videos/navigate1.mp4.gif

並且只有一張顯卡和 3 天的訓練資源(程式上傳到主辦方的雲端),加上訓練過程主辦方會使用參賽者沒看過得貼圖,比如長得像這樣:

https://slideslive.at/38922880/the-minerl-competition?ref=search

不要說 AI 了,就算讓人在這樣的條件下玩 Minecraft 應該都會是很痛苦的過程。如果對這個競賽有興趣的夥伴可以參考我翻譯的規則:

忒修斯的 Minecraft

主流架設 Minecraft 伺服器的方式主要有:

  • Vanilla
  • Forge
  • Bukkit/Spigot

還有其他,不過上述這些依然是基於 Java 的環境,然而有些第三方 Minecraft 伺服器卻是完全用其他語言編寫,但是能讓正版的 Minecraft client 連線,Cuberite 就是之一,它是使用 C++ 重新實作 Minecraft 伺服器的開源專案。

另外有一個叫做 Mineflayer 的開源專案,它是使用 Javascript 撰寫的 Minecraft Client 端,目的是為了讓開發者編寫 BOT,它獲取環境資訊的方式與 Baritone 相同是直接使用遊戲封包內的資訊,並且專案中有附一個非常簡陋的 3D 渲染器

現在請你想像將這兩個東西組合起來,Mineflayer 以為自己連到的是 Minecraft 伺服器,但是其實是第三方實作;Cuberite 以為連到自己的是 Minecraft 主程式,但是其實是第三方實作。Mojang 創造的 Minecraft 本體在這個過程中完全被抽離了,只留下了作為抽象概念的 Minecraft 協議。筆者想問你:

這個東西還是 Minecraft?

Minecraft Clones

正宗的 Minecraft 生態系這條路不通,非正統的總該有點希望吧?

Minetest

Minetest 作為最完整且最知名的 Minecraft-like 開源專案自然曾經是我的考量之一,然而因為它過於完整,review code 其實很花時間。另外一個問題是這個專案其實只把自己定位為「voxel game engine」,提供一些界面讓人用 Lua 撰寫插件,自己卻不實作遊戲的細節,要在這個專案內實現「高仿 Minecraft」 必須安裝一個叫做 MineClone 2 的插件,但是因為遊戲邏輯的實作都是依靠直譯語言,本體使用 C++ 撰寫的效能優勢幾乎盡失。

有趣的是,不少 Google 商店上的「低劣版 Minecraft」幾乎都是這個專案的子孫。^minetest-fork

CraftNG

Craft 這並不是一個特別有名的專案,但是它是讓筆者非常佩服的專案,僅有 3k~4k 行的 C 語言實作,卻達到一個頗有品質的水準,少少的程式碼、相對完整的實作,可以說是非常完美的抄襲學習對象,review 它的過程可以說是獲益良多。

因為它是用 C 語言寫的,所以沒辦法直接向讀者展示,不過有人用 Emscripten 把它打包了,可以在這裡一睹這個專案的執行效果。

其他

「Minecraft Clone」可以說是已經成為軟體工程師的經典考古題之一了,網路上也不乏這方面的程式,我不定時都會到這裡翻翻看有沒有什麼值得 Fork 的對象,希望可以讓我在建造 Voxel 世界的路上省一點力氣。


上一篇
Day 04 可能性之海中的燈火 (Typescript 簡介)
下一篇
Day 06 你的 Javascript 不是你的 Javascript(Webpack 與 Vite 簡介)
系列文
關於用 Javascript (Typescript) Stack 打造某種 Backend 3D Rendering 的東東這檔事23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言