此特性为Java版独有。
此页面所述的内容是通过利用漏洞实现的。
此漏洞未必对所有版本有效。该漏洞被修复后,下文所述的信息将不再适用。
请慎重对待。
更新抑制(Update Suppression)是指在方块更新传播过程中,迫使游戏停止当前方块更新过程,跳过所有未执行的方块更新,以及更新后的一系列其他游戏逻辑。更新抑制器(Update Suppressor)则是用于完成更新抑制的装置。
更新抑制允许玩家引起部分方块的方块更新,而避免其他方块更新,故可以用于进行切门、将方块放置在通常不可能存在的位置等;还由于可以取消后续的其他逻辑,可以用来复制方块、物品分身、方块实体替换。一些更新抑制器还可以用于制造可控的服务端崩溃。
警告:这些装置有较大的风险导致游戏崩溃甚至存档损坏,建造及使用时请小心。若你仅需要跳过方块更新但无法承担此风险,请使用更新跳略。
正常情况下,游戏不会跳过所应该执行的逻辑。因此更新抑制都是通过游戏漏洞来完成的。更新抑通常制是使用特定方式触发程序抛出异常或错误,且该异常抛出后在特定位置被捕获,从而跳过本应执行的逻辑。如果触发了异常但游戏并未将其捕获,则会导致游戏崩溃甚至存档损坏。
一种常用的方式是由玩家操作来引发游戏抛出异常。游戏服务端在处理来自客户端的数据包时,发生的任何异常都会被及时捕获,在游戏日志中记录下无法处理数据包(Failed to handle packet),而不会引发游戏崩溃。因此如果异常的抛出是由玩家的客户端操作直接引起的,则不会使游戏崩溃。但如果意外由其他方式引起异常,往往会使游戏崩溃,甚至存档损坏。
另外一种可能的方式是引起JVM错误,如内存溢出错误。在比较器产生的特定方块更新中,所以异常或错误都会被捕获,并抛出一个崩溃异常。该崩溃异常又可以通过上一种方式由玩家操作捕获,从而避免崩溃。但若使用内存溢出错误,还需要保证异常被捕获后已经释放足够的内存来使游戏继续运行。
举例来说,以下常见事件属于“玩家操作”:
以下事件不属于“玩家操作”:
/player attack
、/player place
该段落需要补充更多信息。
内存溢出(Out of Memory,简称OOM)更新抑制,又称更新冻结(Update Freezing),是通过填满内存,让游戏抛出内存溢出异常的更新抑制方式。
原作者的机器是为4395MB的内存设计的,但实际需要的内存可能会有浮动。该机器需要在服务端上运行。
进行这种抑制需要玩家恰到好处地填充游戏内存,这样在需要更新抑制时,游戏内存就会溢出。为了填满内存,可以使用位于未加载区块中的乱码书和填充方块事件列表。
填充方块事件列表有几种方法:使用活塞阵列填充和使用飞行器填充。使用活塞阵列需要约37万个活塞,使用飞行器可以省去大量活塞,但需要挂机较长时间。
使用内存溢出错误,还需要保证异常被捕获后已经释放足够的内存来使游戏继续运行。
更新冻结器是一个很庞大的机器(活塞阵列版本约856×10×2830,飞行器版本约732×100×3936),由很多部分构成。
结构
为填充足够的内存,活塞阵列版更新冻结器需要28×192=5376个活塞阵列单元,由192列的无延迟信号传输链传输信号,总大小约为640×8×576。
活塞阵列单元(第1、3层)
rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | |
活塞阵列单元(第2层)
活塞阵列共192列,每列28个单元
rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | rd-$ew! | 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活塞,对于活塞阵列版本,需要去掉左侧的2个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信号强度时,会屏蔽后面的容器,比较器就不会计算容器的输出,这样可以关闭强转抑制器。
下面是强转抑制的服务端错误报告和崩溃报告,可供技术玩家参考。
该段落需要补充更多信息。
所需信息:需要机器的建造教程
该段落所介绍的内容已从Java版中移除。
栈溢出更新抑制在Java版1.19(22w11a)修复。
栈溢出(Stack Overflow)更新抑制是利用方块更新的大量传播填满栈,让游戏抛出栈溢出异常来实现更新抑制的方法。
这种更新抑制器会在一个引起足够的方块更新,向栈中添加数据来导致栈溢出,此时游戏会抛出栈溢出异常。根据JVM中栈内存的大小不同,所需要的方块更新数量不同,抑制器所需的大小也就不同。
极简更新抑制器(简易版)
其中 动力铁轨不可移除
A | B | |
极简更新抑制器(完整版)
→ | |||
自复位极简更新抑制器
↑ | ||
S | ||
自复位极简更新抑制器
(上层)
A | B | |
自复位极简更新抑制器
(下层)
该段落介绍的内容已在最新版本的Minecraft中移除,仅在特定版本中可用。
该段落的机器在1.16(20w18a)至1.17.1为更新抑制器,1.19至1.19.4为更新跳略器,1.15.2及以下、1.18至1.18.2[需要更多信息]、1.20及以上无法使用。
请务必注意该机器在不同版本的特性与效果。
此装置使得在1.16(20w18a)至1.17.1进行更新抑制的成本大大降低。但在1.17至1.17.1中有可能造成未知原因的崩溃,1.18至1.18.2中该机器会由于未知原因会导致崩溃[需要更多信息],但这些版本中重新进入后都会成功更新抑制;1.20-pre2及以后,红石线会连接四周开启的活板门上的红石线,导致该装置彻底失效。
活板门应使用木质活板门,且其在关闭时应在方块的上半部分。在活板门上要放置红石线。
使用这个机器前建议打开游戏声音。使用机器需要先打开活板门,之后敲击音符盒B。若敲击音符盒时机器未发出活板门声,则可关闭活板门,此时更新抑制完成就位。否则需要先打开活板门,敲击音符盒A,此时活板门会关闭。之后即可再次尝试。也可以通过使用红石信号强/弱充能音符盒A再取消充能完成一次复位。
右侧是上方更新抑制器的自复位变种。图中侦测器可用于复位这个更新抑制器。
这是3gt自复位更新抑制器,装置需要朝向南方。在使用此机器触发一次更新抑制后,在音符盒B上方放置朝上的活塞即可完成制作。
下面是栈溢出更新抑制的服务端错误报告和崩溃报告,可供技术玩家参考。
在22w11a中,更新的存储从栈更改为队列[需要更多信息],更新顺序不再颠倒,因此栈溢出更新抑制被修复,这在MC-249082中被认为是按预期工作。然而,这个更新在22w12a中修复[1],取而代之的是更新跳略。现在玩家常使用内存溢出更新抑制或强转抑制进行更新抑制。
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链的强转抑制器的概览图和分层图。钻石块上方的结构方块上方的方块及对应的结构分别对应左侧结构方块
带垂直BUD链的强转抑制器的概览图。强转抑制器及BUD链在结构方块的白线内
普通栈溢出更新抑制,带一小段BUD链
带垂直BUD链的栈溢出更新抑制器
教程(作下划线标记的教程为中文独有教程) | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
新手教程 |
| ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
综合 |
| ||||||||||
农场 | |||||||||||
方块和物品 |
|
---|---|
生物 |
|
基础红石 |
|
---|---|
探测器 |
|
矿车 |
|
陷阱 |
|
活塞 |
|
高级红石 |
|
使用服务器 |
|
---|---|
架设服务器 |
|
地图 |
|
---|---|
资源包 |
|
数据包 |
分享名称:创新互联Minecraft Wiki教程:原理[ ]
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等 声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联 猜你还喜欢下面的内容 |