最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

MCBE紅石系統(tǒng)運(yùn)行不完全分析(2)

2020-10-08 09:43 作者:hhhxiao_  | 我要投稿

紅石電路和有向圖

從原理上講,一個(gè)不增減原件的穩(wěn)定紅石系統(tǒng)的信號(hào)計(jì)算和更新等各方面的問題和紅石線一點(diǎn)關(guān)系都沒。為了弄清楚紅石電路到底長什么樣以及方便后面的分析,要先引入有向圖的概念。

有向圖就是把一些節(jié)點(diǎn)用箭頭連接起來,這些箭頭可以是雙向的,也可以是單向的。下圖就是一個(gè)簡單的有向圖,圖中圓圈叫做節(jié)點(diǎn),箭頭表示有向邊:


有向圖


具體到紅石電路上,我們用節(jié)點(diǎn)表紅石原件,比如紅石塊,比較器,活塞等等,用節(jié)點(diǎn)A指向B表示A是B的一個(gè)信號(hào)源(什么是信號(hào)源見專欄1),當(dāng)然我們也能定義有向邊A->B上的數(shù)字(上圖中是8)表示信號(hào)源A和紅石原件B之間的距離distance.

注意有向邊只是邏輯連接,和紅石線沒有任何關(guān)系

來看例子如圖的電路:

示例電路


可用轉(zhuǎn)換成這樣一個(gè)有向圖:

有向圖


然后這個(gè)電路就很清晰了,活塞有兩個(gè)信號(hào)源:紅石塊和拉桿,而且距離都是2。紅石燈沒有任何信號(hào)源,因此它的信號(hào)是0.這一堆紅石線有相同的信號(hào)源,也就是拉桿和紅石塊。在有向圖中紅石線沒啥用,因此下面就不畫了

題外話,MCBE中的紅石系統(tǒng)就是有向帶權(quán)圖,用鄰接表存的

紅石電路的關(guān)系構(gòu)建

紅石線唯一的作用就是體現(xiàn)在這里,在你放置紅石原件的時(shí)候游戲會(huì)搜索電路,給該原件加上信號(hào)源,反映在有向圖中就是在圖中畫一個(gè)圈,然后補(bǔ)上和這個(gè)圈有關(guān)的箭頭。經(jīng)常聽到的充能特性,連接特性或者激活特性就是體現(xiàn)在這個(gè)過程中。比如下面這個(gè)例子,左邊是弱充能,右邊是強(qiáng)充能,這在游戲內(nèi)部的區(qū)別是羊毛前方的紅石粉能否搜索到羊毛后面的信號(hào)源(左邊沒有,右邊能搜索到中繼器)的問題

強(qiáng)弱充能



