Dynmapを軽くしたい その4


SpigotAPIを使ってMODプラグインを作り、PaperMCにつっこんで、プレイヤーの足元のブロックを全部ログして、それをWebGLで読み込んで表示、まで進捗した。プレイヤーがあるいた跡が見える。

画像1

一部抜けているのは、砂とか土とかの一部のブロックしか描画できないからである。

1ブロックあたり20バイト(位置がXYZで4バイトづつ12バイト、ブロックIDが4バイト、ブロックのデータが4バイト) で履歴をファイルに保存しておいて、プラグインがWebサーバになってHTTPで待ち受けてブラウザに送信する。

1リージョンのサイズは256x256で、描画の厚みが1ブロックの場合は65536ブロック分。それで20バイトかけると64Kx20=1280Kぐらい。 試しにSnappyで圧縮してみたら80%ぐらい小さくなって、250KBぐらいになった。かなり良い感じである。多少厚みがあっても1~2MBぐらいだろか、大したことはない。

Javaサーバーが保存しているリージョンファイルは、1リージョンあたり数MB~60MB以下ぐらいである。それに対して、1~2MBぐらいにおさえることができれば数%となる。サーバー側で必要なストレージは、Dynmapの場合はリージョンの5~10倍だったので、100分の1に近いレベルに抑えることができそうだ。

いまはプレイヤーが踏んだブロックを記録しているが、次はSpigotAPIのRaycastクラスを用いて、プレイヤーが見たブロックを記録する。

サーバーのログファイルの形式は、1行が固定の20バイトのバイナリで固定で、1ブロックあたり1行だが、Raycastすると同じブロックを何度も見ることになる。なので、重複を防ぐような何らかのしくみで、CPU負荷があまりないような方法を考えなければならないはずだ。

wglmap用の地形記録プラグインは、SurfaceScannerという名前にした。ソースはwglmapのレポジトリにそのままつっこんである。



この記事が気に入ったらサポートをしてみませんか?