切換
舊版
前往
大廳
主題

【雪色】【指令】真正的「超頻執行指令」已經可以在Minecraft中實現!

雪色 | 2017-11-09 20:28:43 | 巴幣 4 | 人氣 1014




Function (函數) 做出超頻執行:
先設置一個.mcfunction檔案為command,路徑在main下,
並在該function內輸入以下指令:
function main:command
最後你會得到一個結果為:
已從main:command中執行 (數字) 個指令
而且數字的值會與規則maxCommandChainLength(執行一次指令的最大連鎖執行次數)相同
這意味著這一條指令導致重複循環此function直到連鎖執行上限值(無限循環執行)
Minecraft中使用maxCommandChainLength規則即是防止這種無限次數超頻的發生,
   否則將會導致瞬間執行指令數量過大而崩潰

原理:
如果在一連串指令中有一條/function指令時,
則此function執行過一遍後才會繼續執行下一個連接的指令

假設有1個.mcfunction檔案為say,路徑在chat下
並在該function內輸入以下指令
say chat 1
say chat 2

以及執行以下的指令(由上往下執行)
say hello
say this's test
function chat:say
say run function
say end
輸出結果為:
[@] hello
[@] this's test
[@] chat 1
[@] chat 2

[@] run function
[@] end



超頻執行的應用:
你可以把超頻執行用在執行「多數」重複性指令使用,
超頻執行重複的指令上並沒有連鎖指令方塊串執行重複的指令順暢,
因為輸出量會比連鎖指令方塊來的大,是一個有風險性的應用

連鎖指令在執行重複的指令缺點上是會有「上限次數」的限制,
而且沒有程式輔助要排列非常多條重複的指令時會非常麻煩
比起超頻執行指令來講輸出量和資源消耗量相對地比較小

相對的超頻執行在執行重複的指令狹義上來講是「無限次數」
但廣義上來講會被規則maxCommandChainLength所限制次數(如int值的最大上限一般)
比起連鎖指令方塊來說輸出量和資源消耗量相對地比較大,但可以控制執行次數和容易重編指令


在下面舉一個簡單的小例子:
首先執行以下的指令:
scoreboard objectives add times dummy
scoreboard players set @p times 100
function main:summon
1.創建times記分板且類別為dummy
2.讓最近玩家的times分數設定為100
3.執行function路徑:main:summon的指令

以下指令為main:summon的指令文本內容:
execute @p[score_times_min=1] ~ ~ ~ summon pig ~ ~ ~
scoreboard players remove @p times 1
function main:summon if @p[score_times_min=1]
1.從最近玩家的times分數大於1者的身上生出一隻豬
2.減少1分最近玩家的times分數
3.如果最近玩家分數times大於1時,執行執行function路徑:main:summon的指令

他會一直持續循環main:summon中指令直到times分數從100被持續減1減至0時停止循環,
同時也使生成豬的指令被執行100次



超頻執行的指令輸出次數計算:
(在此先感謝貓狗喵的提醒)
超頻執行中因為被規則maxCommandChainLength限制次數的關係,
所以控制指令執行次數也是一個很重要的一環

先令規則maxCommandChainLength為300
執行一個function:test:fun,內含的指令如下:
say 1
say 1
function test:fun
已經將公式化減後得重複性指令被執行次數為:
[(被重複執行的指令ex./say 1)/(function內總指令數+1)] * (maxCommandChainLength值)
而上方的指令「say 1」被執行次數即為:[2/(3+1)]* 300 = 150
(這會是用於被maxCommandChainLength限制次數時的執行重複性指令次數計算公式)


???那麼這個公式是如何推導出來的???

在這裡先舉一個例子,
假設有一個函數檔案為load:A,其中有10條可被執行的有效指令,
再設有另一個函數檔案為load:B,指令內容如下
say 1
function load:A
則當使用/function load:B這條指令時,會從load:B執行出「13條」指令

》接著你一定會想問:2+10不是12嗎? 為什麼是13?

這是一項使用/function指令時所訂出的一個計算執行次數上的特殊規則:
1.從次數結果「由load:B執行了13條指令」可以知道一開始使用/function load:B指令並不計為
    執行一次執行,而是由load:B裡的第一條指令才開始計次
2.如果函數檔案內有執行函數檔案的指令(/function)時,計算該/function指令的次數輸出為
    該函數檔案內的指令條數 + 1(執行/function時會額外輸出一次執行次數)
》以下是我針對第二點的特殊執行次數的分析(純屬個人意見,可能與事實不合):
執行function指令等同在叫出另一個檔案,
所以必須先回到計算機(電腦)去尋找到另一個檔案後開啟,
而尋找另一個檔案就視同於再執行一次命令,
因此使得指令執行次數被額外計算一次。
(如果我的分析有錯誤麻煩留言讓我知道,因為我也蠻想知道這個特殊的計算原理)



創作回應

追蹤 創作集

作者相關創作

更多創作