MCBE紅石系統(tǒng)運行不完全分析(1)
前言
MCBE的紅石系統(tǒng)已經(jīng)出了五年了,在此之后出現(xiàn)了很多優(yōu)秀的玩家和優(yōu)秀作品,在眾多玩家的努力之下也產(chǎn)生了一個十分完善的基于實踐和經(jīng)驗的理論體系。但是遺憾的是純理論的源碼級的分析還幾乎是空白。在這篇專欄(系列)中我嘗試著填補空白,盡量完成這一工作,并隨時棄坑。
有一說一,我自己連33門都不會做,所以這篇專欄幾乎可以說出自云玩家之 手,請謹慎觀看(
預備知識:
了解最基本的紅石原件的基本功能
紅石原件分類
在游戲內(nèi)部,紅石原件的分類是這樣一個樹形結(jié)構(gòu),這也是整個紅石系統(tǒng)運行的基礎(chǔ),詳細信息見表。
BaseCircuitComponent ? ? ? CSSC
BaseRailTransporter ? ?MCPR ?
ProducerComponent
? ? ? ?CapacitorComponent ? CSCA
? ? ? ? ? ?ComparatorCapacitor
? ? ? ? ? ?PulseCapacitor
? ? ? ? ? ?RedstoneTorchCapacitor
ConsumerComponent ? ?CSCC
?PistonConsumer
PoweredBlockComponent ? CSPB
ProducerComponent ? ? ?CSPC
TransporterComponent ? CSTR
看不懂英語不用管,看下面的幾條就行了:
producer就是自身發(fā)出信號的(比如紅石塊,拉桿等),下稱生產(chǎn)者
capacitor就是比較器中繼器火把和觀察者
transporter就是紅石線(傳遞信號)
cunsumer就是接受信號的,比如活塞,發(fā)射器等等,下面統(tǒng)稱為消費者
鐵軌?鐵軌是啥
紅石原件的信號源(Source)
信號源
這里先要給出一個概念叫做信號源,說白了就是給該原件提供紅石能量的原件。我們來看個例子:

給比較器提供能量的是紅石塊和火把,所以它有兩個信號源也就是右邊的火把和紅石線。
給中繼器提供的能量的是比較器,所以它的源就是中間的比較器
同理紅石燈和紅石燈右邊的紅石線的信號源是中繼器
注意
紅石線不會作為信號源,因為它只能傳遞能量不產(chǎn)生能量
生產(chǎn)者本身就能提供能量,所以它沒信號源
距離
游戲中每個原件都維護著它自己的所有信號源以及和該信號源的距離
紅石信號強度的計算
這個算法其實非常簡單:
首先計算每個信號源為自己提供的信號強度 strength =sourceStrength - distance
,說白了就是用信號源的信號強度減去信號源和自己的距離。然后從所有信號源提供的信號強度中選擇最強的信號作為自己的信號(當然如果這個信號是負數(shù)就取0了)。來看個簡單的例子:

綠色方塊上方的紅石線有兩個信號源,它和左上方的紅石塊的距離是3,所以該紅石塊為它提供的信號強度就是12,而左下側(cè)的紅石塊的距離是1,提供的信號強度是15 - 1 = 14.最后該紅石線的信號強度就是max(12,14) = 14.
開胃小菜完成了后面就是稍微硬核的gt級別的微時序分分析了(
信號更新過程
紅石刻
看圖說話如下圖是游戲的運行,一個方格是1gt,我們把紅色的gt稱之為紅石刻,白色的暫時叫做普通刻。。在這樣的gt是會更新紅石信號的。兩個紅石刻之間的間隔也叫紅石刻(redstone tick,rt),易得1rt = 2gt = 0.1s

信號的更新方式
原件有兩種更新方式:
先根據(jù)當前電路狀態(tài)計算出所有的信號值稍后再一起更新,暫時叫做緩存更新吧
立即更新,算出來值就馬上更新了
capacitor(比較器,中繼器,火把)和紅石線是緩存更新的,其它的諸如生產(chǎn)者和消費者都是立即更新的。
1rt做了什么
在游戲內(nèi)關(guān)于紅石的1rt做的事情說多其實也不多,一共就下面三件事情(按照順序):
根據(jù)當前電路狀態(tài)(也就是上一個rt的電路)計算capacitor和紅石線的信號,怎么計算也就是上面的算法(max(信號值 - 距離))。注意因為這幾個是緩存更新的,因此算出來的新值其實是存起來了,原件的實際信號并沒有進行更新。
計算和設(shè)置capacitor和和生產(chǎn)者的信號,到這一步才把capacitor的實際值進行更新(當前值 = 新值即可)。對于生產(chǎn)者沒啥說的,是多少就多少,比如上1gt你拉了拉桿,到這時候就會把拉桿的值更新為15.
更新紅石線和消費者的信號。對于紅石線也是(當前值 = 新值),而對于消費者就是當前值設(shè)置為max(信號值 - 距離)。
為方便理解來舉個例子:

拉下拉桿后拉桿的信號立即變?yōu)?5(這個和紅石系統(tǒng)無關(guān)):
然后等到下一個紅石刻開始:
兩根紅石線和中繼器的唯一信號源都是拉桿,然后他們就根據(jù)拉桿計算新值,這個值分別是14,15,14,但是這時候這三個器件的信號都還是0(因為新值緩存了沒更新)
下一個行為拉桿信號還是15無事發(fā)生,這時候中繼器新值和舊值同步了,它的信號變成了15(中繼器雖然有延時,但是這個信號是立即更新的)
再到下一個行為,紅石線同步自己的新舊值從0變到14和15;綠燈的唯一信號源是15,距離是1,因此它的信號從0變成15-1 = 14(注意這個值和與他連的紅石線沒啥關(guān)系),藍燈的唯一信號源是中繼器,它和中繼器的距離為0,因此信號更新為15 - 0 = 15
然后這一rt結(jié)束了,等到下一個gt紅石線和兩個燈同時亮起(這個渲染細節(jié)和紅石系統(tǒng)無關(guān))。
???
你可能會疑惑為什么兩個燈同時亮了,又或者你覺得中繼器是有延時的,不會立即更新信號。但是事實就是如此。這個現(xiàn)象是由更新順序和信號計算計算共同決定的。
再來做個簡單練習,分析一下拉下拉桿后的所有原件的信號變化:
