【まるきの】のブログ

(自分のメモ)フェーズまとめ

(この記事は自分のメモなので解説は超雑です)

ゲームティックのフェーズ(Phases)について


(1)Command Function Phase(独立しているフェーズ)

(2)World Time Sync Phase

(3)World Border Phase

(4)Weather Phase

(5)World Time Phase

(6)Block Tick Phase

(7)Fluid Tick Phase

(6と7を合わせてTile Tick Phaseともいう)

(8)Raid Phase

(9)Chunk Logic Phase

(10)Block Change Sync Phase

(11)Entity Tracker Phase

(12)Block Event Phase

(13)Dragon Fight Phase

(14)Entity Phase

(15)Tile Entity Phase

(16)Entity Management Phase

(17)Player Entity Phase(独立しているフェーズ)

(18)Console Phase(独立しているフェーズ)

(19)Auto Save Phase(独立しているフェーズ)

(20)Player Action(input) Phase(独立しているフェーズ)

 

(1)Command Function Phase

functionとデータパックを実行するフェーズ。

このフェーズは独立している(他のフェーズとの関連性がない)。


(2)World Time Sync Phase

ワールドタイムをクライアント側と同期するフェーズ。


(3)World Border Phase

ワールドボーダーのサイズを変更する必要があるかを確認し、あるならサイズ変更するフェーズ。


(4)Weather Phase

天気を更新するフェーズ。

様々な複雑な処理が行われているが割愛。

プレイヤーの睡眠に関する処理もここで行われている。


(5)World Time Phase

ワールドタイムとデイタイム(day time)を1増やすフェーズ。

World Time PhaseなどはなくWeather Phaseにこれらの処理が行われているのでは?という人もいる(私はWorld Time Phaseの存在を信じてるので書いた)。


(6)Block Tick Phaseと(7)Fluid Tick Phase

これらのフェーズを合わせてTile Tickフェーズと言われている。

主にスケジュールの更新と実行がされる。


(8)Raid Phase

襲撃関係の処理をするフェーズ。


(9)Chunk Logic Phase

・チャンクレベルの更新

・チケットの発行、失効

・mobの自然スポーン

・スポナーからのmobのスポーン

・ランダムティック(スケルトンホースのスポーン、雪と氷の生成、サブチャンクからブロックの選定)

・プレイヤーの動き

(↑これらを合わせてチャンクティックと言われている)

・チャンクのアンロードetc…

これらの処理を行うフェーズ。

Chunk Logicは1.17以前(多分)ではWorld Time Phaseの後にあった。


(10)Block Chang Sync Phase

チャンク内で変更されたブロックをクライアント側に同期するフェーズ。


(11)Entity Tracker Phase

エンティティの更新をクライアント側に同期するフェーズ。


(12)Block Event Phase

ブロックイベントを実行するフェーズ。

※ブロックイベント:gtを跨いで処理されるもの

例:ピストン、シュルカーボックスの開閉アニメーション、ベル、音符ブロックの音etc…


(13)Dragon Fight Phase

エンダードラゴンとの戦闘に関する処理…?

(あまり知らない)


(14)Entity Phase

エンティティを処理するフェーズ。

例:防具立て、アイテム、モブetc…


(15)Tile Entity Phase

複雑なデータを持つブロックを処理するフェーズ。

例:チェスト系、看板、旗、ピストンが押してる間のブロックetc…


(16)Entity Management Phase

チャンクのロード、アンロードによるエンティティのロード、アンロードを処理するフェーズ。


(17)Player Entity Phase

プレイヤーのエンティティを処理するフェーズ。

このフェーズは独立している。


(18)Console Phase

ログなどを書き込むフェーズ。

このフェーズは独立している。


(19)Auto Save Phase

ワールドの自動保存を行うフェーズ。

このフェーズは独立している。


(20)Player Action(input) Phase

プレイヤーからの入力を処理するフェーズ

例:ブロックの破壊、設置、ボタンやレバーをオンにするetc…

このフェーズは独立している。


(21?)Instantaneous

どのフェーズでも動作することのできるブロック。

代表例はレッドストーンダストとパワードレール&アクティベーターレール。

他にもオンになる時はinstantaneousだが、オフになる時はスケジュールで動作するブロックや、更新を伝えるのはinstantaneousだが、機能するのは特定フェーズみたいなブロックもある。

【マイクラ回路】準接続とBUDの解説

皆さんどうもこんにちは!

今回も回路の解説をしていきます!

今回解説していくのは準接続とBUDについてです!

BUD回路というのは聞いたことがある方がほとんどかと思いますが、準接続というのを聞いたことがある人は少ないんじゃないでしょうか…?

そんな準接続ですが、BUD回路というのは1部特殊なものを除いて基本的に、準接続というものを利用して成り立つ回路になります!

今回はそんな準接続とは何なのかというのを含めて、BUD回路について解説していこうかなと思います!

 

【準接続】

まずピストンは以下のガラスで囲まれてる範囲に動力源があれば動作します!

正面のヘッド部分以外のピストンに隣接するところですね!

f:id:marukino_MC:20231008105300j:image

ではこの位置に動力源があればどうでしょうか?

f:id:marukino_MC:20231029142348j:image

当然ですが動作することは出来ません。

しかし、なんとピストンの後ろにガラスを設置すると動作してしまいました!

f:id:marukino_MC:20231029142415j:image

ガラスは設置しても動力を発する訳では無いのに何故か動作してしまいました…

これを準接続といいます!

具体的には以下の画像のガラスの位置に動力源があった場合、ピストンにブロック更新を与えるとピストンが動作します!

f:id:marukino_MC:20231008105834j:image

ちなみにこれはjava版にしかないバグで、mojangが回路の幅が広がる!と思い、ずっと修正されていないものです。

準接続はレッドストーンランプとかは持っていなく、ピストンやドロッパー、ディスペンサーなどのみが持っています!

これで準接続の解説は終わりです!

 

【BUD(Block update detector)】

BUD(Block update detector)というのは名前の通り、ブロック更新を検出する装置です。

先程準接続で、ピストンの斜め上とかに動力源があった場合、"ブロック更新"を与えれば動作するといいました!

この性質を利用して、ピストンに準接続が発生する位置に動力を置いて、ピストンにブロック更新が与えられて伸びたら動力を消してピストンにブロック更新を送る、ピストンが縮んだら再び動力を与える。

こうすることで自動でブロック更新を検知する装置を作ることができます!

これがBUDです!

言葉で説明されても想像しにくいと思うので、実際のBUD回路を見て動作を見てみましょう!

今回は↓のBUD回路の動作原理を見ていきます!

f:id:marukino_MC:20231021112414j:image

まず、ピストンの斜め上には動力があるので、この状態でピストンにブロック更新を送ればピストンが動きます!

f:id:marukino_MC:20231021112607j:image

ブロック更新が与えられてピストンが動くと、レッドストーンブロックから受け取っていた動力が消えて、ピストンが縮みます!

ピストンが縮むとまたレッドストーンブロックから動力が与えられて準接続の配置になります。

これがBUD回路の動作原理です!

 

準接続とBUD回路を使えこなせるようになれば、ものすごく回路の幅が広がるのでぜひ色々回路作ってみてください!

【マイクラ回路】Tile Tickの解説

皆さんどうもこんにちは!

今回から本格的に回路を組む上で必要な知識を解説していきます!

今回解説していくのはTile Tickについてです!

Tile Tickは主に回路系アイテムの遅延を実現したり、動作順を決定するために存在しています!

 Tile Tickには「スケジュール」「方角依存」「優先度」の3つの要素があります!

今回はこの3つを詳しく解説していきます!

 

【スケジュール】

スケジュールは回路系アイテムの遅延や水や溶岩の流れなどを実現するために存在しています。

回路系アイテムはレバーなどで特殊なブロック更新を受け取るとスケジュールを作成し、そのスケジュールの内容によって動作します。

少し細かく言うなら、スケジュールはタイマーみたいになっており、1ゲームティック(具体的にはtile tickフェーズ)ごとに何ゲームティック後に動作するかの値が減っていきます。

