此錯誤未必對所有版本有效。該錯誤被修復後,下文所述的資訊將不再適用。
請慎重對待。
更新抑制(Update Suppression)是指在方塊更新傳播過程中,迫使遊戲停止目前方塊更新過程,跳過所有未執行的方塊更新,以及更新後的一系列其他遊戲邏輯。更新抑制器(Update Suppressor)則是用於完成更新抑制的裝置。
更新抑制允許玩家引起部分方塊的方塊更新,而避免其他方塊更新,故可以用於進行切門、將方塊放置在通常不可能存在的位置等;還由於可以取消後續的其他邏輯,可以用來複製方塊、物品分身、方塊實體替換。更新抑制器還可以用於製造可控的伺服器端崩潰。
警告:這些裝置有較大的風險導致遊戲崩潰甚至存檔損壞,建造及使用時請小心。若你僅需要跳過方塊更新但無法承擔此風險,請使用更新跳略。
原理[]
正常情況下,遊戲不會跳過所應該執行的邏輯。因此更新抑制都是透過遊戲錯誤來完成的。更新抑通常制是使用特定方式觸發程式拋出異常或錯誤,且該異常拋出後在特定位置被捕獲,從而跳過本應執行的邏輯。如果觸發了異常但遊戲並未將其捕獲,則會導致遊戲崩潰甚至存檔損壞。
一種常用的方式是由玩家操作來引發遊戲拋出異常。遊戲伺服器端在處理來自用戶端的資料包時,發生的任何異常都會被及時捕獲,在遊戲日誌中記錄下無法處理資料包(Failed to handle packet),而不會引發遊戲崩潰。因此如果異常的拋出是由玩家的用戶端操作直接引起的(俗稱「玩家更新」或「玩家操作」,下文稱「玩家操作」),且不是對著BUD鏈上的黏性活塞作出
另外一種可能的方式是引起JVM錯誤,如記憶體溢出錯誤。在比較器產生的特定方塊更新中,所有異常或錯誤都會被捕獲,並拋出一個崩潰異常。該崩潰異常又可以透過上一種方式由玩家操作捕獲,從而避免崩潰。但若使用記憶體溢出錯誤,還需要保證異常被捕獲後已經釋放足夠的記憶體來使遊戲繼續執行。
舉例來說,以下常見事件屬於「玩家操作」:
以下事件不屬於「玩家操作」:
- 活塞伸出/收回
- 偵測器反應
- 中繼器,比較器的反應
- 按鈕彈起
- 壓力板彈起
- 箭射中按鈕
- 火由於計劃刻或隨機刻改變狀態或熄滅
- 非玩家實體啟動壓力板
- TNT實體的爆炸
- Carpet模組中的
/player <name> attack、/player <name> place
記憶體溢出更新抑制[]
記憶體溢出(Out of Memory,簡稱OOM)更新抑制,又稱更新凍結(Update Freezing),是透過填滿記憶體,讓遊戲拋出記憶體溢出異常的更新抑制方式。
原作者的機器是為4395MB的記憶體設計的,但實際需要的記憶體可能會有浮動。該機器需要在伺服器端上執行。
原理[]
進行這種抑制需要玩家恰到好處地填充遊戲記憶體,這樣在需要更新抑制時,遊戲記憶體就會溢出。為了填滿記憶體,可以使用位於未載入區塊中的亂碼書和填充方塊事件列表。
填充方塊事件列表有幾種方法:使用活塞陣列填充和使用飛行器填充。使用活塞陣列需要約37萬個活塞,使用飛行器可以省去大量活塞,但需要掛機較長時間。
使用記憶體溢出錯誤,還需要保證異常被捕獲後已經釋放足夠的記憶體來使遊戲繼續執行。
結構[]
更新凍結器是一個很龐大的機器(活塞陣列版本約856×10×2830,飛行器版本約732×100×3936),由很多部分構成。
活塞陣列[]
為填充足夠的記憶體,活塞陣列版更新凍結器需要28×192=5376個活塞陣列單元,由192列的無延遲訊號傳輸鏈傳輸訊號,總大小約為640×8×576。
| 材料名稱 | 活塞 | 黏性活塞 | 音階盒 | 紅石線 | 紅石方塊 | 感測鐵軌 | 礦車 | 史萊姆方塊 | 粉紅色混凝土[注 1] | 洋紅色釉陶[注 1] | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 材料數量 | 活塞陣列單元 | 單個 | 75 | 1 | 15 | 15 | 1 | 1 | 1 | 1 | 16 | 1 |
| 所有 | 402428 [注 2] |
5376 | 80640 | 80640 | 5376 | 5376 | 5376 | 5376 | 86016 | 5376 | ||
| 傳輸陣列單元 | 單個 | 0 | 1 | 0 | 15 | 1 | 1 | 1 | 1 | 16 | 1 | |
| 所有 | 0 | 2304 | 192 | 34560 | 2304 | 2304 | 2304 | 2304 | 36864 | 2304 | ||
| 共計 | 402428 [注 2] |
7680 | 80832 | 115200 | 7680 | 7680 | 7680 | 7680 | 122880 | 7680 | ||
飛行器[]
為填充足夠的記憶體,飛行器版更新凍結器需要25個飛行器單元飛行
安全網[]
安全網(Safety Buffer)是用於釋放少量記憶體,預防遊戲崩潰的部分,大小為130×5×29。
安全網俯視圖(帶資料)
安全網中紅石元件的擺放和傾斜鐵軌的朝向
左側圖片是安全網的俯視圖,使用了混凝土標記資料。在中繼器旁突出的混凝土下方是機器鐵軌下凹的部分,樣式如右側圖片。
防崩BUD音階盒[]
適用於活塞陣列版的音階盒陣列
右側圖片展示了適用於活塞陣列版的BUD音階盒陣列。從圖中的除錯畫面可知,音階盒未啟動。它們可用於防止方塊事件列表一直嘗試擴容,從而預防一些問題以減少崩潰。
適用於活塞陣列版的音階盒陣列
右側圖片展示了適用於飛行器版的BUD音階盒陣列。從圖中的除錯畫面可知,音階盒已啟動。這種陣列更易於機器復位,只需要拉一下控制桿即可。
BUD活塞[]
這些BUD活塞會在接收到BUD鏈的訊號後幾乎同時加入方塊事件列表,由於之前加入列表的內容過多,此時該列表會擴容,從而占滿記憶體。
這是飛行器版本的BUD活塞,對於活塞陣列版本,需要去掉左側的2個BUD活塞以及連接它們的比較器。
亂碼書[]
BUD鏈[]
強轉抑制[]
強轉抑制在Java版1.20.2(23w35a)移除。
強轉抑制(Cast Suppression),或CCE更新抑制(CCE Suppression),是透過玩家操作引起遊戲拋出ClassCastException類型轉換異常的更新抑制方式。
該方法需要將特定的方塊實體替換為界伏盒,這一過程需要透過更新抑制進行。成功製造這樣一個界伏盒之後,放置一個檢測它的比較器,這個比較器就具有更新抑制的能力。
原理[]
類型轉換異常(ClassCastException,簡稱CCE)是Java的一個執行時異常,當一個對象的類型被強制轉換到一個它不符合的類型的時被拋出。更新抑制可以透過方塊實體替換拋出CCE實現。
界伏盒計算自己的比較器輸出時,會先取得自己的方塊實體,並強制類型轉換為物品欄。其他容器類方塊都沒有這類不加判斷的類型轉換,所以這類更新抑制裝置必須用界伏盒建造。
如果讓一個界伏盒擁有非物品欄的方塊實體,那麼每當要計算它應有的比較器輸出時,就會拋出CCE。這可以透過方塊實體替換來實現。
將一個比較器背對這樣的界伏盒放置,每次更新這個比較器時,就會重新計算一次該輸出的能量以判斷是否應該更新其狀態,於是引發異常。這個界伏盒和比較器兩者就構成了一個沒有狀態、不需要重設的強轉抑制器。
建造[]
建造強轉抑制器需要先進行方塊實體替換。合適的帶有方塊實體且無物品欄的方塊包括講台(1.14及以上)和唱片機(1.11-1.13),它們被破壞時,在刪除自己的方塊實體之前會先發出一次方塊更新。玩家可以用別的更新抑制方法打斷邏輯,跳過刪除方塊實體這一步。
正在發出紅石訊號的講台被破壞的時候,會在刪除方塊實體之前更新自己下方的毗鄰,此時觸發更新抑制就可以保留方塊實體。講台發出紅石訊號的時長只有2遊戲刻,但是也可以透過額外的一次更新抑制來使講台保持啟動狀態,因為在1.17以下,棧溢出更新抑制仍然適用,額外一次更新抑制成本不高。玩家翻書時,講台發出訊號,啟動動力鐵軌,並觸發更新抑制。由於講台發出訊號早於講台計劃解除啟動狀態的計劃刻,所以計劃刻沒有產生,講台保持啟動狀態。這種製作方法也適用於1.17及以上,但由於需要多次觸發更新抑制,這種方法略顯麻煩。
1.17及以上直接拆掉對著更新抑制器的浮空比較器邊上的有書的講台也可以
在1.17及之後的版本,放有書的講台被破壞時,會在刪除自己的方塊實體之前發出一次比較器更新。因此,還可以直接破壞對著更新抑制器的浮空比較器後面的有書的講台,如右圖。
保留了講台的方塊實體後,在其位置放置一個界伏盒,由於該位置已經存在方塊實體,界伏盒不會產生新的方塊實體,這就實現了方塊實體替換。這就是強轉抑制器的核心,更新一個從它這裡取輸出的比較器,就會觸發強轉抑制。
應用[]
圖中燈亮,抑制器啟動;燈滅,抑制器關閉
將物品放入投擲器時,投擲器物品欄發生變化,發出比較器更新,抑制器中的比較器重新計算自己的輸入訊號,並觸發更新抑制。這樣就完成了一次物品分身。連續這樣操作就可以很快地製作物品分身,這是目前已知的最好的物品分身的製作方法。
強轉抑制器是無狀態的,每次更新比較器時,一般都會拋出異常,但也可能不會拋出。異常的觸發是在計算界伏盒輸出的時候發生的,如果收到的更新不會使比較器重新計算輸入,就不會拋出異常。
強轉抑制器是在比較器從界伏盒取輸出時發生的,所以如果沒有比較器,就不會觸發更新抑制。你也可以在比較器和界伏盒之間放置一個紅石導體,其被充能到15訊號強度時,會屏蔽後面的容器,比較器就不會計算容器的輸出,這樣可以關閉強轉抑制器。
按本教學做出的強轉抑制器的比較器輸出為15,這個輸出也可用於更新抑制。
錯誤報告[]
下面是強轉抑制的伺服器端錯誤報告和崩潰報告,可供技術玩家參考。
棧溢出更新抑制[]
所需資訊:需要機器的建造教學
棧溢出(Stack Overflow)更新抑制是利用方塊更新的大量傳播填滿棧,讓遊戲拋出棧溢出異常來實現更新抑制的方法。
原理[]
這種更新抑制器會引起足夠的方塊更新,向棧中加入大量資料來導致棧溢出,此時遊戲會拋出棧溢出異常。根據不同作業系統中JVM預設的棧的大小不同,所需要的方塊更新數量不同,抑制器所需的大小也就不同。
極簡更新抑制器[]
此裝置使得在1.16(20w18a)至1.17.1進行更新抑制的成本大大降低。但在1.17至1.17.1中有可能造成未知原因的崩潰,1.18至1.18.2中該機器會由於未知原因會導致崩潰
地板門應使用木質地板門,且其在關閉時應在方塊的上半部分。在地板門上要放置紅石線。
使用這個機器前建議打開遊戲聲音。使用機器需要先打開地板門,之後敲擊音階盒B。若敲擊音階盒時機器未發出地板門聲,則可關閉地板門,此時更新抑制完成就位。否則需要先打開地板門,敲擊音階盒A,此時地板門會關閉。之後即可再次嘗試。也可以透過使用紅石訊號強/弱充能音階盒A再取消充能完成一次復位。
右側是上方更新抑制器的自復位變種。圖中偵測器用於復位這個更新抑制器。
這是3gt自復位更新抑制器,裝置需要朝向南方。在使用此機器觸發一次更新抑制後,在音階盒B上方放置朝上的活塞即可完成製作。
鐵軌更新抑制器[]
鐵軌更新抑制器是1.18.2及以下版本中玩家最常使用的更新抑制器,也是研究最為成熟的更新抑制器。這種更新抑制器從上往下可以看到大量鐵軌。
鐵軌更新抑制器,帶一小段BUD鏈
錯誤報告[]
下面是棧溢出更新抑制的伺服器端錯誤報告和崩潰報告,可供技術玩家參考。
歷史[]
在22w11a中,更新的儲存從棧變更為隊列
| Java版 | |||||
|---|---|---|---|---|---|
| 2016年6月11日 | Panda4994發現了棧溢出更新抑制,發布了高塔更新抑制器。[2] | ||||
| 1.13 | ? | 隨著方塊更新被拆分為NC更新和PP更新,高塔更新抑制器失效。 | |||
| 1.17 | ? | 講台在拆除後會發出比較器更新了。這使得製作強轉抑制器只需觸發1次更新抑制。 | |||
| 1.18 | ? | 極簡更新抑制器在觸發時會崩潰了,但更新抑制後的結果會被儲存。 | |||
| 1.19 | 22w11a | 棧溢出更新抑制被修復,MC-249082被標記為「有意為之」。 | |||
| 22w12a | MC-249181被修復。 | ||||
| 2023年4月17日 | FX-PR0CESS、Igna778發現了記憶體溢出更新抑制(活塞陣列),發布了基於活塞陣列的記憶體溢出更新抑制器。[3][4] | ||||
| 2023年4月29日 | NicNac在Discord上公布了極簡更新抑制器。當天HackerRouter將Discord上的截圖公布在bilibili。[5] | ||||
| 2023年6月12日 | Void0發現了強轉抑制,發布了BV1Hu4y1o71G,次日發布了關於強轉抑制器的筆記。 | ||||
| 2023年6月14日 | Igna778發布了基於飛行器的記憶體溢出更新抑制器。[6] | ||||
| 1.20.2 | 23w35a | 強轉抑制被修復。比較器在檢測被方塊實體替換後的界伏盒不再輸出任何訊號或觸發更新抑制。 | |||
畫廊[]
記憶體溢出更新抑制器(活塞陣列版)的主要部分
普通棧溢出更新抑制器,帶一小段BUD鏈
影片[]
外部連結[]
- #強轉抑制的來源:關於強轉抑制器的筆記(Void0)-嗶哩嗶哩
- #極簡更新抑制器中自復位版本的來源:3gt自復位更新抑制器(MC-cubes)-嗶哩嗶哩
- 6gt自復位更新抑制器(Bot_City)-嗶哩嗶哩
- [Minecraft生电漫游指南]更新抑制專題:都2023年了還不會玩更新抑制?(豬哥Bro_Pig)-嗶哩嗶哩
- 淺談更新抑制器與注意事項(xingjiFIUG)-嗶哩嗶哩
參見[]
參考[]
- ↑ MC-249181 — 「動力鐵軌和觸發鐵軌的更新順序被顛倒了。」 — 錯誤狀態為「已修復」。
- ↑ 「Update Suppression, Block Duplication, Skull Converter and More」 – Panda4994。YouTube,2016年6月11日。(Bilibili搬運)
- ↑ 「[1.19+] Update Suppression is back to stay」 – FX - PR0CESS。YouTube,2023年4月17日。(Bilibili搬運)
- ↑ 「Minecraft Update Suppression is Back: The OOM Method that Bypasses Mojang's Patch」 – Igna778。YouTube,2023年4月17日。(Bilibili搬運)
- ↑ HackerRouter的動態 — 嗶哩嗶哩
- ↑ 「Shulker Suppression - The Ultimate Update Bug That Cant Be Patched!」 – Igna778。YouTube,2023年6月15日。(Bilibili搬運)
注釋[]
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
語言