至于如何搜索不是這里的重點(diǎn),不會(huì)真有人做電路要看信號(hào)源吧,不會(huì)吧不會(huì)吧(。(不過如果你真想可視化倒不是沒辦法,用我主頁的插件就能辦到了,啟用插件后用木棍右擊紅石原件你能看到一些你平時(shí)觀察不到的東西,包括信號(hào)源,信號(hào)強(qiáng)度等等)。

再談生產(chǎn)者電容器和消費(fèi)者

經(jīng)過上面的闡述,不難發(fā)現(xiàn):

  • 有些節(jié)點(diǎn)只有指向自己的箭頭,表現(xiàn)游戲中就是只能接受信號(hào),比如活塞,發(fā)射器等等,這在有些內(nèi)部有另一個(gè)名字叫消費(fèi)者(紅石線在一定成程度上也能叫消費(fèi)者);

  • 有些節(jié)點(diǎn)只有指向別的節(jié)點(diǎn)的箭頭,表現(xiàn)在游戲中只能輸出信號(hào),比如紅石塊,拉桿等等,這樣的原件叫生產(chǎn)者

  • 有些原件既有指向自己的箭頭也有指向別的節(jié)點(diǎn)的箭頭,表現(xiàn)在游戲中既能輸入又能輸出信號(hào),比如紅石火把,比較器,這樣的叫電容器

概括一下就是:整個(gè)紅石電路就是這樣一個(gè)帶權(quán)有向圖:紅石信號(hào)就是順著有向邊在各個(gè)節(jié)點(diǎn)之間流動(dòng),邊上的數(shù)值表示了這次流動(dòng)的能量損耗;有一些節(jié)點(diǎn)負(fù)責(zé)生產(chǎn)紅石信號(hào),有一些節(jié)點(diǎn)負(fù)責(zé)增強(qiáng),傳輸,延遲,周轉(zhuǎn),存儲(chǔ)紅石信號(hào),還有一些原件只負(fù)責(zé)對(duì)紅石信號(hào)進(jìn)行響應(yīng)。有點(diǎn)計(jì)算機(jī)系統(tǒng)的味道了(霧).

紅石電路的抽象表示


單gt內(nèi)的游戲運(yùn)行流程

如下圖是MCBE單gt內(nèi)的更新順序表

單gt內(nèi)的游戲運(yùn)行流程


這里主要強(qiáng)調(diào)下面幾個(gè)點(diǎn):

  • 到8游戲刻才+1,在分析紅石的時(shí)候可把9作為1gt的起點(diǎn),24看作終點(diǎn),因?yàn)?-8不影響紅石運(yùn)行

然后說幾個(gè)和紅石有關(guān)的事件:

  • 12 這里是計(jì)劃刻的執(zhí)行,具體干啥可用看我以前的專欄,這里是觀察者更新信號(hào)的地方和按鈕,壓力板更新內(nèi)部計(jì)時(shí)器的地方,這也就是說如果你讓該區(qū)塊出現(xiàn)更新延遲會(huì)導(dǎo)致按鈕的信號(hào)持續(xù)時(shí)間增長

  • 14 是方塊實(shí)體更新(或者叫響應(yīng)紅石信號(hào))的時(shí)候,也就是活塞,發(fā)射器,投擲器,漏斗以及移動(dòng)方塊實(shí)體(MovingBlock)等更新的時(shí)候

  • 15 這里是非方塊實(shí)體響應(yīng)紅石信號(hào)的地方,包括紅石線和紅石燈的渲染,門,陷阱門的開關(guān)動(dòng)畫

  • 17是檢測(cè)玩家行為的地方(這里還有待確定),也就是玩家和世界交互的檢測(cè)在這里,比如你拉動(dòng)了拉桿,到這個(gè)時(shí)候拉桿的信號(hào)才會(huì)被置為15.

  • 22 - 24 是紅石系統(tǒng)信號(hào)更新的三個(gè)階段,這個(gè)階段是每個(gè)紅石刻才執(zhí)行的,上篇專欄講的就是這里,下面會(huì)更詳細(xì)地說一遍。

紅石信號(hào)的計(jì)算

在前面了解紅石電路的構(gòu)成后你自己都能猜到為什么mojang要設(shè)計(jì)這樣的計(jì)算方式:

生產(chǎn)者和消費(fèi)者是只有輸入或者只有輸出,所以直接計(jì)算并設(shè)置即可,但是電容器不一樣(說句題外話,紅石電路從某種意義來講更像是一個(gè)狀態(tài)機(jī)),因?yàn)楦鱾€(gè)電容器之間的信號(hào)計(jì)算是沒有固定順序的,如果你直接計(jì)算并設(shè)置值,會(huì)導(dǎo)致有些電容的狀態(tài)是根據(jù)前1gt的值計(jì)算的,而有些電容器可能是根據(jù)被更新后的電容器來計(jì)算的,這樣就亂套了。