(厳密にはちょっと違いますが、ちゃんと話そうとするとworld timeというものの解説も必要になってものすごく長くなるのでこういうイメージで大丈夫です!)

こんなこと言われても何言ってるか分からない人がほとんどだと思うので具体例を出して見ていきましょう!

まずはリピーター

1遅延のリピーターは信号とブロック更新が与えられると2ゲームティック後にオンにするようにスケジュールします。

そして毎gtごとに何ゲームティックごとにオンにするという値が現象していき、その値が0になった時にオンになります。

次はコンパレーター

コンパレーターも信号とブロック更新を受け取るとスケジュールを作成するのですが、少しリピーターとはスケジュールの内容が違います。

どんな内容かと言うと、信号を受け取ると2gt後に背面と左右の信号強度を計算して出力するというものです。

減算モードがわかりやすいのでそれで見ていくと、

例えば右からの信号強度が5で背面からの信号強度が8だった場合、スケジュールを受け取ってから2gt後に8-5の値を出力するということです。

最後にオブザーバー

オブザーバーは観察面でブロックの変化(オブザーバーアップデート)が起こると2gt後にオンにするというスケジュールを作成します。

ここまではリピーターと同じなのですが、スケジュールが実行された後がリピーターとはちょっと違っていて、オブザーバーはオンスケジュールが実行された後、自身に2gt後にオフになるようにスケジュールを作成します。

つまりは、観察面で変化が起きる→2gt後に動作するようにスケジュール→スケジュール実行!→オフになるようにスケジュール

こんな風になっています!

 

ここまではスケジュールの内容について解説してきました!

次はスケジュールの例外(スケジュールが作成出来ない状態や作成されない状態)について解説していきます!

これはすごく単純で、まずスケジュールは1つしか作成することが出来ません!

なので例えば、リピーターが前にあるレバーを1gt間に100回オンオフ繰り返しても、リピーターが作成するスケジュールは1つだけです。

そしてスケジュールは作成しなくても問題ない場合には作成しません。

具体的には減算モードのコンパレーターが挙げられ、減算モードのコンパレーターは左右からの方が信号強度が高い場合は絶対に出力される信号強度は0です。

つまり背面からの信号強度が0、もしくは左右からの信号強度が15の場合は何をしても出力される信号強度は0なのでこの場合はスケジュールを作成しません。

 

これでスケジュールの解説は終わりです!

結構難しい内容ではあるので理解出来なかった人は何回も読み直して頑張って理解してください!()

次は方角依存の解説です↓

 

【方角依存】

問題です!

ボタンを押した時、どちらのピストンが先に動くでしょうか!!

ヒント:向いている方角は東

f:id:marukino_MC:20231001211945j:image

正解は右側でした!

ちなみにこれはjava版だと絶対にこういう結果になります!

ではなぜこういう結果になるのかを解説します!

ピストンにはリピーターが繋がっていてそのリピーターの信号からピストンが動くため、リピーターの動作順=ピストンの動作順という風になっています!

そして左側のピストンは信号を与えている不透過ブロックの北側(-Z方向)から信号を受け取っており、右側のピストンは直接東側(+X方向)から信号を受け取っています!

そしてここからが重要なのですが、ブロック更新を伝える順番は1部例外を除き基本的に、

-X→+X→-Y→+Y→-Z→+Z

の順に伝えていきます!

これを先程の例に当てはめると左側(-Z方向)、右側(+X方向)なので右側の方が先に動くということです!

 

これで方角依存の解説は終わりです!

これも結構難しいものになるので、実際に確かめてみたりして頑張って理解してください!(?)

次は優先度の解説です↓

 

【優先度】

問題です!

ボタンを押した時、内部的にはどの順番で動作するでしょうか!

f:id:marukino_MC:20231001213144j:image

正解は右から順に1→2→3→4→5→6→7の順番で動作するでした!

リピーターもコンパレーターも遅延は同じなのになぜこのような風になるのでしょうか…

これは優先度というものによって決まっています!

回路系アイテムには全て優先度が決まっていてその優先度が低ければ低いほど先に動作します!

