注意事項
本篇優化指南僅供參考,實際設定需要依照各伺服器做適當的調整,才能完美達到優化與遊玩體驗最佳化,本人並非專業的伺服器架設者、相關研究人員,指南上可能會有些錯誤,歡迎聯絡我指正問題 >w<
以下的指南適用於插件伺服器,對於原版的官方伺服器(Vanilia)將不適用。
核心的選擇
隨著高版本的 Minecraft 伺服器所使用的資源越來越多,但是官方伺服器的優化並未有效提升,選擇一款優化的核心將會是一項重點,在這裡將會建議使用 Paper 或是其分叉的核心(EX: Purpur)。他們之中的差異又是如何?
Paper 作為目前插件伺服器最多人使用的核心,擁有適當的優化並且改善了眾多原版的漏洞(特性),以及一個大型的社群,他幾乎適用於所有的伺服器當中,衝突性相對也較小。
PufferFish 作為 Paper 的分支,提供了更多的優化設定與調整,如果想選擇更多的優化可以選擇此。
Purpur 作為 Paper 的分支核心,並結合了 Pufferfish,最主要提供了非常多的遊戲設定可做調整,更改許多的遊戲機制。
Paper:https://papermc.io
Pufferfish:https://github.com/pufferfish-gg/Pufferfish
Purpur:https://purpurmc.org
優化前我應該了解什麼
市面上宣稱的優化插件,並沒有太大的實際效用,甚至是反向的讓伺服器變得更卡,因為需要會有更多的事件需要處理,例如說:LaggRemover,所以架設伺服器時應該避免安裝這類型的插件。
優化不是單單的參照指南上的設定進行更改,部分設定可能犧牲到了遊玩的體驗,應該要根據伺服器做一個適當的更改,這也是我一直所強調的,優化是個長遠的路要走,而不是設定完就完美,隨著時間的推移,伺服器的負擔相對會變重,這時又需要對伺服器進行一次的優化作業,優化應要隨著時間的更動而有所改變。
由於許多的優化設定涉及到了許多原版的遊戲玩法,在設定前應該先了解這些機制,避免影響遊戲體驗過大,但也不用過度擔心,在指南中我會粗略的介紹這些機制,但如果想要詳細的了解這些細部的資訊,可以至官方 wiki 查詢相關資料,我會先透過各個相關的類型進行編寫,然後才會將其他無法分類的依照各檔案進行編寫,如此一來應該能更方便的設定。
地圖生成
Minecraft 伺服器地圖生成是個很看重效能處理程序,然而這是生存伺服器會遇到的事情,但是可以利用預先生成地圖來解決這項問題,透過預先跑圖,玩家進入到已經生成的地圖中,所使用的資源將會大幅度的減少,透過 Chunky 這款插件就能來完成預先生成地圖的功能,建議可以先預先生成個1萬格左右的距離,當然也能夠透過邊界的限縮,限制地圖的大小,避免一直不斷地讓玩家去生成新區塊,但也請記得預先生成地圖會占用一定大小的儲存空間,請確認好主機有空間可以存放。
記得生成之後的區塊未來更新伺服器版本,地圖不會跟著更新喔,至於你又想怎讓玩家覺得有新地形,這就交給你去想了喔。
區塊設置
在看下面的設定之前,先讓我們來了解關於區塊的一些小知識 simulation-distance
view-distance
模擬距離與視野距離的差異。
simulation-distance
(模擬距離):這是代表玩家附近應要有多少的區塊處於活躍的狀態。view-distance
(視野距離):這是代表玩家能看到多遠的距離,但是超過模擬區塊的區塊不處於活躍的狀態。
模擬距離是對於伺服器資源有著極大的負擔,因此應該根據伺服器進行減少,降低資源的使用,以原版的 minecraft 而言,預設的距離設定為 10,網路上的眾多紅石設施、農場設施大多是以此基準建設,所以這對於生存伺服器調整並不是一個好選擇,但是如果是對於一些副本RPG或是小遊戲伺服器會是一個好選擇,但是不建議調整得過低,因為可能會讓玩家覺得活動的區塊過少導致一些遊戲上體驗的影響。
視野距離能讓玩家看得更遠的地形,但是該區塊將不會處理大多事件(例如:植物的生長、熔爐運作),而消耗的性能比模擬距離減少需多,但是會消耗較多的記憶體使用量(RAM),提高時應注意記憶體是否充足。
載入區塊的公式:[(距離+2)*2+1]^2
server.properties
simulation-distance
模擬距離,以玩家為中心的區塊將會載入並活躍執行的區塊。
- 預設值:10
- 推薦值:10(保持原版玩法)
view-distance
視野距離,以玩家為中心的區塊將會載入但不活躍的區塊,也就是只會載入地形。
調整時的注意,視野距離應要大於或等於模擬距離,如果不這麼做,如果沒有大於模擬距離,實際的模擬距離將會是視野距離,因此就會受到限制。
儘管視野距離相比模擬距離消耗的資源來的少,但一旦將數值調整過高依舊會造成伺服器的一定資源負擔,在設定時請自行參考自己的伺服器狀況。
- 預設值:10
- 推薦值:10(保持原版玩法)
spigot.yml
view-distance
將此保持預設值,如果變更,它將覆蓋 server.properties
的值,因此為了保持設定方便,無須變更。
生物設置
在生物設置這部分的優化設定前,先讓我們了解Minecraft的生物機制,先了解才不會因為設定過多導致問題,我相信各個伺服器還是希望以盡量跟原版玩法一致。



