ユーザー:Kyaco11/ワールド更新順序
概要[編集 | ソースを編集]
マインクラフトは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秒になるように待機
解説[編集 | ソースを編集]
未編集