此特性为Java版独有。
此页面所述的内容是通过利用漏洞实现的。
此漏洞未必对所有版本有效。该漏洞被修复后,下文所述的信息将不再适用。请慎重对待。
更新抑制(Update Suppression)是指在方块更新传播过程中,迫使游戏停止当前方块更新过程,跳过所有未执行的方块更新,以及更新后的一系列其他游戏逻辑。更新抑制器(Update Suppressor)则是用于完成更新抑制的装置。
更新抑制允许玩家引起部分方块的方块更新,而避免其他方块更新,故可以用于进行切门、将方块放置在通常不可能存在的位置等;还由于可以取消后续的其他逻辑,可以用来复制方块、物品分身、方块实体替换。更新抑制器还可以用于制造可控的服务端崩溃。
警告:这些装置有较大的风险导致游戏崩溃甚至存档损坏,建造及使用时请小心。若你仅需要跳过方块更新但无法承担此风险,请使用更新跳略。
目录
1 原理
2 内存溢出更新抑制
2.1 原理
2.2 结构
2.2.1 活塞阵列
2.2.2 飞行器
2.2.3 安全网
2.2.4 防崩BUD音符盒
2.2.5 BUD活塞
2.2.6 乱码书
2.2.7 BUD链
3 强转抑制
3.1 原理
3.2 建造
3.3 应用
3.4 错误报告
4 栈溢出更新抑制
4.1 原理
4.2 极简更新抑制器
4.3 铁轨更新抑制器
4.4 错误报告
5 历史
6 画廊
7 视频
8 外部链接
9 参见
10 参考
11 注释
原理[]
正常情况下,游戏不会跳过所应该执行的逻辑。因此更新抑制都是通过游戏漏洞来完成的。更新抑通常制是使用特定方式触发程序抛出异常或错误,且该异常抛出后在特定位置被捕获,从而跳过本应执行的逻辑。如果触发了异常但游戏并未将其捕获,则会导致游戏崩溃甚至存档损坏。
一种常用的方式是由玩家操作来引发游戏抛出异常。游戏服务端在处理来自客户端的数据包时,发生的任何异常都会被及时捕获,在游戏日志中记录下无法处理数据包(Failed to handle packet),而不会引发游戏崩溃。因此如果异常的抛出是由玩家的客户端操作直接引起的(俗称“玩家更新”或“玩家操作”,下文称“玩家操作”),且不是对着BUD链上的黏性活塞作出[需要测试],则不会使游戏崩溃。但如果意外由其他方式引起异常,往往会使游戏崩溃,甚至存档损坏。
另外一种可能的方式是引起JVM错误,如内存溢出错误。在比较器产生的特定方块更新中,所有异常或错误都会被捕获,并抛出一个崩溃异常。该崩溃异常又可以通过上一种方式由玩家操作捕获,从而避免崩溃。但若使用内存溢出错误,还需要保证异常被捕获后已经释放足够的内存来使游戏继续运行。
举例来说,以下常见事件属于“玩家操作”:
玩家放置、破坏方块
玩家拉动拉杆
玩家按下按钮
玩家踩下压力板
玩家点火
玩家引爆末地水晶、重生锚等
以下事件不属于“玩家操作”:
活塞伸出/收回
侦测器反应
中继器,比较器的反应
按钮弹起
压力板弹起
箭射中按钮
火由于计划刻或随机刻改变状态或熄灭
非玩家实体激活压力板
TNT实体的爆炸
Carpet模组中的/player
内存溢出更新抑制[]
该段落需要补充更多信息。
内存溢出(Out of Memory,简称OOM)更新抑制,又称更新冻结(Update Freezing),是通过填满内存,让游戏抛出内存溢出异常的更新抑制方式。
原作者的机器是为4395MB的内存设计的,但实际需要的内存可能会有浮动。该机器需要在服务端上运行。
原理[]
进行这种抑制需要玩家恰到好处地填充游戏内存,这样在需要更新抑制时,游戏内存就会溢出。为了填满内存,可以使用位于未加载区块中的乱码书和填充方块事件列表。
填充方块事件列表有几种方法:使用活塞阵列填充和使用飞行器填充。使用活塞阵列需要约37万个活塞,使用飞行器可以省去大量活塞,但需要挂机较长时间。
使用内存溢出错误,还需要保证异常被捕获后已经释放足够的内存来使游戏继续运行。
结构[]
更新冻结器是一个很庞大的机器(活塞阵列版本约856×10×2830,飞行器版本约732×100×3936),由很多部分构成。
结构
活塞阵列[]
为填充足够的内存,活塞阵列版更新冻结器需要28×192=5376个活塞阵列单元,由192列的无延迟信号传输链传输信号,总大小约为640×8×576。
活塞阵列单元(第1、3层)
活塞阵列单元(第2层)活塞阵列共192列,每列28个单元
A
无延迟信号传输链传输阵列共192列,每列12个单元音符盒A仅用户操作端需要
材料列表
材料名称
活塞
黏性活塞
音符盒
红石线
红石块
探测铁轨
矿车
黏液块
粉红色混凝土[注 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个飞行器单元飞行[需要更多信息]m,飞行器本身总大小约为3×100×11。
安全网[]
提示:本段落的主题不是#铁轨更新抑制器。
安全网(Safety Buffer)是用于释放少量内存,预防游戏崩溃的部分,大小为130×5×29。
安全网俯视图(带数据)
安全网中红石元件的摆放和倾斜铁轨的朝向
左侧图片是安全网的俯视图,使用了混凝土标记数据。在中继器旁突出的混凝土下方是机器铁轨下凹的部分,样式如右侧图片。
防崩BUD音符盒[]
适用于活塞阵列版的音符盒阵列
右侧图片展示了适用于活塞阵列版的BUD音符盒阵列。从图中的调试屏幕可知,音符盒未激活。它们可用于防止方块事件列表一直尝试扩容,从而预防一些问题以减少崩溃。
适用于活塞阵列版的音符盒阵列
右侧图片展示了适用于飞行器版的BUD音符盒阵列。从图中的调试屏幕可知,音符盒已激活。这种阵列更易于机器复位,只需要拉一下拉杆即可。
BUD活塞[]
这些BUD活塞会在接收到BUD链的信号后几乎同时加入方块事件列表,由于之前加入列表的内容过多,此时该列表会扩容,从而占满内存。
这是飞行器版本的BUD活塞,对于活塞阵列版本,需要去掉左侧的2个BUD活塞以及连接它们的比较器。
乱码书[]
BUD链[]
强转抑制[]
该段落所介绍的内容已从Java版中移除。
强转抑制在Java版1.20.2(23w35a)移除。
参见:关于强转抑制器的笔记
“
这可不是一台更新跳略器,这是一台货真价实的更新抑制器!
”——Void0
强转抑制(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,这个输出也可用于更新抑制。
错误报告[]
下面是强转抑制的服务端错误报告和崩溃报告,可供技术玩家参考。
未崩溃的错误报告
崩溃后的崩溃报告
栈溢出更新抑制[]
该段落需要补充更多信息。
所需信息:需要机器的建造教程
该段落所介绍的内容已从Java版中移除。
栈溢出更新抑制在Java版1.19(22w11a)修复。
栈溢出(Stack Overflow)更新抑制是利用方块更新的大量传播填满栈,让游戏抛出栈溢出异常来实现更新抑制的方法。
原理[]
这种更新抑制器会引起足够的方块更新,向栈中添加大量数据来导致栈溢出,此时游戏会抛出栈溢出异常。根据不同操作系统中JVM默认的栈的大小不同,所需要的方块更新数量不同,抑制器所需的大小也就不同。
极简更新抑制器[]
该段落介绍的内容已在最新版本的Minecraft中移除,仅在特定版本中可用。
该段落的机器在1.16(20w18a)至1.17.1为更新抑制器,1.19至1.19.4为更新跳略器,1.15.2及以下、1.18至1.18.2[需要更多信息]、1.20及以上无法使用。
请务必注意该机器在不同版本的特性与效果。
极简更新抑制器(简易版)其中动力铁轨不可移除
A
B
极简更新抑制器(完整版)
此装置使得在1.16(20w18a)至1.17.1进行更新抑制的成本大大降低。但在1.17至1.17.1中有可能造成未知原因的崩溃,1.18至1.18.2中该机器会由于未知原因会导致崩溃[需要更多信息],但这些版本中重新进入后都会成功更新抑制;1.20-pre2及以后,红石线会连接四周开启的活板门上的红石线,导致该装置彻底失效。
活板门应使用木质活板门,且其在关闭时应在方块的上半部分。在活板门上要放置红石线。
使用这个机器前建议打开游戏声音。使用机器需要先打开活板门,之后敲击音符盒B。若敲击音符盒时机器未发出活板门声,则可关闭活板门,此时更新抑制完成就位。否则需要先打开活板门,敲击音符盒A,此时活板门会关闭。之后即可再次尝试。也可以通过使用红石信号强/弱充能音符盒A再取消充能完成一次复位。
B
A
→
自复位极简更新抑制器
右侧是上方更新抑制器的自复位变种。图中侦测器用于复位这个更新抑制器。
↑
S
自复位极简更新抑制器(上层)
A
B
自复位极简更新抑制器(下层)
这是3gt自复位更新抑制器,装置需要朝向南方。在使用此机器触发一次更新抑制后,在音符盒B上方放置朝上的活塞即可完成制作。
铁轨更新抑制器[]
提示:本段落的主题不是#安全网。
铁轨更新抑制器是1.18.2及以下版本中玩家最常使用的更新抑制器,也是研究最为成熟的更新抑制器。这种更新抑制器从上往下可以看到大量铁轨。
铁轨更新抑制器,带一小段BUD链
错误报告[]
下面是栈溢出更新抑制的服务端错误报告和崩溃报告,可供技术玩家参考。
未崩溃的错误报告
崩溃后的崩溃报告
历史[]
在22w11a中,更新的存储从栈更改为队列[需要更多信息],更新顺序不再颠倒,因此栈溢出更新抑制被修复,这在MC-249082中被认为是按预期工作。然而,这个更新在22w12a中修复[1],取而代之的是更新跳略。现在玩家常使用内存溢出更新抑制或强转抑制进行更新抑制。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
关于“沙盒/教程/更新抑制”的历史,请见各版本页面。
画廊[]
内存溢出更新抑制器(活塞阵列版)的主要部分
带普通连续式BUD链的强转抑制器的概览图和分层图。钻石块上方的结构方块上方的方块及对应的结构分别对应左侧结构方块
带垂直BUD链的强转抑制器的概览图。强转抑制器及BUD链在结构方块的白线内
普通栈溢出更新抑制器,带一小段BUD链
带垂直BUD链的栈溢出更新抑制器
视频[]
栈溢出更新抑制、BUD链内存溢出更新抑制强转抑制
栈溢出更新抑制、BUD链[注 3]
极简更新抑制器
内存溢出更新抑制
强转抑制
外部链接[]
#强转抑制的来源:关于强转抑制器的笔记(Void0)-哔哩哔哩
#极简更新抑制器中自复位版本的来源:3gt自复位更新抑制器(MC-cubes)-哔哩哔哩
6gt自复位更新抑制器(Bot_City)-哔哩哔哩
[Minecraft生电漫游指南]更新抑制专题:都2023年了还不会玩更新抑制?(猪哥Bro_Pig)-哔哩哔哩
浅谈更新抑制器与注意事项(xingjiFIUG)-哔哩哔哩
参见[]
参考[]
↑ MC-249181 — “动力铁轨和激活铁轨的更新顺序被颠倒了。” — 漏洞状态为“已修复”。
注释[]
↑ 1.0 1.1 原存档中使用的是该方块
↑ 2.0 2.1 原存档中(9290,-50,-12515)和(9290,-50,-12810)处向东看可看到部分活塞阵列不完整
↑ 部分视频中两个内容都有讲解
查
论
编教程(作下划线标记的教程为中文独有教程)
新手教程
菜单屏幕
游戏术语
下载、安装与购买
新手生存
新手指南
第一天
第二天
第三天
提示与技巧
饥饿管理
不该做的事
生存注意事项
庇护所
庇护所
沙漠
最佳居住生物群系
最佳建筑材料
建筑与结构
房屋类型
导航
综合
无聊的时候做什么
村庄生存
跑酷
空置域
伪和平
节省时间的小窍门
在水下利用TNT破坏方块
成就指南
进度指南
拓殖
战斗
完成冒险
创建一个村庄
双持
沙漠生存
下界生存
从零开始下界生存
末地生存
探索洞穴
家具
在和平难度中收集资源
利用碰撞箱
马
测量单位
使用地图
测量距离和角度
采矿技术
钻石
化石
远古残骸
下界快速旅行
下界传送门
支柱跳跃
PvP
Java版1.9前、基岩版
基地
穿越和破坏基岩
村庄机制
治愈僵尸村民
考古
Minecraft和教育
不可破坏的末地水晶
使用更少的末地水晶重生末影龙
透视镜
挂机池
光速船[仅基岩版]
无材料消耗转换药水类型[仅基岩版]
汇报漏洞
在超平坦地图中管理史莱姆
建筑
给工程添加美感
空气闸
建筑术语
建造游轮
建造大都市
建造过山车
建造安全的家园
建造水建筑
建造几何体
防御
电梯
带釉陶瓦的图案
建造更好的地板
像素艺术
牧场
屋顶类型
弧形屋顶
屋顶建造指南
装饰屋顶
暗门
建造居住地
水下之家
墙壁和桥墩
水闸
调色板
存储方案
整理物品
潜影盒储存
矿车储存
物品运输
附魔与烧炼
附魔台机制
铁砧机制
自动化烧炼
燃料选择
破坏方块
爆炸室
凋灵笼
挑战
获得潮涌核心
冒险模式生存
挑战自定义地图
制作自定义地图
征服神殿和神庙
触发及战胜袭击
征服掠夺者前哨站
征服堡垒遗迹
征服林地府邸
征服海底神殿
打败末影龙
征服末地城
打败凋灵
极限模式
超极限模式
在一个地区中长期生存下去
雷暴生存
在无限沙漠中生存
超平坦世界生存[仅Java版]
岛屿生存
空岛生存
速通
猎人游戏
放牧心得
探索深暗之域和远古城市
愚人节版本生存
22w13oneBlockAtATime
农场
方块和物品
骨粉
仙人掌
圆石或石头
可可豆
农作物(甜菜、胡萝卜、马铃薯和小麦)
紫颂果
泥土
滴水石锥
鸡蛋
蛙明灯
蜂蜜
鱼
花朵
冰
海带
零刻作物催熟技术
肉
蘑菇
唱片
下界疣
黑曜石
西瓜、南瓜
鳞甲
羊毛
海泡菜
雪
甘蔗
树木
藤蔓
药水
经验
基岩
方块和物品复制
铁轨复制机[仅Java版]
TNT复制[仅Java版]
生物
刷怪塔
怪物磨床
刷怪笼陷阱
动物(猪、牛、羊)
烈焰人
洞穴蜘蛛
闪电苦力怕
溺尸/僵尸
末影人
山羊
守卫者
铁傀儡
岩浆怪
以物易物
无限触发袭击
潜影贝
史莱姆
鱿鱼
海龟
村民
女巫
流浪商人
凋灵骷髅
僵尸猪灵
红石
基础红石
基本逻辑门
高频电路
计时器
通用物品分类器
抽奖箱
飞行器
漏斗
机械
侦测器稳定器
密码锁
随机发生器
红石机械
红石音乐
红石技巧
鲁布·戈德堡机械
村民交易所
探测器
方块更新感应器
比较器更新感应器
阳光探测器
昼夜探测器
矿车
火车站
矿车
储存
存储系统
陷阱
雪傀儡防御炮
TNT大炮
活板门利用
陷阱设计
陷阱
活塞
活塞使用
活塞电路
半连接性
零刻活塞
无延迟中继器
无头活塞
高级红石
高级红石电路
算术逻辑
计算器
时钟
摩斯密码
打印机
红石计算机
红石电报机
服务器
使用服务器
在服务器上游玩
服务器监狱
防止恶意破坏
服务器商店
起床战争
空岛战争
架设服务器
架设服务器
架设基岩版服务器
服务器架设脚本
服务器启动脚本
FreeBSD启动脚本
OpenBSD启动脚本
Ubuntu启动脚本
WebSocket服务器[仅基岩版]
架设Mod服务器[仅Java版]
架设Hamachi服务器
架设Spigot服务器
虚拟硬盘服务器
使用ngrok搭建服务器
架设ZeroTier服务器
技术性
结构方块
命令方块
命令统计值
使用命令操控实体
提高帧率
Minecraft帮助FAQ(IRC频道)
NBT与JSON
Minecraft URL Scheme[仅基岩版]
更新Java
运行数据生成器
地图
自定义地图
下载地图
生成下落的方块[仅Java版]
使用MCEdit在1.13中刷新旧版海洋[仅Java版]
强制打开存档[仅Java版]
资源包
制作资源包
加载资源包
声音目录
数据包
制作数据包
实例:蜜蜂助手
消除视线
安装数据包
自定义世界生成
附加包
基岩版开发指南
制作资源附加包
高级
基岩版实体文档
修改实体模型
制作行为包
自定义实体
制作游戏视频
视频
游戏安装
快照版本安装
获取崩溃报告
在U盘中使用旧版启动器运行及保存Minecraft
恢复损坏的地图数据
在Google Drive上运行Minecraft
将游戏数据保存到Dropbox云端(仅限地图数据)
将游戏数据保存到Dropbox云端
在Chrome OS上游玩Minecraft
仅Java版
修复Apache Log4j2漏洞
自定义命令触发
原始JSON文本
NBT命令标签
编写启动器
版本清单文件下载
版本json文件下载
过时教程
建造微型庇护所
自定义纹理包
基于门的铁傀儡陷阱
到达边境之地
获取崩溃报告(旧版)
人工湖
矿车加速器
中继器重启系统
无数据包生存
升级LWJGL
更新Minecraft
村庄链
水梯
水道
游戏直播
教程
新手手册
高难度通关配装总结
成就指南
高塔指南
语言
English