以玩家為中心
0~24格 生物不會生成,生物會正常移動
24~32格 生物會在此生成,也會在此正常移動
32~128格 生物會在此生成,但不會在此正常移動
128格外 生物會直接消失(當然不包含命名生物)
bukkit.yml
spawn-limits
這個設定是指整個伺服器的生物上限,生物的生成與生物的運算算是伺服器需求較大資源的事件之一。但應該設定的得宜,整個生物上限的算式會是[玩家數量]*[生物上限]
,但由於限制問題會導致分配不均,應在 paper.yml
的 per-player-mob-spawn
設定為 true
屆時生物將會分布較平均。
類型 | 生物種類 |
---|---|
monster | 烈焰使者、洞穴蜘蛛、苦力怕、沉屍、遠古守衛者、終界龍、終界使者、終界蟎、喚魔者、地獄幽靈、巨人、深海守衛、豬布獸、屍殼、幻術師、岩漿史萊姆、夜魅、豬布林、豬布林蠻兵、劫毀獸、掠奪者、界伏蚌、蠹魚、骷髏、史萊姆、蜘蛛、流浪者、惱鬼、衛道士、女巫、凋靈、凋靈骷髏、殭屍殭屍、殭屍、殭屍村民、殭屍化豬布林 |
animals creature | 蜜蜂、貓、雞、牛、驢、狐狸、山羊、馬、駱駝、騾、哞菇、豹貓、熊貓、鸚鵡、豬、北極熊、兔子、羊、骷髏馬、熾足獸、商人駱駝、海龜、流浪商人、狼、殭屍馬 |
ambient | 蝙蝠 |
water-animals water_creature | 魷魚和海豚 |
water-ambient | 鱈魚、河豚、鮭魚、熱帶魚 |
water-underground-creature underground_water_creature | 螢光魷魚 |
axolotl | 六角恐龍(蠑螈、墨西哥蠑螈) |
預設值:
spawn-limits:
monsters: 70
animals: 10
water-animals: 5
water-ambient: 20
water-underground-creature: 5
axolotls: 5
ambient: 15
推薦值:
spawn-limits:
monsters: 30
animals: 10
water-animals: 3
water-ambient: 5
water-underground-creature: 5
axolotls: 5
ambient: 1
ticks-per
此設定將指每次生物嘗試生成時的間隔(以 tick 為單位),可以藉由此來減少生物生成所運算的性能,但不要設置的過高,否則會導致每次生成的時間很長,導致類似沒有生物一樣,但部分生物是可以拉長的,像是水或是環境生物,這些是大多玩家較為不去理會的生物。
預設值:
ticks-per:
animal-spawns: 400
monster-spawns: 1
water-spawns: 1
water-ambient-spawns: 1
water-underground-creature-spawns: 1
axolotl-spawns: 1
ambient-spawns: 1
autosave: 6000
建議值:
ticks-per:
animal-spawns: 200
monster-spawns: 10
water-spawns: 400
water-ambient-spawns: 400
water-underground-creature-spawns: 400
axolotl-spawns: 400
ambient-spawns: 400
autosave: 6000
spigot.yml
max-tick-time
在伺服器到下一個任務之前實體操作可以消耗的計算時間。
- 預設:50
- 建議:1000(禁用)
mob-spawn-range
此設定指的是生物距離玩家的生成範圍(以區塊 chunk 為單位),設定時請將數值小於或等於視野距離,並且不高於生物強制消失範圍(128格)。
- 預設:8
- 建議:6
entity-activation-range
這個設置將會影響到實體與玩家的多遠距離才會動作,也就是距離玩家多近實體才會運動,否則就會是無 AI 的狀態,謹慎設置這將有可能會影響到許多設備的運作,例如:鐵人塔。
預設值:
entity-activation-range:
animals: 32
monsters: 32
raiders: 48
misc: 16
water: 16
villagers: 32
flying-monsters: 32
建議值:
entity-activation-range:
animals: 16
monsters: 24
raiders: 48
misc: 16
water: 16
villagers: 32
flying-monsters: 32
tick-inactive-villagers
此設定將允許控制村民是否在激活範圍之外被激活,關閉與正常村民一樣進行,僅是影響到激活範圍。雖然禁用功能有助於性能,但是可能會導致部分問題,例如說鐵人塔與村民補貨。
- 預設:true
- 建議:true(保持原版)
nerf-spawner-mobs
關閉將讓生怪磚所生成的生物沒有 AI,也就是不會主動的移動與做任何事情,通常生怪磚會被玩家改裝為刷怪塔,沒有必要讓生物有 AI 做攻擊或是主動的移動。
- 預設:false
- 建議:true
paper.yml
despawn-ranges
這將調整實體消失的範圍(以區塊 chunk 為單位),降低數值可以更快地清除遠離玩家的實體。您應該保持軟範圍為30並將硬範圍調整為比您的實際模擬距離大一點,因此當玩家剛剛超過正在加載的塊點時,生物不會立即消失。當一個實體超出硬範圍時,它會立即消失。在軟硬範圍之間時,它會有隨機消失的機會。你的硬範圍應該大於你的軟範圍。應該根據您的視距進行調整(模擬距離*16)+8。這部分解釋了玩家訪問它們後尚未卸載的塊。
預設值:
despawn-ranges:
monster:
soft: 32
hard: 128
creature:
soft: 32
hard: 128
ambient:
soft: 32
hard: 128
axolotls:
soft: 32
hard: 128
underground_water_creature:
soft: 32
hard: 128
water_creature:
soft: 32
hard: 128
water_ambient:
soft: 32
hard: 64
misc:
soft: 32
hard: 128
per-player-mob-spawns
這將可以為生物的生成平均的分散在玩家附近,而不是因為一個設施導致所有生物集中生成在某個區域內,因而達到上限限制其他區域都無法生成生物,這應該與 bukkit.yml
的 spawn-limits
兩者做互相制衡設置。
- 預設:true
- 建議:true
max-entity-collisions
此設定會覆蓋 spigot.ym
l 的同名設置,這會影響到生物每次推擠可以推擠多少生物,設為 0
時,就不會有推擠了,另外要注意的是,如果 gamerule 的 maxEntityCramming
超過此配置的數值,將會讓這個設定沒有任何作用。
- 預設:8
- 建議:4
update-pathfinding-on-block-update
關閉此將減少生物所消耗的尋路資源,這的確會讓生物有些遲鈍他們會每 5 ticks(0.25 秒)被動更新他們的路徑。
- 預設:true
- 建議:true
fix-climbing-bypassing-cramming-rule
將此設定開啟會使攀爬類的生物(蜘蛛)不會受到活塞的推動而影響攀爬,也可以防止大量生物擠在一個小空間內。
- 預設:false
- 建議:true
armor-stands-do-collision-entity-lookups
將此關閉後可以讓盔甲架停止碰撞。
- 預設:true
- 建議:false
tick-rates
這會影響到指定行為和感應在固定 tick 的頻率,就以 acquirepoi
是村民最重要的行為,如果村民無法正常尋路,請嘗試降低。
如果啟用了 pufferfish.yml 的 DAB 建議不要更改數值,保持初始值。
預設值:
tick-rates:
sensor:
villager:
secondarypoisensor: 40
behavior:
villager:
validatenearbypoi: -1
建議值:
tick-rates:
sensor:
villager:
secondarypoisensor: 80
behavior:
villager:
validatenearbypoi: 60
pufferfish.yml
dab
DAB(Dynamic Activation of Brain 大腦動態激活)這會根據實體與玩家的距離來動態激活實體動作,但 DAB 也不是完全利用距離遠處理,而是根據 activation-dist-mod
影響的計算結果,減少實體被激活的數量。我不會很建議啟動它,尤其是你想保持農場機器正常情況下。
- 預設:true
- 建議:false(如果你想盡可能地保留原版玩法)
max-tick-freq
定義距離玩家最遠的實體將被激活的最慢時間。增加此值可能會提高遠離視野的實體的性能,但可能會破壞紅石農場設備或大大削弱掠奪者軍團的行為。如果啟用 DAB 會破壞農場設施,請嘗試減小此值。
- 預設:20
- 建議:20
activation-dist-mod
控制生物被激活的頻率。降低此值將激活更靠近玩家的 DAB,提高 DAB 的性能增益,但會影響實體與周圍環境的交互方式,並可能破壞農場設施。如果啟用 DAB 會破壞農場設施,請嘗試增加此值。
- 預設:8
- 建議:8
purpur.yml
aggressive-towards-villager-when-lagging
啟用後如果 TPS 低於 purpur.yml
的 lagging-threshold
值,那殭屍將不會去瞄準村民攻擊,降低運算量。
- 預設:true
- 建議:false
entities-can-use-portals
此選項可以禁用除玩家之外的所有實體的傳送門使用。這可以防止實體通過更改在主線程上處理的世界來加載塊。但這具有實體無法通過傳送門的缺點。
- 預設:true
- 建議:true(如果你想盡可能地保留原版玩法)
villager.brain-ticks
此選項可以設置村民大腦(工作和 poi)的頻率(以 tick 為單位)。高於3
已確認會使村民不一致/錯誤。
雜項
server.properties
allow-flight
為甚麼該開啟飛行,因為原版的偵測機制很容易誤判飛行,有時候站在船上、騎馬都會被認為飛行,因而將玩家踢出伺服器,然而這個偵測其實沒必要關閉,多少能減輕點負擔。
- 預設:false
- 建議:true
spigot.yml
merge-radius
透過此設定可以決定多少間隔的物品或經驗球會合併在一起,這樣能減少在地面上的實體計算,但也不該設置的過高,可能會破壞一些農場設施的正常運作。他只會在物品或經驗球掉落時計算,不會在間隔一段時間才合併,因此不必擔心合併時的計算影響效能。
預設值:
merge-radius:
item: 2.5
exp: 3.0
建議值:
merge-radius:
item: 3.0
exp: 4.0
paper.yml
alt-item-despawn-rate
透過此設定可以決定部分物品掉落在地面為吸取的消失的時間,部分物品沒有必要可以將它縮短,例如竹子。(以 tick 為單位)
預設值:
alt-item-despawn-rate:
enabled: false
items:
cobblestone: 300
redstone-implementation
利用更快的紅石系統取代原有的紅石系統,透過此減少了區塊更新,也減少了伺服器所需要計算量,但如果引入非原版系統可能會導致高技術性紅石設施會有些問題,但提高的性能遠遠超過那些小問題,除非是生電紅石專門服。這還有可能修復部分由CraftBukkit所造成的紅石問題。
- 預設:vanilla
- 建議:alternate-current
mob-spawner-tick-rate
這可以設定生怪磚生成生物的頻率,設定過高會導致效率過低。
- 預設:1
- 建議:2
optimize-explosions
開啟此選項將能更改演算法來優化 TNT 所造成的爆炸的事件,通常影響不會過大。
- 預設:false
- 建議:true
grass-spread-tick-rate
調整此來設定草地、菌絲土等會傳播的方塊頻率,通常可以提高一些,代價是大片土地需要花更長的時間去生長完全部。
- 預設:1
- 建議:4
non-player-arrow-despawn-rate
設定由非玩家的所投出的實體,例如箭矢、雪球的消失時間,因為玩家是不能撿起這些東西的,所以通常影響不大。
- 預設:-1
- 建議:100
creative-arrow-despawn-rate
同上意思,但是是創造模式的玩家所投出的實體。
- 預設:-1
- 建議:100
JVM Flags
使用優化的 JVM Flags 將有效優化伺服器,在這裡可以參考 Aikar 所製作的指南 (https://aikar.co/mcflags.html)這邊我整理了以下幾點重點出來。
- 如果可以參數最好 Xms=Xmx,這就能讓 JVM 完全的控制所分配之 RAM
- Pterodactyl Panel 使用者不要設置 Xms=Xmx,Xms 應調低點,否則可能會導致 Out Of Memory 進而導致的停機
避免使用的插件
不要使用市面上絕大多數的優化插件,通常這些插件並不是幫助伺服器而是造成更大的負擔,例如說 ClearLagg,這僅僅是在增加伺服器處理更多的事件,使用原版的設定不好嗎?
MobStacker 生物堆疊插件,雖然這塊似乎在台灣伺服器沒什麼出現,大多都是在國外伺服器,這類的插件聽起來是個很好的想法,但實際上他僅是讓伺服器不斷的生成生物,是否都忘了生成生物也會消耗資源,且堆疊後就不會讓生物的數量達到伺服器所設置的上限。
Lagassist 很好,但不要把它當作優化插件,應該只把它的分析功能啟動,而不是使用它的優化功能。
不要使用來路不明的插件,尤其是 BlackSpigot、DirectLeak 等網站所提供的付費洩漏插件,無法保證他是否會在插件內安裝後門的病毒插件,不要因為省了幾百元或幾千元,喪失了整個伺服器的安全,向作者購買也是一種尊重,如果能最好選擇活躍的開發人員所開發的插件。
一些關於伺服器的迷思
分配越多的 RAM 不代表獲得更好的效能
由於 Java 的特性,給越多資源只是讓它堆更多垃圾也會導致部分的卡頓,這不是一個好方法。
不應該只從 TPS 評斷伺服器的順暢度
由於大多數的 TPS 數值都是顯示平均值,會有浮動的現象,當突然的 TPS 急降一秒依舊會讓玩家感受到卡頓,更好的方式應該是看 MSPT 的數值,應要保持在 50 以下才是順暢。
大量的記憶體使用可能是 Memory Leak 但也不一定是
這種時候最好利用 Paper 或 Spark 的 Heap Dump 輸出數據並使用 Eclipse Memory Analyzer 或其他類似工具來分析問題的所在。
CPU 的頻率不直接代表 CPU 的性能
這裡可以參考 兆赫神話,頻率不會是影響 CPU 性能的單一因素,還需要牽扯到 CPU 的其他因素。
伺服器核心越多不代表伺服器可以使用那麼多,適量給予才是王道
由於 Minecraft 伺服器從以前一直以來存在的問題,大多數事件都僅會在單一線程上運行,而其他線程並不太會有很大的運作,但如果有安裝插件或其他額外的東西,我會建議可以提供約4個線程使用,會讓伺服器有更好的效能,但也不需要給到一台伺服器16核心,除非是跑圖否則基本上根本不可能使用那麼多。
當伺服器玩家達到50以上甚至100以上,那就應該考慮如何利用分流來紓解壓力,再好的電腦配備高版本依舊無法撐上那麼多玩家在一台伺服器中,考慮用分流吧。
特別感謝
@ming-yue 介紹了關於伺服器的迷思與部分生成建議
參考資料
- https://github.com/YouHaveTrouble/minecraft-optimization
- https://eternity.community/index.php/paper-optimization/
- https://aikar.co/mcflags.html
- https://en.wikipedia.org/wiki/Megahertz_myth
- https://bukkit.fandom.com/wiki/Bukkit.yml
- https://www.spigotmc.org/wiki/spigot-configuration/
- https://docs.papermc.io/
- https://docs.pufferfish.host/optimization/pufferfish-server-optimization-guide/
- https://purpurmc.org/docs/