源码解读我的世界红石更新时序

时间:2017-11-01 来源:88130安卓下载 作者:佚名

  源码解读我的世界红石更新时序。那下面则是用源码解读我的世界中的红石更新时序问题哦~那有不知道的玩家不妨进来看看哦~希望对大家有所帮助。

  游戏园我的世界官方群:325049520  256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!

  玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!

  如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址点我进入

  如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~

  所用mc版本为1.8.8,java版本1.8.0_45 64bit,纯净原版无插件。

  一、游戏主循环中的红石部分

  主循环是mc最重要的一部分代码了,在这一次次的循环中,mc对红石都进行了哪些操作呢?

  这是1tick中,对红石电路部分有关的操作,顺序由上到下:

  1.Next Tick Entry(以下简称NTE)

  很多人想来都不陌生了,mc红石电路中的延时即由此实现。有些电路元件如中继器、比较器、红石火把等,受到更新时会把自己加入这个列表,实现在x tick之后的再次更新。有方块加入时,这个列表会进行排序,规则是延迟先结束的在前,然后优先级低的在前,都相同就按入列的先后排序。这样可以保证在同一tick内,优先级高的元件先被更新。关于各种元件的优先级,后面再讨论。

  2.Piston Update(简称PU)

  主循环中,被更新到的活塞,包括粘性和非粘性,不会加入NTE,只是将自己加入这个列表中,在NTE结束后统一进行更新。这个列表没有排序,所以更新顺序就是入列的顺序。

  3.Tile Entity Update

  活塞推动时,所有移动的方块和活塞臂,会成为一个个TileEntity进行移动,移动完成后恢复为方块。在此过程中,方块原有位置被设置为36号方块。移动的更新即在此处进行。

  4.Network

  无论是单人还是服务器,玩家的操作都要由客户端上传到服务端,如玩家拉下拉杆,此操作形成的更新即在此处进行。

  二、先定义几个术语

  主要让后面的说明变得更简单一点,同时也更严谨233

  1.被方块更新

  红石元件被其他方块更新时,如中继器被充能,活塞被充能等。

  2.NTE更新

  即中继器、火把等元件通过NTE进行的延时更新。

  3.更新方块

  更新单个方块,不涉及其他方块。

  4.更新周围方块

  更新一个方块周围的6个方块,顺序为西东下上北南。

  三、当红石元件受到更新时,都进行了哪些操作?

  1.Redstone Wire

  红石线是电路中最基础的部分了。当受到更新时,游戏会重新计算红石线能量大小,若与原来能量相等,则不去更新其他方块。若不相等,红石线会遍历自身和周围6个方块,总共7个方块,即图中间紫色玻璃和橙色玻璃。

  被遍历到的方块会更新周围的6个方块,如图右侧的橙色玻璃和白色玻璃。一个红石所更新的所有方块如下图所示。

  注意这个遍历的顺序是根据java中的Set类确定,遍历顺序无法预测。对于同一个坐标,遍历顺序始终相同。遍历顺序随红石线坐标的改变而改变。遍历顺序与mc版本无关,与java版本有关。如图,左右两个结构完全相同,但是活塞伸出的顺序却不同,证明红石更新方块顺序不是固定的。

  源码解读我的世界红石更新时序。那下面则是用源码解读我的世界中的红石更新时序问题哦~那有不知道的玩家不妨进来看看哦~希望对大家有所帮助。

  游戏园我的世界官方群:325049520  256070479 欢迎各路喜爱我的世界的小伙伴们加入讨论!

  玩服务器的小伙伴们可以加入:141931866 群一起联机玩游戏哦!

  如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址点我进入

  如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击>>>投稿<<<进行投稿哦~ 有奖品哦~

  所用mc版本为1.8.8,java版本1.8.0_45 64bit,纯净原版无插件。

  一、游戏主循环中的红石部分

  主循环是mc最重要的一部分代码了,在这一次次的循环中,mc对红石都进行了哪些操作呢?

  这是1tick中,对红石电路部分有关的操作,顺序由上到下:

  1.Next Tick Entry(以下简称NTE)

  很多人想来都不陌生了,mc红石电路中的延时即由此实现。有些电路元件如中继器、比较器、红石火把等,受到更新时会把自己加入这个列表,实现在x tick之后的再次更新。有方块加入时,这个列表会进行排序,规则是延迟先结束的在前,然后优先级低的在前,都相同就按入列的先后排序。这样可以保证在同一tick内,优先级高的元件先被更新。关于各种元件的优先级,后面再讨论。

  2.Piston Update(简称PU)

  主循环中,被更新到的活塞,包括粘性和非粘性,不会加入NTE,只是将自己加入这个列表中,在NTE结束后统一进行更新。这个列表没有排序,所以更新顺序就是入列的顺序。

  3.Tile Entity Update

  活塞推动时,所有移动的方块和活塞臂,会成为一个个TileEntity进行移动,移动完成后恢复为方块。在此过程中,方块原有位置被设置为36号方块。移动的更新即在此处进行。

  4.Network

  无论是单人还是服务器,玩家的操作都要由客户端上传到服务端,如玩家拉下拉杆,此操作形成的更新即在此处进行。

  二、先定义几个术语

  主要让后面的说明变得更简单一点,同时也更严谨233

  1.被方块更新

  红石元件被其他方块更新时,如中继器被充能,活塞被充能等。

  2.NTE更新

  即中继器、火把等元件通过NTE进行的延时更新。

  3.更新方块

  更新单个方块,不涉及其他方块。

  4.更新周围方块

  更新一个方块周围的6个方块,顺序为西东下上北南。

  三、当红石元件受到更新时,都进行了哪些操作?

  1.Redstone Wire

  红石线是电路中最基础的部分了。当受到更新时,游戏会重新计算红石线能量大小,若与原来能量相等,则不去更新其他方块。若不相等,红石线会遍历自身和周围6个方块,总共7个方块,即图中间紫色玻璃和橙色玻璃。

  被遍历到的方块会更新周围的6个方块,如图右侧的橙色玻璃和白色玻璃。一个红石所更新的所有方块如下图所示。

  注意这个遍历的顺序是根据java中的Set类确定,遍历顺序无法预测。对于同一个坐标,遍历顺序始终相同。遍历顺序随红石线坐标的改变而改变。遍历顺序与mc版本无关,与java版本有关。如图,左右两个结构完全相同,但是活塞伸出的顺序却不同,证明红石更新方块顺序不是固定的。

  2.Redstone Repeater

  中继器也是十分常用的电路元件。当被其他方块更新时,中继器会检查自身状态是否需要改变。若需要,中继器会检查NTE中是否已经有此方块,如果没有,则在NTE中加入这个方块。这个过程不涉及其他方块的更新。

  当受到NTE更新时,若自己未亮起,或者已亮起但未被充能,就会立即改变自身状态,并依次更新自身方块和前方方块的周围方块。若自身状态由未亮起变为亮起,且自身未被充能,就会再次将自身加入NTE列表中。

  3.Redstone Comparator

  比较器类似于中继器,只是当受到NTE更新时,若自己未亮起且未被充能,就不会再亮起,也不会再更新周围方块。

  此外,当Tile Entity Update,有容器内的物品改变时,若比较器挨着容器或者与容器间隔一个实体方块(与中继器朝向无关),也会受到更新而加入NTE列表,如图。

  4.Redstone Torch

  当被其他方块更新时,检测自身状态是否需要改变,若需要,则检查NTE中是否已经有此方块,如果没有,则在NTE中加入这个方块。此过程不涉及其他方块的更新。

  受到NTE更新时,若自身为点亮状态,则立即熄灭,并更新周围6个方块的周围方块,更新范围与红石线相同。若为熄灭状态且未被充能,则立即点亮,同样更新方块。

  5.Piston / Sticky Piston

  当被其他方块更新时,检测自身状态是否需要改变,若需要,检查PU列表中是否有此方块,若没有,则加入此方块。此过程不涉及其他方块的更新。

  受到PU更新时,检测自身状态是否需要改变,若需要,则立即进行推出/收回动作,注意此处若更新到其他活塞,同样会被加入到PU列表中,并在同一tick中进行推出/收回动作。这就是活塞0t的原理了,如果活塞在1gt内被更新两次,且两次充能状态不相同,就会有一次0t的推出/收回。若一个活塞动作过程中没有再次更新,则在3gt后从36号方块恢复。

  6.Lever

  拉杆不会被其他电路更新。当拉杆被拉下/拉起时,会立即更新自身状态,并依次更新自身方块和自身所附着方块的周围方块。

  7.Button Wood / Stone

  按钮基本与拉杆相同,但是被按下时会将自己加入NTE,以在一定时间后弹起。

  四、所有NTE电路元件的优先级与延迟。

  1.Pressure Plate Wood / Stone

  弹起延时20gt,优先级0

  2.Button Wood / Stone

  弹起延时木质30gt,石质20gt,优先级0

  3.Redstone Torch

  延迟2gt,优先级0

  4.Redstone Repeater

  延迟档数x2gt,若对着另一个中继器且方向不同,优先级-3,否则若已点亮,优先级-2,否则优先级-1.

  5.Redstone Comparator

  延迟2gt,若对着一个中继器且方向不同,优先级-1,否则优先级0.

  至此,下图的情况就很好解释了,中继器和比较器优先级不同,使活塞可以瞬间收回。

  五、对游戏内一些神奇的现象进行解释

  1.

  在最左边的投掷器放一个物品,拉下拉杆,物品会从最右边喷出来。图中每一列中继器的总延迟都是8t。

  整个电路太大了,我们只关注前两列中继器,其余以此类推。

  先给中继器编个号

  1、2、3

  4、5、6

  拉下拉杆后,1、4两个中继器进入NTE,先后顺序不可知。下一tick,4被NTE更新,将5加入NTE,再下一tick,1被NTE更新,将2加入NTE。所以在NTE列表中,5在2之前,所以虽然延迟相等,5比2先被NTE更新,使6比3先被NTE更新,所以下面的投掷器先发射。其余中继器也同理,使投掷器由下往上依次发射。

  2.

  大家都很熟悉的T触发,中继器可以完成,比较器就不行。

  拉杆拉下到第一个中继器的NTE更新,中继器更新了活塞和前方的中继器,活塞开始推出,前方中继器加入NTE。2gt后第二个中继器受到NTE更新亮起,检测到自己未被充能,再次加入NTE。2gt后第二个中继器熄灭,输出一段2gt长的信号。

  后方第一个中继器NTE更新,更新了活塞和比较器,比较器加入NTE。2gt后比较器NTE更新,检测到自己未被充能,不再亮起,无输出信号。

  3.

  一个十分常用的0t推出。

  拉下拉杆,红石更新了右方和上方活塞,加入PU列表。下一gt,PU列表更新,2活塞推出同时更新左边活塞。左边活塞检测到失去信号,开始收回,再次更新右方和上方两活塞。两活塞检测到失去信号,0t推出,开始收回,红石块更新左方活塞,左方活塞收到信号,0t收回,开始推出。左方活塞推出完毕,更新右方和上方两活塞,两活塞正常推出,整个过程结束。其中左边红石块和右边方块是0t推出,下方方块是0t收回。

  4.

  拉杆拉起,活塞收回的一瞬间,左方活塞会0t推出。

  拉杆拉起,红石线失去能量,更新上方活塞,上方活塞开始收回,此时红石块还未移动,石砖开始收回,下方红石线联通,左方活塞开始推出。右边上方活塞依次更新处于BUD态的下方两活塞,红石块开始收回,下方红石线失去能量,在同一gt内再次更新左方活塞,使左方活塞0t推出,开始收回。0t推出完成。

  5.

  如图,拉下上方拉杆,则下方红石灯提前亮,拉下下方拉杆,两红石灯同时亮。

  拉下上方拉杆,此时游戏主循环在处理网络部分,也就是1gt中最后的部分。拉杆激活红石线,中继器加入NTE,活塞加入PU。下一gt,活塞才开始推出,上方中继器加入NTE。下一gt,下方中继器NTE更新,下方红石灯亮起。再下一gt上方中继器NTE更新,上方红石灯亮起。总体情况是上方红石灯晚亮1gt。

  拉下下方拉杆,中继器NTE更新,激活红石线,下方中继器加入NTE。同一gt内活塞更新,红石块0t推出,上方中继器加入NTE。2gt之后,两红石灯在同一gt内亮起。

  PS:在此非常感谢topologycraft贴吧玩家Gamepiaynmo的分享。

  以上就是源码解读我的世界红石更新时序。更多精彩尽在游戏园我的世界专区。

  相关攻略推荐:

  我的世界EM的实验验证和源码解析

  我的世界1.8版本源码解析红石延迟理论

  1.8为什么无法通过1t负脉冲 关于中继器组bug源码解析

  我的世界训练属于自己的AI 微软将公开AI训练源码

热门搜索

手游排行榜

  • 最新排行
  • 最热排行
  • 评分最高