ほぼ全ての回路系アイテムの優先度は0です。

リピーターとコンパレーターが少し特殊というようになっています。

リピーターは信号がオフ状態の時は-1、オン状態の時は-2の優先度を持っています。

さらにリピーターの前に別のリピーターかコンパレーターがあれば-3の優先度になります。

コンパレーターは基本的には0の優先度になっていますが、前に別のコンパレーターかリピーターがあれば-1の優先度になります!

これを先程の画像に当てはめれば右から順番に処理されることが分かります!

できない人は多分優先度を足し算して見ようとしてます(自分が優先度を理解出来てない時はそうしてた)。

そうではなくて、リピーターを1、コンパレーターを0として、出力側から1の方が先と考えて辞書順に見ていくと判断できます!

 

これでTile Tickの解説は以上です!

Tile Tickは理解しないと回路の動作に疑問を持ったり、無駄な回路を作ってしまうことがあるので絶対に理解しておきたい要素です!

その分結構難しい部分はありますが、落ち着いて考えてみると案外簡単なので頑張って理解してください!(?)

それでは次の記事でお会いしましょう!

 

【マイクラ回路】チャンクロジックの解説

皆さんどうもこんにちは!

今回からMinecraftの回路について色々と話していこうかなと思います!

今回紹介するのはチャンクロジック(Chunk logic)についてです!

Minecraftの世界が16×16のチャンクという空間に区切られていて、そのチャンク事に世界が読み込まれているというのは皆さんご存知かと思いますが、チャンクを読み込むというだけでも様々な処理が行われています!

今回はそんなチャンクについて詳しく解説していこうかなと思います!

 

【読み込みレベル】

チャンクには読み込みレベルという概念が存在していて、その読み込みレベルによって何が読み込まれているのかが違います。

読み込みレベルは数値によって表され、何もいじっていないバニラMinecraftでは22~44の値で発生します。

そしてこの読み込みレベルが低ければ低いほど沢山のものが読み込まれているという風になっています。

ちなみに読み込みレベル22の状態はスポーンチャンクでしか起こりません。

 

読み込みレベルが31以下のチャンクはEntity tickingと呼ばれ、全てのものが読み込まれています。

読み込みレベルが32のチャンクはTickingと呼ばれ、エンティティやランダムティック(後に解説)の処理は停止していて、レッドストーンなどは動いています。

読み込みレベルが33のチャンクはBorderと呼ばれ、ゲームのごく一部の要素が有効になっています(スケジュールの実行(別の記事で解説予定)など)。

読み込みレベルが34以上のチャンクはInaccessibleと呼ばれ、何も読み込まれていません。

読み込みレベルは隣のチャンクへどんどん伝播していき、1チャンク伝播していく事に読み込みレベルが1増加します(読み込み度が下がります)!

 

これがチャンクの読み込みレベルです!

次はチケットについて解説します↓

 

【チケット(Ticket)】

チャンクは何もなしに読み込まれることはありません。

ではどのようにして読み込まれるのかと言うと、チケットというものが発行されて読み込まれます!

チケットには、「チケットの種類」「読み込みレベル」「読み込み継続時間」これら3個のプロパティが存在します!

こんなこと言われても何言ってるか分からないと思うので詳しく話すと、

チケットの種類はそれぞれのチケットの名前みたいなものです!

例えば後に話すプレイヤーが読み込まれると発行されるプレイヤーチケット、ネザーポータルにアイテムを入れると発行されるポータルチケットなど、それぞれのチケットの名前を指します!

読み込みレベルは最初に話したチャンクの読み込みレベルですね!

チケットの種類によってチャンクに与えられる読み込みレベルが変わってきます!

読み込み継続時間はチケットが発行されている時間です!

先程も話したポータルチケットは発行されてから一定時間経つと失効します。

そのチケットが発行されてから失効されるまでの時間が読み込み継続時間です!

 

それではチケットにはどんなものがあるのかを具体的に見ていきましょう!

 

・プレイヤーチケット

プレイヤー周辺を読み込むためにプレイヤーから一定の範囲内のチャンクに対して発行されるチケットで、

