Minecraft で読み込まれるチャンクの半径は 3–16 の間で選べるのだそうだ。 ということは,5 チャンク飛ばして更新されているか確認していけば 3 チャンクだったとしても どこかのチャンクにはぶつかるということだ。
というわけで,1 チャンク見て,間の 5 チャンクは更新されているかの確認もせずに 飛ばして,更新されていたら間のチャンクがアップデートされているか確認する ということにすると,何も更新がない場合の生成がかなり速くなった。 やっぱりやることを減らすと簡単にかなり速くなる。
ブロックの高さと名前が出せるようになった。 パーサーをサーバーとして実行てきるようにして,PHP で Unix ドメインソケットで話させる みたいな感じにした。
サーバーの実装だけど,最初 wait してなかったせいで,大量のゾンビプロセスを作ってしまった。 これは,犠牲となる子プロセスを作ったあと,そのプロセス内でプロセスを立ち上げて レスポンスを返す感じにして,即座に終了する最初の子プロセスをwaitするようにして解決した。
一月は行く,二月は逃げる,三月は去るみたいな,この時期にありがちな,でもちょっと早いような話をしつつ……。 でももう二月なんで早いですよね。まあそんなことはどうでもいい。
こないだ作った Minecraft のマップ画像を生成するやつを C++ で書き直し始めてみたりした。 でもまあ今日はそんなに作業できなかったのでほとんどヘッダファイル書いたら終わったみたいな感じだけど。 もともと Python で書いていたやつは anvil-parser というライブラリを使っていて, そのライブラリは NBT なる Minecraft の独自バイナリ形式のパーズには nbt という別のライブラリに 任せているっぽかった。nbt というライブラリのリポジトリを見に行ってみたら,チャンク読むところとかも実装されていて, なんかマップを生成する example も存在したんですね。うーん。まあいいやろ。 で,anvil-parser ってのはそのライブラリのチャンクの実装とかは使ってなくて, その部分は独自でやってるみたいでした。まあ古い形式にしか対応してなさそうだったのでそのせいかな, という感じがします。
VoxelMap というクライアント Mod を使っていて,この Mod は地図を PNG に書き出したり できるのだけれど,このところ書き出すところでクラッシュしていたので,セーブデータから 地図を生成するやつを自分で作ることにした。これを実現するためには Minecraft のセーブデータ をパーズする必要があるので,GitHub で適当に検索していたら良さげなのを発見。
matcool/anvil-parser
実際良いのかは分からないけど,なんかそこそこ動いてそうで,且つ最終コミットの日付が最近だったので これを使うことにしてみた。で,example っていうディレクトリがあって,一番上の非空気なブロック を画像に書き出すというものがあったので,それを参考にしながら作った。
作ってから分かったけどめちゃくちゃ遅い。生成にかかる時間はリージョンの中で生成されているチャンクの 数に依存するところはあるんだけど,だいたい 1 リージョン分の画像を生成するのに手元のラップトップだと 7 分くらいかかる。Python のオーバーヘッドだろうか。(知らんけど)
なんかここに
画像は VoxelMap という MOD が生成したやつで,JS は数ヶ月前に作った「洪水シミュレータ」という訳わからん やつを改造しただけなので適当。あとはいつもの GitHub に push したら自動で更新されるやつを 設定した。これがないと更新する気にならないので。
以前は Java 版を買うことで Windows 10 版もくれていた気がするけど,近頃はくれなくなっているらしく, まあケチになったなと思ったのだけど,Windows 10 版をくれていた頃は Windows 10 版が出たばかりだったので なんとかして認知度を高めたかったのかなと思ったりした。で,その頃は Windows 10 版は 1000 円くらいで入手できて Java 版の廉価版みたいな雰囲気を醸し出していたのだけど,雑に調べた感じだと無駄なものをいろいろつけてきて 3000円強の価格で売っているらしい。なんか意味が分からない。でもまあ確かに今のシステムだと Java 版よりも Windows 10 版の方が買う気になるのかなという感じがしていて,なぜかというと Android や iOS とマルチプレイができるからだ。それに対して Java 版だと Java 版同士でしかマルチプレイできない。 あと,以前は Java 版以外は Java 版のサブセットみたいなところがあったが,最近はその雰囲気はかなり 薄れている気がする。あと Android 版も僕が買った頃は 700 円くらいだった気がするけど今は 1000 円くらい取るっぽい。