于是mojang把整個(gè)電路的信號(hào)更新分為兩個(gè)步驟,每個(gè)原件有1-2個(gè)(其實(shí)mojang還有一個(gè)鎖檢查的步驟,這是專門為中繼器設(shè)計(jì)的,這里不是重點(diǎn)就不說了):

  • 第一個(gè)叫計(jì)算并設(shè)置信號(hào)(evaluate)

  • 第二個(gè)叫計(jì)算新信號(hào)并暫存(cacheValues)

根據(jù)上面的分析,很容易知道每gt消費(fèi)者和生產(chǎn)者只有evaluate過程,而電容器兩者都有,而實(shí)際上mojang也是這么做的.

嚴(yán)格的順序是這樣的:

  1. 電容器和紅石線cacheValues

  2. 電容器和生產(chǎn)者evaluate(電容器的evaluate()只有設(shè)置無計(jì)算,前面計(jì)算過了)

  3. 消費(fèi)者和紅石線cachevalue

這個(gè)順序也導(dǎo)致了零延遲電容器的產(chǎn)生。

一次不含電容器的信號(hào)分析

這里主要為了說清楚玩家交互以及各個(gè)消費(fèi)者的啟動(dòng)延遲問題

先上電路:

示例電路


單步運(yùn)行的截圖就不放了,太占地方,下面放一個(gè)單gt的示意圖:

注: 藍(lán)色的是紅石刻,白色是普通刻

微時(shí)序分析


注:

  1. 4中有兩個(gè)不同的事件,MB變成紅石塊在階段14完成的,紅石線的計(jì)算是22完成的,所以這里可以同1gt完成這兩個(gè)事件

  2. 上圖也說明了活塞的半伸出狀態(tài)一定是在紅石刻,其它有些現(xiàn)象也同理,這個(gè)圖并不會(huì)出現(xiàn)向左或者向右偏移1gt的情況

上面的圖已經(jīng)很清晰了說明了各個(gè)原件的延時(shí)情況

電容器的零延遲

這個(gè)現(xiàn)象在上一個(gè)專欄已經(jīng)講過了就不細(xì)說了,具體的各種電路延遲分析不是這里的重點(diǎn),以后有機(jī)會(huì)再細(xì)說

燒火把,半脈沖和消費(fèi)者特判

火把是萬惡之源

火把不是單純的火把,而是一個(gè)有眾多參數(shù)和特判的電容器。

火把常規(guī)更新

火把新值的計(jì)算方法有點(diǎn)與眾不同,因此它的信號(hào)源永遠(yuǎn)是它所附著的方塊,如果它附著的不是紅石塊的時(shí)候,用來參與max(signal- distance)計(jì)算的不是它的直接信號(hào)源,而是它的信號(hào)源的信號(hào)源,也就是它附著的方塊的源,這很合理,比如下面的電路:


示例火把電路


這里火把唯一信號(hào)源是羊毛,而羊毛唯一的信號(hào)源是中繼器,因此火把計(jì)算信號(hào)是把中繼器作為信號(hào)來進(jìn)行計(jì)算的,當(dāng)它檢測(cè)到源的源為它提供的信號(hào)的最大值大于0的時(shí)候它就把自己反向,然后重置自己的燃燒值(燃燒值就是火把內(nèi)部的一個(gè)參數(shù),默認(rèn)是0)。

火把電路對(duì)應(yīng)的有向圖



說真的這很合理,那么關(guān)鍵來了。

燒火把特判

既然火把是電容器,那么它的源的源有沒有可能是自己呢?答案是完全有可能,這就要請(qǐng)出來著名的燒火把電路和對(duì)比電路了:

會(huì)"燒火把"的電路
不會(huì)"燒"火把的電路


再來看看這倆的有向圖:

有向圖


左圖中火把的信號(hào)源的信號(hào)源是它自己,右圖中火把1的信號(hào)源的信號(hào)源是它自己和火把2,而2同1.那么問題來了,為什么左邊會(huì)燒而右邊不會(huì)燒呢?

mojang給下面描述的電路做了一個(gè)特判:

  • 火把有一到多個(gè)信號(hào)源的信號(hào)源

  • 給火把提供最大信號(hào)的原件是它自己