チケットを受け取ったチャンクは31の読み込みレベルを与えられます!

このチケットが発行されるチャンクの範囲は

バージョン1.18未満であれば描画距離によって変化し、バージョン1.18以上はシミュレーション距離によって変化します!

 

・強制読み込みチケット

コマンド/forceloadを使うことで強制的に発行されるチケットです。

このチケットによって読み込まれたチャンクの読み込みレベルは31で、さらにこの方法で読み込んだチャンクはゲームを再起動しても読み込まれ続けられます!

 

・開始チケット

ワールドを作ってから最初にスポーンしたチャンクを中心として、19×19のチャンク(スポーンチャンク)に対して発行されるチケットです。

読み込みレベルはゲーム内の最小値である22で、プレイヤーがどこにいても常に読み込まれ続けます!

 

・ポータルチケット

エンティティがネザーポータルを通過すると、そのポータルがある両ディメンションに発行されるチケットです。

読み込みレベルは30で周囲3×3チャンクに読み込み継続時間300ティック(15秒)を与えます!

チャンクローダーはこのポータルチケットを利用したものです!

 

・エンダードラゴンチケット

まだエンダードラゴンを倒してない状態でエンドに入るか、エンダードラゴンを復活させた時に出口ポータルのあるチャンクに対して発行されるチケットです。

読み込みレベル24を与えて周囲15×15チャンクを読み込まさせます!

このチケットのおかげでエンド本島の全体が読み込まれた状態になり、エンダードラゴンと戦闘中に地形を読み込み直したり、エンダードラゴンが読み込み範囲外に出て停止したりということが回避されます!

 

・転送後チケット

エンティティがエンドポータル、もしくは/tp、/spreadplayersなどで移送された際に移送先のチャンクを読み込むために発行されるチケットです。

与えられる読み込みレベルは/tpで32、エンドポータルと/spreadplayersで33で、5ティック(0.25秒)の読み込み継続時間が与えられます!

 

これでチケットの解説は終わりです!

次はフラッシュアップデートについての解説です↓

 

【フラッシュアップデート(FlushUpdate)】

フラッシュアップデートは描画に関する処理で、例えば、レッドストーンダストがオフからオンになった時、オンになったということを画面上に反映するのがフラッシュアップデートです!

別の記事で詳しく話そうと思っていますが、フラッシュアップデートはゲームティックのチャンクロジックフェーズで処理されるので、チャンクロジックフェーズを通った後に動作する0tickパルスは描画処理を通っていないので、描画はされないけど実際には点灯しているみたいな現象が起きます!

多分何言ってるか分からない人もいると思うので、また別の記事で詳しく話そうと思います!

 

これでフラッシュアップデートの解説は終わりです!

最後にランダムティックの解説です↓

 

【ランダムティック(Randm tick)】

1チャンクが16×16の空間ということは皆さんご存知だと思いますが、実はさらに16×16×16の空間に区切ることができます!

この16^3の空間をサブチャンク(もしくはセクション)といいます!

1チャンクは24個のサブチャンクが含まれ、毎tickごとに1番下のサブチャンクから3個ランダムにブロックが選ばれます!

この処理のことをランダムティックといいます!

ランダムティックによって選ばれたブロックは色々な処理が行われます!

詳しく書くととんでもない文字数になるので詳しくは書きませんが、例えば作物であれば成長度が上がったりします!

ちなみに3回の抽選で全て同じブロックが選ばれた場合はそれ以上ブロックが選ばれることはありません(1つのブロックしか選ばれません)!

 

Java版では1回のブロックの抽選で選ばれるブロックの数は/gamerule randomTickSpeedで設定できます!

 

これでチャンクロジックの解説は終わりです!

今回の知識は回路を組む上で特に意識するようなことではありませんが、知っておかないと回路の動作に疑問を抱くこともあるようなことではあるので知っておいて損は無いと思います!

次回からは本格的に回路を組む上で必須な知識を解説していこうと思っているので楽しみにしといてください!(?)

それでは次の記事でお会いましょう!!