Minecraft Chunky 指令與預先生成:多人跑圖時地圖跟得上玩家

摘要

玩家跑到沒去過的地方時,Minecraft 伺服器要當場生成新的地圖,人一多地圖就可能缺一塊。Chunky 能在玩家進入前把指定範圍的地圖生成好,一個人玩時差別不大,多人同時跑圖時才有差。半徑要設多大,可以從世界大小與耗時來判斷。

文章目錄

玩家跑到沒去過的地方時,Minecraft 伺服器要當場生成新的區塊(Chunk,16 × 16 格的地圖單位)。多人同時跑圖時,區塊就可能來不及送達,地圖也跟著缺一塊。Chunky 是預先生成區塊的外掛,只要設定中心與半徑,就能在玩家進入前把這個範圍生成好。

本文的測試環境是 Windows 11、i7-12700、Java 25 與 Paper 26.3,文中的指令都在伺服器視窗輸入。如果伺服器還在用 Spigot,可以先把伺服器轉成 Paper。

預先生成的效果

一個人玩時,有沒有預先生成幾乎沒有差別,因此不用特地處理。四個人同時跑圖時,沒有預先生成的世界會有區塊來不及送達,電腦越弱、跑得越快就越明顯,預先生成後區塊則全部送達。如果伺服器在沒有人跑圖時也卡,延遲就不是區塊生成造成的,這時要用 spark 找出延遲的來源。

安裝 Chunky

Chunky 可以從 Modrinth 或 Hangar 下載,1.5.66 支援 Paper 26.1 到 26.3,檔名是 Chunky-Paper-1.5.66.jar。安裝時世界與 server.properties 都不用動:

  1. 在伺服器視窗輸入 stop,等伺服器停止。
  2. 把下載的 jar 檔放進伺服器資料夾裡的 plugins,放好後的樣子如下圖。
  3. 啟動伺服器,再輸入 plugins,清單裡出現 Chunky 就代表安裝完成。

檔案總管的 plugins 資料夾,裡面有 Chunky-Paper-1.5.66.jar,旁邊是 Chunky、spark 與 bStats 資料夾

半徑的選擇

Chunky 預設生成正方形,半徑是中心到邊的距離,因此半徑 1000 代表 2,000 × 2,000 格。主世界生成後的世界大小與耗時如下:

半徑 涵蓋範圍 世界大小 耗時
500 1,000 × 1,000 格 55 MB 19 秒
1000 2,000 × 2,000 格 173 MB 1 分 5 秒
2000 4,000 × 4,000 格 632 MB 4 分 2 秒

電腦較弱時耗時會變長,把伺服器限制成只能用 4 條 CPU 執行緒時,半徑 2000 花了 16 分 18 秒。Chunky 的官方文件建議先用較小的半徑,之後要加大範圍時,設定新的半徑再生成一次。我實測時已存在的區塊會被跳過,原本的方塊也還在。

主世界的生成

決定半徑後,在伺服器視窗輸入下面三行,Chunky 就會開始生成。中心可以換成我們要的座標,例如 chunky center 100 -50:

1chunky center 0 0
2chunky radius 1000
3chunky start

開始後,主控台每秒會印出一行進度,結束時印出 Task finished 與 100.00% 就代表完成:

伺服器視窗依序輸入 chunky center 0 0、chunky radius 1000 與 chunky start,接著是 Task running 的進度與 ETA,最後一行 Task finished 顯示 16129 個區塊、100.00%,總耗時 1 分 5 秒

ETA 是預估的剩餘時間,剛開始時會偏高,例如上圖一開始顯示 4 分 31 秒,實際只花了 1 分 5 秒。任務進行中可以用下面的指令控制:

指令 用途
chunky progress 印出目前的進度
chunky pause 暫停任務並保留進度
chunky continue 從保留的進度繼續
chunky cancel 取消任務,再輸入 chunky confirm 確認

生成途中可以直接停止伺服器,重新啟動後輸入 chunky continue,任務就會繼續。

地獄與終界

主世界生成完後,用 chunky world 切換維度。中心會沿用,半徑則視維度重新設定。地獄的距離和主世界是 1:8,因此主世界半徑 1000 在地獄對應半徑 125:

1chunky world the_nether
2chunky radius 125
3chunky start

看到 Task finished for minecraft:the_nether 後,再生成終界:

1chunky world the_end
2chunky radius 1000
3chunky start

維度名稱要寫 the_nether 與 the_end。輸入 world_nether 時,Chunky 會印出 World world_nether not found,並列出可用的名稱。

世界邊界的設定

Chunky 只負責生成區塊,不會限制玩家的活動範圍,玩家走出生成範圍時,伺服器仍然要當場生成。如果要把玩家留在範圍內,可以用原版的世界邊界。worldborder set 的數字是邊長,也就是半徑的兩倍。設定好邊界後,chunky worldborder 會直接讀取邊界作為中心與半徑:

1worldborder center 0 0
2worldborder set 2000
3chunky worldborder
4chunky selection
5chunky start

chunky selection 顯示 Radius: 1000 就代表讀取正確。每個維度有各自的邊界,在伺服器視窗輸入 worldborder 只會改變主世界。

實測紀錄

半徑對照都在相同種子的新世界測得,沒有玩家連線,上面的耗時是 i7-12700 的 20 條執行緒。跑圖比較的玩家是我寫的測試程式,它用原版的連線協定登入伺服器並送出移動封包,沒有實際的遊戲畫面。每種組合交替跑 3 次,未生成的世界每次都是新世界。視野內沒有送達的區塊比例如下,已生成的世界在這些組合都是 0%:

玩家與速度 CPU 執行緒 未生成的世界
1 人,每秒 30 格 20 條 0%
4 人,每秒 30 格 20 條 9%
4 人,每秒 10 格 4 條 35%
4 人,每秒 30 格 4 條 97%

測試時同一台電腦也有其他程式在執行,因此結果會有波動,例如 4 人、20 條執行緒,3 次的比例分別是 23%、3% 與 0.3%。

總結

預先生成時要先依硬碟空間與時間決定半徑,再依序處理三個維度。實測一個玩家時,有沒有預先生成幾乎沒有差異,四個玩家時未生成的世界會有區塊來不及送達。

接著可以做什麼

上一篇Minecraft Carpet Mod 假人指令:離線時農場繼續運作,不用回床也能跳過夜晚Games下一篇Minecraft BlueMap 3D 網頁地圖:朋友不用進遊戲也能看世界與玩家位置Games
Ted Liou

Ted Liou

現役軟體工程師,Unity、AI 技術開發經驗分享與諮詢。