0コメント

【Minecraft】世界が破壊される時。※技術的な考察

Minecraft(マインクラフト)は、マルクス・ペルソン(ノッチ)とMojang Studiosの社員が開発したサンドボックスビデオゲームである -wikipediaより
 Mnecraftはゲームをよく遊ぶって人ならおそらくどのジャンルをやっている人であろうが絶対一度は聞いたことがあるだろう。なぜなら全プラットフォームにおいて2億本売り上げたゲームだからだ。

 全人類78億7500万人で1%以上の人が購入したこのゲームは、自分で世界を生成して、サバイバルしたり、建造物を作ったり、時にはプログラミング言語だとかコマンドを駆使して面白いギミックを作る人もいる。そんな世界的に人気なMinecraftというゲーム、「自由度が高い」というか高すぎることから、ハマる人は5年単位でプレイし続けるし、すぐ飽きる人は一週間から数ヶ月で辞めてしまう、そんなゲームだ。私も十年弱プレイしている。

 しかし、自由度が高いという点における代償、それは「バグの多さ」だ。

 規模が大きくなってくるとどうしてもバグという物は発生する。そしてクラッシュする。不慮の事故によりクラッシュしてしまい、「あれ!?ワールド一覧に遊んでいたワールドが表示されない!」だとか、「ワールドの読み込みにとんでもなく時間がかかるようになった」だとか。時には「ワールドの一部の場所に入ると急激に重くなる、永遠に読み込まれない、クラッシュする」など、問題を抱えてしまうことが長期間プレイしているとどうしても起こることがある。

 だが、知る人ぞ知る。表示されなくなってしまったワールドの対処法は一応ある、というか公式のwikiに記述してある。ワールド一覧から消滅したら、ディレクトリのlevel.datの破損を疑うべきだ。level.dat_oldに置き換えるか、自力でバックアップしたデータのlevel.datを持ってくるか、プレイヤーの持ち物などのデータが全部消滅してしまうが新規ワールドを生成してlevel.datをもってくるか、だ。

 このように、Minecraftのワールドはsavesディレクトリ内にそれぞれのワールド、それぞれ役割を持ったデータファイルによって保存されている。例えば、オーバーワールド(地上)の地形データは「region」ディレクトリの中、スコアボードのデータもscoreboard.datファイルとしてgzip圧縮されて保管されている。

 今回は、「ワールドの読み込み二トンでも無く時間がかかる」「一部の場所に入ると急激に重くなる」という現象について考察していく。


 この日記で添付した画像がこちら。
unknown-10-thumbnail2.png

 これはネッ友のワールドなのだが、統合版のワールドをJava Editionで使えるように変換するソフトを使った結果こうなったのである。というのも、そもそもワールドの一部分に入ろうとすると急激に重くなるし、ワールドの読み込みにめちゃくちゃ時間がかかるとのことで、ワールドデータが破損していたんじゃ無いかと思い、変換ツールを使った結果これだ。

 ちなみに統合版でそのまま起動してもこうはならない。おそらく、自動で修復しながら読み込んでいたのだろうと考察している。しかし、変換ツールを通せば一目瞭然で地形データが破損していたんだなって分かるレベルだ。

 結局、このワールドは復元できないとして修復を断念した。その一部分読み込めないエリアのチャンクを削除したり試していたが、どうにも無理だった。甚大な被害と引き換えにチャンク群を管理するファイルごと一つ削除すればこの現象は起きなくなったが、あまりに代償が大きかったので結局やっていない。

 修復は失敗に終わった。


 ・・・ハズだった。

 先ほどの話は十一月中旬でのことであり、場面は変わり、十二月初旬の昨日。変なことに気付いた。それは、Java番の私のワールドでも一部分が読み込めなくなる不具合が発生したのだ。どうせ地形データがダメなんでしょう、まあ私はバックアップを少し前に取っていたのが残っているから、regionフォルダの中身だけ破損したワールドのデータと置き換えることにするか。

 治らなかった。

 バックアップデータ単体で起動してもその部分の地形データは問題なく読み込むことが出来る。しかし破損したワールドの地形データのみをバックアップに差し替えても、治らなかったのだ。

 regionフォルダはオーバーワールドの地形データだ。地形データだけを正常動作する物に置き換えても読み込みが出来ない、急激に重くなるバグが発生してしまった。となると地形データの破損による物だろうとは一概に言えなくなってしまった。何かしら地形データ以外の物が邪魔をしていると考えるべきだ。とも思ったが、統合版でさっきのスクリーンショットのような破損とは全くの別減少の可能性もあるので、できる限りの考察をまとめてみる。

  • 地形データ破損の別箇所が影響して破損した説
  • 村など建造物を読み込むデータが破損していたことによるバグ説(poiディレクトリ)
  • アイテムが大量に居座っていた説
  • シンプルに致命的な地形データ破損による負荷説

だ。
 地形データ破損の別箇所が影響して破損した説とは、偶然たまたま破損部を一斉に読み込もうとして重くなるという説だ。正直この線は薄そうだ。致命的な地形データ破損による負荷も、元々はこれだろうなと思っていたのに地形データ関係なくこの現象が起きるともなれば話が変わってくる。
 村など建造物を読み込むデータが破損していた説というのは、Java版に限ってスーパーフラットでも村といった建造物が生成される特性から、それらのファイルを読み込もうとしたときに破損しており負荷になってしまうと言う説だ。
 アイテムが大量に居座っていた説というのは、どうも読み込み範囲外だとkillコマンド等でも対処できないようなので、それこそ数万数十万というエンティティがい居座っていて、一気に重くなってるんじゃ無いかという説だ。

では、これらのためにどういう対処をしてみるか。地形データを正常動作するワールドから移植して起動させても一部分が読み込めなくなる不具合が発生してしまったため、地形データのすり替えは省く。

○poiディレクトリ自体を一度削除する
 ちなみにpoiディレクトリは村人の情報を保持しているらしい。今調べてきた。この線もちょっと薄くなった気がする。
○コマンドをオフにして、エンティティをできるだけ削除する
 アイテムを常駐させるfunctionを組んでいたが、アプデによりまともに動作しなくなってしまった説があるからだ。そこまで負荷が起きるような物じゃないからそんなこともないとは思うが・・・

これらを帰ってみて一度やってみることにする。現在、大学で一人寂しくこれを書いていたところなのである。
0

この記事へのコメント