在我們的部落格上我們已經
在 9 年的歷史中(從發布日期算起),《我的世界》在普通玩家和極客中贏得了驚人的粉絲和仇恨者。 由區塊組成的世界的簡單概念已經從一種簡單的娛樂形式發展成為一種用於交流和創建現實世界中的各種物件的通用媒介。
除了建造之外,遊戲還可以創造
但是,我們不要進一步討論玩家到底創建了什麼,而是讓我們看看應用程式的伺服器部分,並重點介紹在負載下運行期間可能出現的問題(有時非常複雜)。 我們馬上預約一下,我們只討論 Java 版。
伺服器類型
最簡單的選擇是在遊戲客戶端內建伺服器。 我們創建了一個世界,按下一個按鈕,伺服器就可以透過本地網路存取。 該選項無法承受任何嚴重的負載,因此我們甚至不會考慮它。
雲尼拿
Mojang Studios 將遊戲的伺服器部分作為 Java 應用程式免費分發
這種方法有一個嚴重的缺點,就是缺乏連接插件的開箱即用功能,這些插件可以擴展伺服器的功能,不僅可以自動化許多流程,還可以優化效能。 此外,官方伺服器對每個連接的玩家都有相當大的記憶體消耗。
布基特
愛好者基於Vanilla版本創建的伺服器應用程式
安裝 Bukkit 並不困難;相應的說明在資源上
插管MC
為了讓插件開發人員的生活更輕鬆,需要一個 API 來與遊戲世界互動。 這正是創作者要解決的問題。
目前,SpigotMC正在積極開發和使用。 它支援為 Bukkit 創建的所有插件,但不向後相容。 為了繞過 DMCA Takedown,發明了一種名為 BuildTools 的優雅方法。 該工具無需分發已編譯的應用程序,並允許用戶從原始程式碼編譯 Spigot、CraftBukkit 和 Bukkit。 所有這些都使得 DMCA 禁令毫無用處。
紙MC
一切看起來都很酷,Spigot 成為了一個不錯的選擇。 但這對於一些愛好者來說還不夠,他們「在類固醇上」創建了自己的 Spigot 分支。 在
PaperMC 具有出色的兼容性,因此為 SpigotMC 編寫的插件可以輕鬆地在 PaperMC 上工作,但無需官方支援。 還具有與 SpigotMC 的向後相容性。 現在我們已經列出了創建伺服器的各種選項,讓我們繼續討論可能出現的效能問題。
問題與解決方案
您需要了解的主要一點是,與處理遊戲世界相關的所有內容都將僅在實體伺服器的一個運算核心上處理。 因此,如果你突然擁有一台擁有十幾個運算核心的優秀伺服器,那麼只會載入一個。 所有其他人實際上都將閒置。 這是應用程式的架構,您對此無能為力。 所以在選擇伺服器的時候,應該要注意的不是核心數量,而是時脈頻率。 它越高,性能就越好。
關於RAM容量的問題,我們應該從以下幾個指標出發:
- 計劃的玩家人數;
- 伺服器上計劃的世界數量;
- 每個世界的大小。
應該記住,Java 應用程式始終需要預留 RAM。 如果您預期記憶體消耗為 8 GB,那麼實際上需要 12 GB。數字是相對的,但本質沒有改變。
要啟動伺服器部分,我們建議使用文章中指定的標誌
產生區塊圖
“你真的認為月亮只有在你看到它的時候才存在嗎?” (艾爾伯特愛因斯坦)
全新的伺服器。 一旦玩家第一次成功連接,遊戲角色就會出現在總聚集點(出生點)。 這是伺服器預先生成遊戲世界的唯一地方。 同時,客戶端看設置,關鍵參數是繪製距離。 它以區塊為單位(地圖區域為 16×16,高 256 個區塊)。其中指示有多少區塊,就準確地向伺服器請求了多少區塊。
伺服器儲存世界的全域地圖,如果遊戲角色出現時其中還沒有產生的區塊,則伺服器動態生成它們並儲存它們。 這不僅需要大量的運算資源,而且還不斷增加世界地圖的尺寸。 在最古老的無政府主義伺服器之一上
圍繞一名玩家生成一個世界不是問題。 產生一個包含數百名玩家的世界將導致伺服器在短時間內出現輕微的速度下降,之後負載將會減少。 在客戶端渲染距離產生一個大約有一千個玩家的世界已經能夠「丟棄」伺服器並由於超時而將所有客戶端拋出。
在伺服器軟體中有一個值,例如 TPS (每個伺服器的滴答數 - 每秒滴答數)。 通常,1 個時鐘週期等於 50 ms。 (現實世界的 1 秒等於遊戲世界的 20 個刻度)。 如果一周期的處理時間增加到 60 秒,伺服器應用程式將關閉,並拋出所有玩家。
解決方案是將世界限制在某些座標並執行初步的區塊生成。 因此,我們消除了遊戲過程中動態生成的需要,伺服器只需要讀取現有的地圖。 這兩個問題都可以透過一個插件解決
最簡單的方法是使用一個命令將世界邊界設置為相對於生成點的圓形(儘管您可以將其設置為任何形狀):
/wb set <радиус в блоках> spawn
如果玩家角色試圖越過邊界,他將被推回幾個街區。 如果在有限的時間內多次這樣做,違規者將被強制傳送到重生點。 世界的預生成更加簡單,使用以下指令:
/wb fill
由於此操作可能會影響伺服器上的玩家,因此請務必確認:
/wb confirm
在 Intel® Xeon® Gold 5000 處理器上產生半徑為 40 個區塊(約 2 億區塊)的世界總共需要大約 6240 小時。因此,如果您想預先產生更大的地圖,請注意:這個過程會花費相當長的時間,伺服器的TPS會嚴重降低。 另外,請記住,即使半徑為 5000 個區塊也將需要大約 2 GB 的磁碟空間。
儘管該插件的最新版本是為 Minecraft 1.14 版本開發的,但實驗發現它在後續版本中運作良好。 提供了帶有解釋的完整命令列表
問題區塊
Minecraft 中有各種各樣的方塊。 但是,我們想提請讀者註意這樣的塊: TNT。 顧名思義,這個方塊是個爆炸物 (編者註 - 這是虛擬世界的遊戲物品,該物品與真實的炸藥無關)。 它的特殊之處在於,在激活的那一刻,重力就開始作用在它上面。 如果此時方塊開始下落,這將迫使伺服器計算所有座標。
如果有多個 TNT 塊,則其中一個塊的爆炸會引起相鄰塊的爆炸並激活重力,將它們分散到各個方向。 伺服器端的所有這些美麗的機制看起來都需要進行大量操作來計算每個區塊的軌跡,以及與相鄰區塊的互動。 任務非常耗費資源,任何人都可以輕鬆檢查。 用 TNT 塊產生並引爆一個尺寸至少為 30x30x30 的立方體。 如果您認為自己擁有一台性能優良、功能強大的遊戲電腦,那您就大錯特錯了 😉
/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt
在採用 Intel® Xeon® Gold 6240 的伺服器上進行的類似「實驗」導致 TPS 嚴重下降,並且在整個區塊爆炸時間內 CPU 負載達到 80%。 因此,如果任何一個玩家能夠做到這一點,那麼效能問題就會影響到伺服器上的所有玩家。
一個更艱難的選擇— 邊緣水晶。 如果 TNT 仍然順序爆炸,那麼 Edge Crystals 會同時引爆,理論上可以完全停止伺服器應用程式的運作。
只有完全禁止在遊戲世界中使用這些方塊才能避免這種情況。 例如,使用插件
結論
正確管理遊戲伺服器並不是一件容易的事。 困難和效能下降將隨時等著你,特別是如果你不考慮遊戲機製本身。 預見一切是不可能的,因為玩家有時會非常有創意地試圖迫使伺服器做一些原本不該做的事情。 只有在風險和既定限制之間取得合理的平衡,伺服器才能持續運行,並且不會將其效能降低到臨界值。
在隔離期間,我們的一些員工錯過了他們最喜歡的辦公室,並決定在 Minecraft 中重新創建它們。 您還有機會來拜訪我們,而不會危及您的健康或在路上浪費時間。
為此,我們邀請所有人訪問我們的伺服器 我的世界.selectel.ru (客戶端版本 1.15.2),其中重新創建了資料中心 Tsvetochnaya-1 和 Tsvetochnaya-2。 不要忘記同意下載其他資源,它們對於正確顯示某些位置是必要的。
任務、促銷代碼、復活節彩蛋和愉快的溝通等著您。
來源: www.habr.com