しろうとのメモ

しろうとがなんかメモするところ

dynmap をなるべく小さい負荷で使うには

dynmap はプラグインをインストールしただけだと、 平面地図(flat)に加えて斜め上から見た地図(surface)や内部洞窟(cave)も作成する。 ところがこのsurface地図が他のものと比べてやたら処理が重く、作成される画像ファイルサイズも大きい。

これは( surface 地図は角度をつけてレンダリングする関係で、1ブロックあたり上面、側面と描画枚数が多い、という本質的な事情もあるが )configuration.txt で deftemplatesuffix: hires が設定されていて、 これを元に templates/ の下にあるテキストファイルが読みこまれ、その中の normal-hires, nether-hires, the_end-hires が適用されているためである。 surface 地図だけが高解像度設定されているので、画像データを多く作成し、重い負荷がかかる。

そのため、最小の負荷を目指し、最小限の機能として flat だけあれば良いことにする、というのがよくある方針である。

ところがそのために dmap コマンドや dynmap コマンドを使うことになるわけだが、これはデフォルトで作成された地図を消す、という作業であり、少々面倒である。 また、本来であれば各ワールドの設定を worlds.txt に書くのが正しいわけだが、 templates/ の下にある雛型を読んで書き方を理解し、書き写すことになるので、時間がかかるかもしれない。

そこで、

  1. templates/ に テキストファイルを作り、flat マップしか作らない設定を書いておく。
  2. configuration.txt に上記の内容を有効にする設定を書く。

とすれば、dynmap が flat の地図しか作成しなくなり、負荷も低く抑えられる。つまりdynmapを軽くできる、というわけだ。

 web/tiles/ 下にある画像ファイルの容量も少なくなるので、 レンタルサーバ等で運用している場合も参考になるのではないかと思う。

なお、画像ファイルのフォーマットそのものを調整してファイルサイズを最小化したい場合、plugins/dynmap/configuration.txt の中にある画像フォーマットを

image-format: jpg-q85

あたりに設定しておくと、jpg-q90(標準)と比べて、画質をやや犠牲にしてでもバランス良く画像を小さく出来るようだ。webpを利用するとjpg比でさらに7%程度減らせるようだが、サーバを動かしているOSにコマンドラインで画像変換するためのソフトウェアを導入(sudo apt install webp とかなんとか)する必要がある。

具体的な手順

ここではdynmapを初めて導入するところから説明を書く。また、MultiVerse-core プラグインを用いていると仮定する。使っていない場合は各ディメンションの情報取得やスポーン地点への移動などについて、適切に読み替えていただきたい。

1. サーバのプラグインディレクトリに Dynmap-3.2.1-spigot.jar を入れて paperMC サーバを起動する。

2. paperMC サーバを終了する。

3. プラグインディレクトリの下に dynmap/ が出来ていることを確認する。

4. dynmap/ の中にある templates/ に、flatonly.txt という名前で、 以下の内容を書いたテキストファイルを作成する。(コピペ、ダウンロード推奨)

5. dynmap/ の中にある configuration.txt ファイルをテキストエディタで開き、

deftemplatesuffix: hires 

となっている行を、

deftemplatesuffix: flatonly 

に書き換える。

この設定をしておけば、次回 paperMC サーバを起動すると、flat の地図しか生成しなくなる。 本当にそうなっているか確認するには、たとえば以下の作業を行う。

6. paperMC サーバを起動する。

7. 起動後、dmap maplist world などとして、生成されるマップが1つだけになっていることを確認する。この作業は、worldの部分をworld_nether, world_the_end など、作成しているディメンションの数だけ行うことになるだろう。

> dmap maplist world 
[16:26:04 INFO]: map flat: prefix=flat, title=Flat, perspective=iso_S_90_lowres, shader=stdtexture, lighting=shadows, mapzoomin=1, mapzoomout=3, img-format=default, icon=, append-to-world=, boostzoom=0, protected=false

8. dynmap pause を実行して、レンダリングが実行される状態であることを確認する。

> dynmap pause 
[16:27:38 INFO]: Full/Radius renders are ACTIVE [16:27:38 INFO]: Update renders are ACTIVE [16:27:38 INFO]: Zoom out processing is ACTIVE

リスポーン地点から周囲64ブロックを予めレンダリングしておく場合は、 管理者権限を有するユーザーがゲームにログインして/mvtp world の後、/dynmap radiusrender 64 などとすればよい。

サーバコンソールから実行する場合は、mvinfo コマンドでスポーン地点を確認する。

> mvinfo resource 
[16:35:25 INFO]: --- General Info --- 
[16:35:25 INFO]: World Name: resource 
[16:35:25 INFO]: Spawn Location: X: -253.37 Y: 67 Z: -66.75 P: -11.25 Y: -54.6

その後、この座標を用いて(端数はどう丸めてもよい)

dynmap radiusrender resource -253 -66 64

などとすればよい。 fullrender は好みに応じて行えばよいが、ワールド生成直後、誰もログインしていない状態ではおそらく意味がないだろう。(チャンクが生成されていないため)

既存マップの削除方法

もし既にdynmapを導入しており、この際一から作り直そう、というのであれば、 設定を書き換える前に、一度すべてのディメンションの地図データを purgeworld で削除しておくとよい。 具体的には、

dynmap pause all 
dynmap purgeworld world 
dynmap purgeworld world_nether
dynmap purgeworld world_the_end
(他にディメンションがあればあるだけ指示して消す)
save-all
stop (サーバ停止)
(必要に応じてdynmapの設定ファイル書き直し、再起動)

となるだろう。

応用:ディメンション再生成と purgeworld

dynmap purgeworld はMultiVerseプラグインのディメンションの再生成と組み合わせるとよい。 具体的には、以下のようになるだろう。

dynmap pause all 
dynmap purgeworld resource
mv regen resource --keep-gamerules
dynmap pause none
ゲームにログインして
/mvtp resource (再生成したディメンションのスポーン地点に移動)
いろいろ設定したあとに /dynmap radiusrender 64 (数分で終わるので死なないように待っておく)

注意事項

dynmap を入れているときは、 reload コマンドは使わないほうがよい。 map 書き換え中にプラグインの停止、再起動が起こって、 地図データが破損するかもしれないためである。