雪崩式的災難:嚴重滯後的世界生成

雪崩式的災難:嚴重滯後的世界生成

這篇文章來自於 2017 年 5 月 2 號 mezz 發布在 r/feedthebeast 上面的一篇帖子,很遺憾昨天我才看到它,並了解了新版本 forge 新增加的提示功能的來源故事。我對其進行了翻譯和演繹,讓大家了解到更多有趣的故事。部分內容可能有出入,還請多批評指正。

mezz 是一名具有多年開發經驗模組作者,他製作了赫赫有名的 JEI,參與了林業模組的維護,同時還是 Forge 團隊的一員。

原帖鏈接:

r/feedthebeast - Investigating extreme Worldgen lag?

www.reddit.com

問題

一些具有開拓性思維的整合作者早早地把腳步伸入了 1.11.2 的世界。然而在這裡,他們卻遇到了極為嚴重的伺服器滯後,還有漫長的地圖生成等待。

1.11.2 版本的 All The Mods 2 整合中甚至附帶了這麼一句警告:

新世界的生成可能會等待 5 分鐘左右才能載入好,我們仍然在研究這個問題。

這是下圖的例子,Rorax 擊打了一頭牛,然後就像伺服器時間停滯了一樣,這隻牛居然在空中卡頓住好幾秒鐘。這究竟是發生了什麼?

分析

尋找問題的最好辦法就是使用 Java VisualVM(或者其他類似的 Java 性能分析工具),在遊戲發生嚴重滯後時,對其進行分析。通過性能分析似乎並沒有發現什麼模組異常的佔用了計算,就像是世界生成本來就應該那麼慢。

世界生成先是生成一個基礎的區塊,而後在其上點綴上樹木,礦石之類的東西。這些生成會促使區塊載入。分析器分析進一步發現,許多模組實際上會載入更多的區塊,並持續重複的使這個過程更長。

當一個結構(比如說樹)跨區塊生成時,它會同時載入所跨的幾個區塊。普通情況下,這種事件發送概率很小,隨機生成的樹木只會有很小几率會跨區塊生成。然後如果有足夠多的模組重複這個過程,情況將會變得極為糟糕。

載入一個區塊,也許會連鎖式的載入10個區塊!實際上可能比這個更加糟糕!從而帶來極為嚴重的滯後!

這是一個原版生成,可以看到,只有一小部分區塊是被額外載入了的:

這是使用了未修復版本的 All The Mods 2 整合,並在相同種子情況下生成的結果:

上圖中紅色部分是圖一的區塊載入範圍,對其進行比較,可以看到居然相隔幾百區塊遠的地方也被載入了,這勢必會造成極為嚴重的世界生成滯後!

原因

Minecraft 的世界生成似乎比很多模組作者所期望的還要古怪(我想大多數人應該已經不會為此感到驚訝了)。

模組作者想法很簡單,一個區塊載入了,它們的模組就開始在其上生成點什麼東西,然而這種想法就大錯特錯了。這是一個原版的世界生成,可以看到地圖邊緣並沒有樹木生成,更沒有失控生成的區塊,樹生成的邊緣似乎都有一個框來框住它們。

當一個區塊的 +X,+Z 和 +XZ 方向均載入時,才會進行區塊的進一步裝飾性生成。原版運用這種思維,使得樹木總是在區塊的中間生成,這大大減小了額外區塊的生成。下圖是這種判斷生成的具體圖示:

可是很多模組作者喜歡自己造輪子,而不是使用原版的方法。簡單的在一個 16X16 的範圍內隨機獲取一個坐標進行生成。但是這有幾率溢出到 -X 和 -Z 方向,導致載入更多的區塊(上圖紅色箭頭所指方向)

正確的方法應該嘗試在 (-8, +8) 範圍內生成,這樣生成總是會在最中間,溢出區塊的幾率很小。

解決效果

在過去的幾周,我與幾個模組作者合作解決這個問題,但是有時候很難解釋清楚,這也是我為什麼發表這篇文章的原因。隨著幾個模組相關修復版本的更新,All The Mods 2 整合的生成開始從 5 分鐘下降到了 15 秒。

我可以做些什麼?

如果你是模組作者,請檢查是否是你的模組造成了如此嚴重的滯後,只需要使用原版的 WorldGenMinable 類即可,它內置了偏移相關的計算。如果你自己造了輪子,請注意生成的偏移是否正確。

如果你是玩家,嘗試移除一部分模組,看看生成滯後是否還存在。如果確實是模組問題,請向其作者反饋。

後記(譯者添加)

在新版本的 Forge 中添加了世界邊緣生成判定,如下圖所示,如果你看到了類似的錯誤提示,請向該模組作者反饋。


推薦閱讀:

如何化解八字中的厄運和災難?
看災難相
(128)化解災難從哪裡化起?(凈空老和尚開示)
歐洲難民危機:西式民主輸出的災難性後果
這十種八字,2018年容易有災難降臨

TAG:災難 | 我的世界mod |