mojang把這樣的火把信號(hào)叫做halfPulse,這里暫時(shí)用半脈沖表示

在圖1中,當(dāng)火把1只有一個(gè)源的源,因此為它提供信號(hào)的肯定是它自己,因此這個(gè)火把就被判定為半脈沖,等下1rt再次計(jì)算的時(shí)候還是同理,它會(huì)一直被判定為半脈沖電路。而圖二就不一樣了,給火把1提供最大信號(hào)的源的源交替地是1和2(實(shí)測(cè)這倆個(gè)火把是交替亮滅的,其它玄學(xué)情況未遇到)2同理,因此這個(gè)電路的火把會(huì)被判定為每間隔1rt產(chǎn)生一次半脈沖

半脈沖帶來了不少特性:

如果該火把是半脈沖的就會(huì)把自己的燃燒值+1,加到16就時(shí)鐘變成熄滅狀態(tài),再也不響應(yīng)外界信號(hào)了,這就是熟知的燒火把現(xiàn)象。

如果不是半脈沖就把燃燒值清零。因此圖2的火把的燃燒值就一直在0和1之間跳動(dòng),不會(huì)燒火火把。

如果mojang在代碼里面求最大源的源的時(shí)候把<= 改成< ,那么燒火把電路就不復(fù)存在了,由此可見這是mj的有意為之

消費(fèi)者對(duì)半脈沖的響應(yīng)

你以為燒火把這就完了嗎?其實(shí)并沒有,這個(gè)半脈沖也不是啥都沒用,在游戲中mojang給下面五個(gè)紅石原件做了半脈沖的特殊處理:

  • 陷阱門

  • 發(fā)射器

  • 投擲器

  • 頭顱

如果不做特判,按照原有的邏輯,半脈沖根本沒啥用,他和普通2rt脈沖一樣能讓所有原件鬼畜,但是Mojang又又又又做特判了:

如果收到半脈沖的消費(fèi)者不是上面五種,就強(qiáng)行讓它們的信號(hào)源的信號(hào)恒為15,從而達(dá)到常激活的目的,但是紅石線沒這個(gè)特判,因此你能正??吹郊t石線的閃爍但是看不到燈的閃爍和活塞的推拉,就如下面的電路所示,上方的幾個(gè)原件沒做特判,信號(hào)強(qiáng)行設(shè)置15-距離,根部不考慮信號(hào)源的的強(qiáng)度,因此常激活了,但是下面四個(gè)特判的原件是正常的。


觀察者臉對(duì)臉不是半脈沖,燈常亮是燈的特性,燈內(nèi)部還是有0-x的信號(hào)交替的

目前能找到的半脈沖電路只有上述的那一個(gè),如果你不用這個(gè)電路,那這些特性也就不復(fù)存在了。

縱觀火把的行為,我不得不懷疑Mojang是吃多了多此一舉還是另有隱情。但能確定的是上面的分析并不是火把的全貌,因?yàn)榻?jīng)過各種測(cè)試沒找到另一部分的代碼的執(zhí)行時(shí)機(jī),也就沒法分析,因此絕大多數(shù)情況下上面的特性是足夠的

未完待續(xù)。

MCBE紅石系統(tǒng)運(yùn)行不完全分析(2)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
孝感市| 察隅县| 柞水县| 遂平县| 定陶县| 科技| 望城县| 宣城市| 朔州市| 合江县| 正镶白旗| 肇东市| 古田县| 清镇市| 山西省| 错那县| 巴塘县| 阿克苏市| 万荣县| 修文县| 洪湖市| 油尖旺区| 从化市| 壤塘县| 锦屏县| 页游| 丹江口市| 延寿县| 基隆市| 商丘市| 区。| 太和县| 汝城县| 榆林市| 庆元县| 清丰县| 衡山县| 天柱县| 通渭县| 米脂县| 历史|