游戲刻-微時序分解入門

????????本專欄的內容是關于游戲刻的相對底層的內容,又是紅石玩家的必備知識,可以說是進階門檻,學習這部分知識可以比較清晰的理解世界運行原理,紅石延時分析,同時可以解釋大部分宏觀“玄學”問題。
????????首先我們來認識一下游戲在運行的時候是怎么樣的一個狀態(tài)。把游戲比作一部電影,電影在播放時我能能感覺人物的移動很自然流暢,但是我們知道電影也是一幀一幀播放的,每一幀人物都只變化了一點點,快速連起來才會看起來自然,游戲也是這樣,世界的運行也是類似一幀一幀的。游戲里的“一幀”,叫一游戲刻(Game Tick),也就是常說的gt。
????????如果游戲也像電影慢放那樣1gt1gt的流動,我們就能看見物體也是一段一段移動的。游戲中在變化的各個事物,并不是同時變化的,而是按順序逐個進行。比如在某一游戲刻,中繼器亮起,僵尸往前移動一厘米,活塞推出了,長出一棵樹,這些事件都是依次執(zhí)行的,如果有方法更細微的放慢時間,那會看見中繼器先亮起,接著僵尸再移動一厘米,再然后去執(zhí)行別的動作??偨Y一下就是,在每一個gt,所有事物都是依次執(zhí)行的。
????????游戲在每個gt都會按一定的順序執(zhí)行所有事件。為了方便理解,這里我將每一個游戲刻比作一個星期,我們肉眼看到的變化相當于上周到這周總共7天發(fā)生的變化,而變化在每天都有發(fā)生。我來通過紅石原件的激活來屢一下游戲在一星期里要做的事
????????● 周日,是玩家發(fā)號施令的日子,就像上帝一樣,一般會通過拉桿按鈕。
????????● 周一是中繼器的工作日,中繼器在接到命令時就會開始計劃在什么時候改變狀態(tài)
????????● 周三是活塞工作的日子,活塞需要連續(xù)工作3個工作日,也就是3個周三
????????● 周五是活塞交付成果并停機的日子。
????????用上面的理論,先來分析一下玩家用拉桿同時激活一個中繼器和一個活塞,如下圖。

????????● 第零周的周末,玩家拉下拉桿,命令中繼器和活塞工作,這時候中繼器那邊已經(jīng)收到命令,并且計劃兩周后亮起,也就是第二周的周一亮起。
????????● 第一周,周一,中繼器還在延遲中,所以沒動靜,到了周三,活塞開始工作。
????????● 第二周,周一,跟計劃的一樣,中繼器亮起來了,到了周三,活塞工期還沒結束,所以繼續(xù)工作。
????????● 第三周,周一中繼器無變化,周三活塞依舊在工作,但是干完今天就不用干了,到了周五,活塞把工作成果交付了,并徹底停下了工廠。
????????通過這個例子,我們就能發(fā)現(xiàn),在這種情況下中繼器延時2gt,活塞延時3gt。準確的說,從玩家拉下拉桿開始,中繼器到第二周周一結束,而活塞是到第三周周五。
?????? 第二個例子,用拉桿控制中繼器,中繼器再激活活塞。
??????

????????● 第零周的周末,玩家拉下拉桿,中繼器計劃兩周后亮起。
????????● 第一周,無事發(fā)生。
????????● 第二周,周一中繼器如約亮起來了,中繼器輸出的能量可以激活活塞,在周三,活塞就開始工作了。
????????● 第三周,周三活塞工作
????????● 第四周,周三活塞工作,周五活塞工作交付。
????????這里可以發(fā)現(xiàn)了一個問題,活塞的延時發(fā)生了一些變化,上一個例子中,活塞最終的延時是3gt,中繼器2gt,加起來一共是5gt,而在這個例子中,加起來總共卻是4gt。
發(fā)生這種變化的原因主要在于激活活塞的方式不同,如果由玩家通過拉桿激活,那么活塞要在下一周才會開始工作,而通過中繼器去激活活塞,周一中繼器亮起,周三活塞就被激活,相當于本周就開始工作。兩種不同的激活方式導致最終延時的偏差。
????????在游戲中,我們常用的游戲階段有以下幾個,按執(zhí)行順序排
????????● 計劃刻TT(Tile Tick):執(zhí)行大部分紅石原件,比如中繼器、比較器、偵測器、紅石火把、發(fā)射器、投擲器
????????● 隨機刻RT (Random Tick):植物生長,天氣現(xiàn)象
????????● 方塊時間BE(Block Event): 活塞推動和拉回的開始
????????● 實體EU(Entity Update): 玩家以外的實體
????????● 方塊實體TE(Tile Entity): 活塞運動正常停止,漏斗
????????● 玩家操作NU(Network Update):玩家相關的事件,破壞、放置、交互
????????用一星期的說法來講,就是在周二多了一個隨機刻,在周四多了一個實體運算,實際上游戲還有很多其他的階段,一周七天肯定是排不下的,因為用到得比較少不做展開。順便一提,紅石線是沒有延遲的,不管在什么階段激活都能瞬間亮起。
????????最后再用這套理論來解釋一個宏觀上的玄學例子。下圖的裝置,拉下拉桿活塞開始運動后,會短暫的釋放被壓線阻斷的紅石信號(移動中的方塊不壓線),鉆石塊活塞被這個信號直接激活,而金塊活塞需要經(jīng)過一個一檔中繼器。

????????結果是金塊活塞“失粘”了,直接激活的鉆石塊活塞把方塊拉了回來。

????????在分析這個問題前再補充一點知識,當粘性活塞正常推出時會在TE階段結束運動,如果信號提前消失了,則會立刻在最近的BE階段強制結束,并且出現(xiàn)“失粘”的現(xiàn)象。
????????● 第零游戲刻,玩家拉下拉桿。
????????● 第一游戲刻,BE階段活塞開始運動,粘液塊不再壓線,信號傳到了中繼器和鉆石塊活塞,鉆石塊活塞收到信號立刻開始運動,因為還在BE階段。中繼器計劃在第三游戲刻亮起,
????????● 第二游戲刻,中繼器延時中,鉆石塊活塞推動中,無事發(fā)生。
????????● 第三游戲刻,TT階段中繼器開始亮起,BE階段金塊活塞開始推出,到了TE階段另一個粘液塊已經(jīng)將紅石線壓斷,同時鉆石塊已經(jīng)推到位結束了,活塞在結束運動時會給自身一個更新,鉆石塊活塞發(fā)現(xiàn)信號消失,于是在下一個游戲刻的BE階段開始進行一個正常的收回,所以鉆石塊是能被粘回來的。由于紅石線又被壓線阻斷,中繼器又計劃在第五游戲刻TT階段熄滅。
????????● 第四游戲刻,中繼器延時中,無事發(fā)生。
????????● 第五游戲刻,TT階段中繼器熄滅,金塊活塞如果正常推出會在第五游戲刻的TE階段結束,然而信號在第五游戲刻的TT就消失了,這個時候就觸發(fā)了“失粘”。
????????我們一般常說長度2gt及以下的信號會讓粘性活塞“失粘”,上面的例子說明,“失粘”條件其實是活塞受到的信號沒能跨過3個BE階段。
?????? 本專欄主要內容已經(jīng)結束了,如果要熟練掌握時序的分析還需要平時多想多練習,如果你能完全理解本專欄的內容,可以再去fallen專欄更詳細地學習一下。
?????? 有問題可以在評論中提出,有勘誤或者建議也希望能留下你的聲音。
?????? 參考資料,fallen的專欄:CV4122124
?