Minecraft Wiki
Advertisement
Minecraft Wiki
4,117
ページ

概要

マインクラフトは1秒間に20回の頻度でワールドの要素を更新させることでゲーム内の時間の進行を表現している。1度の更新にかかる時間である0.05秒をtickという単位で表現する。このページでは1tickでマインクラフトがどのようにワールドの要素を更新していくかを記述する。

処理の流れ

mcp940で得られるMinecraft 1.12のソースコードを参考にしている。

サーバーの場合
MinecraftServer#run
┣ 実行時間の管理
┣ MinecraftServer#tick
┃┣ MinecraftServer#updateTimeLightAndEntities
┃┃┣ futureTaskの処理(?)
┃┃┣ 各ワールドについての処理
┃┃┃┣ 20tickに一度のクライアントのワールド時間の同期
┃┃┃┣ WorldServer#tick
┃┃┃┃┣ 天気の更新
┃┃┃┃┣ バイオームのキャッシュを破棄(?)
┃┃┃┃┣ プレイヤーが全員寝ていたら朝にする
┃┃┃┃┣ MOBの自然スポーン
┃┃┃┃┣ マークされたチャンクのアンロード
┃┃┃┃┣ 日光量の変化を反映
┃┃┃┃┣ ワールドの経過時間を+1
┃┃┃┃┣ ワールドの時刻を+1(doDaylightCycle=trueの場合)
┃┃┃┃┣ WorldServer#tickUpdate
┃┃┃┃┃┣ スケジュールされたブロック更新の一覧(のうち先頭65536個)からこのtickで行う分を抽出
┃┃┃┃┃┗ 抽出されたブロック更新を実行
┃┃┃┃┃ ┗ それに伴うブロックの更新(深さ優先探索)
┃┃┃┃┣ WorldServer#updateBlocks
┃┃┃┃┃┣ ランダムに選ばれた一人のプレイヤー周囲で明るさの修正
┃┃┃┃┃┗ プレイヤー周囲のチャンクでの処理
┃┃┃┃┃ ┣ 明るさの計算
┃┃┃┃┃ ┣ タイルエンティティのロード
┃┃┃┃┃ ┣ 落雷・スケルトンホースのスポーン
┃┃┃┃┃ ┣ 積雪・水源の氷への変化
┃┃┃┃┃ ┗ ランダムティックによるブロックの更新
┃┃┃┃┣ PlayerChunkMap#tick
┃┃┃┃┣ VillageCollection#tick
┃┃┃┃┣ VillageSiege#tick
┃┃┃┃┣ Teleporter#removeStalePortalLocations
┃┃┃┃┗ ブロックの変更をクライアントに送信
┃┃┃┣ WorldServer#updateEntities
┃┃┃┃┣ (エンドの場合)ドラゴン戦の管理機構呼び出し
┃┃┃┃┗ World#updateEntities
┃┃┃┃ ┣ 雷の効果の更新
┃┃┃┃ ┣ アンロードされるエンティティをチャンクから取り除く
┃┃┃┃ ┣ エンティティが取り除かれるときの処理
┃┃┃┃ ┣ WorldServer#tickPlayers 
┃┃┃┃ ┣ エンティティの処理
┃┃┃┃ ┣ タイルエンティティの処理
┃┃┃┃ ┣ タイルエンティティの消去処理
┃┃┃┃ ┗ タイルエンティティの追加処理
┃┃┃┗ updateTrackedEntities(?)
┃┃┣ networkTick(?)
┃┃┣ playerLists.onTick(?)
┃┃┣ tickableなものの更新(実際には何もしない?)
┃┃┗ gameLoopFunctionの実行
┃┣ 重い場合の処理
┃┣ 900tickに一度のセーブ
┃┃┣ PlayerList#saveAllPlayerData
┃┃┗ MinecraftServer#saveAllWorlds
┃┣ ここまでの所要時間を記録
┃┗ 統計情報の取得(?)
┗ 経過時間が0.05秒になるように待機

解説

未編集