kariaの日記 @ Alice::Diary

ノリツッコミの鳩子がはてなブログ書いちゃうよ

マイクラのマルチサーバーを立てて4ヶ月経った話 ~ #シャルの羊の世界2020 のあとがきにかえて~

2020年6月25日、Minecraft Java Edition向けの配布ワールド「シャルの羊の世界2020」が公開されました。

この配布ワールド公開にあたりお手伝いをさせていただきましたので、その顛末をここに残しておこうと思います。

これは何?

VTuberユニット「ハニーストラップ」に所属する島村シャルロットさんの誕生日に向けて、マインクラフト(以下マイクラと呼びます)のマルチプレイで協力して「お誕生日記念ワールド」を作り、その完成データを配布しようぜ!というのが企画の主旨でした。始動したのは3月5日(同じハニーストラップの堰代ミコちゃんの誕生日)が終わった数日後、実際にサーバーに人を招きいれ始めたのは3月13日だったようです。

f:id:karia:20200714054159p:plain
公開当時のDiscordサーバーのログ

完成(データ配布開始)はお誕生日当日の6月25日なので、3ヶ月半ほどの期間がありました。

結果から言うと、プレイした方からはものすごく好評をいただけました!このワールドのためにマイクラJava Editionを買った方もいらして嬉しい限りです。

シャルちゃん本人はどうかというと、「ワールドの隅々まで見ないと失礼」という考えがあったようで、計3回にもわたってワールド紹介の配信をしていただきました。「1回ぐらいちょこっと触れてもらえたらラッキー」ぐらいに考えていたので、この配信ボリュームには驚きました。

youtu.be

youtu.be

youtu.be

さて、私は今回「島村建設ITシステム課」もとい「お手伝い係」として以下のようなことをしました。

  • マルチプレイ用のサーバー構築と運用
  • 完成したセーブデータ配布およびマニュアル用Webサイトの作成
  • 宣伝用動画の撮影と編集
  • イクラ壁画建築のお手伝い(ちょっとだけ)などなど

本日(7月14日)にハニストデビュー2周年記念のアップデートが終わり、「延長戦」を含めて4ヶ月ほどの期間が終わりました。ここからの長い文章は今回のワールドについての私なりの「あとがき」です。

実はワールド内にも「開発者の部屋」と呼ばれる「あとがき」コーナーがあるのですが、そちらは「シャルちゃんでもわかるように」と思って非常に簡単にしか書いていません。こちら側の文章を全部理解できるのは自分だけのような気がするので、わかるところだけ飛ばし飛ばし読んでもらえればと思います。7000文字オーバーなのでお時間があるときにどうぞ。

サーバー周りの話

マルチプレイ用のサーバーの話をまず最初に書いておこうと思います。ここのパートはかなり突っ込んだ話になるのでわからん人は飛ばしてね。逆に、今からマルチ用サーバーを立てようとしている人には参考になると良いね。

構築

マルチプレイ用のサーバーは自宅サーバーで動かしたのですが、構築にはMinecraft Server Manager(以下MSMと呼びます)というスクリプトを利用しました。

msmhq.com

「docker使う?」とか「自分で起動スクリプト書く?」とか考えたのですが、期間限定のサーバーということもありMSMを利用することにしました。ソースを見るとわかる通り全部シェルスクリプトなので、おおよそのLinux環境では動くと思うし、起動・停止・バックアップ取得・アップデート確認などの作業を1コマンドでやってくれるので非常に楽です。管理者権限(マイクラ内部でコマンドを利用するのに必要)を付与することも出来ちゃいます。

その反面、ちょっと環境を汚しすぎかなと思う面もありました(インストール時に勝手にapt-getを叩いたりユーザーを作ってしまったり)ので一長一短ではないかと思います。「よくわからんけどマイクラ専用にレンタルサーバーを借りている」みたいなシチュエーションでは役に立つでしょう。

運用

既にサーバー立てている人はお察しの通り(というかマイクラ以外でもサーバーでは一般的なように)、構築よりも運用のほうが大変手間がかかりまして。

当初メモリ4GBの割り当てでスタートしたのですが、マイクラのプロセスがガンガンメモリを消費してゆき、途中で負荷問題も出始めたので切り分けも兼ねてメモリを増設、8GBの割り当てに変更しました。それでも、割り当てたらその分だけ食い潰すという感じの動きをするので8GBが適切だったのかはイマイチ不明です。

メモリの割当よりもパフォーマンスに効果があったのはjavaの起動オプションの変更でした。これはMSMを使った功罪で、何も変更しないデフォルトの状態ではMSMにより以下の様な起動オプションが指定されていました。

java -Xms{RAM}M -Xmx{RAM}M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:+AggressiveOpts -jar {JAR} nogui

これを以下のように変更しました。

java -Xms{RAM}M -Xmx{RAM}M -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -jar {JAR} nogui

※{RAM}は割り当てるメモリのサイズをM単位で、{JAR}はjarファイルのパスを指定する。

要は、コンカレントGCを使わずにG1GCを使うようにしました。おそらく歴史的な経緯でコンカレントGCが最適だった時代があったんでしょうけど、メモリをガンガン積んでる現代のjvm環境ではG1GC使えよって事でしょう。マイクラの記事としてこの辺のことが書いてある記事はあんまり無くて(マイクラのチューニングというよりかはjavaのチューニングだしね)ちょっと探すのに苦労した。

あとはストレージをHDDからSSDに変えたりもしたのですが、それほど効果は感じられなかったです(iostatとか見る限り、そんなに激しくread/writeしている様子もなかった)。おまじないのように1日1回サーバー再起動するように仕込んでみたりもしましたが、一時的にメモリ使用量が減る以外の効果は無かったように思います。余談ですがシャルちゃんが配信内で「リスナーさん用サーバーを立てたい」と言っていて、この辺をうまく教えられる気は全然しないな~と思いながら見ていました。

バックアップ周期には気をつけて

バックアップの取得設定についてはちょっと後悔があって、当初はMSMのデフォルト設定の通り1日ごとに取得する設定にしてました。

ですが、マイクラの建築には「Ctrl+z」で元に戻す機能などありません。その割に広範囲に影響を及ぼすコマンドを簡単に使えちゃったりして、ということはちょっとしたコマンドのミスで大規模にワールドを破壊できちゃったりもして………。

まあ、人間絶対にミスることはあるので、「ミスらないようにするのが大事」なんじゃなくて「ミスっても大丈夫なようにするのが大事」なんですよね……ということを知りながら1日1回の設定のまま放置していたので、申し訳ねえ~!!という感じでした。途中からバックアップを1時間1回に変更したのですが、時既に遅し。

それにしても、マイクラのコマンドの奥深さにはちょっと驚きましたね。if文使えたりもするしちょっとしたプログラミングやね。

Discordとの連携が超便利

今回導入してみて非常に便利だったのがminecordというマイクラとDiscordとの連携ツールでした。

github.com

イクラを配信で見たことがある方は、マイクラのワールド内でチャットをする様子を見たことがあるかと思います。minecordは、そのワールド内チャットの内容をそのままDiscordに流してくれるツールです。

これによって、マイクラにログインしていなくてもDiscordを見ているだけでマイクラ内での会話の様子がわかります。「なんか妙にマイクラ内のチャット流れてるし、何かトラブル起きたかな?」と様子を見に行ったりとか、逆に「いまチャット全然流れてないし、アップデート適用して再起動しちゃおうっかな」みたいなことが出来て大変便利でした。

また、適切に設定すればDiscord側のチャットで発言した内容をマイクラ内チャットに反映させることも可能です。

f:id:karia:20200714062256p:plain
「わたあめbot」がマイクラ内部からの発言、それ以外がDiscordからの発言。

ちょっとだけ発言したいためだけにマイクラにウインドウを切り替える必要がなくなって革命的な便利さでしたね。774incサーバーにも導入したら便利なのでは?という声もあったので、マイクラ猫ななしさんは頑張ってください。

ちなみにサーバーmodは導入しませんでした(minecordはmodではない)。

配布用サイトの話

長かったサーバーの話はここまで。サーバーが落ちついてから、完成したセーブデータを配布する用のサイトをつくりました。今回Netlifyを初めて使ってみました。

shimamura-charlotte-bd.netlify.app

この手のいわゆる「ペライチのサイト」を置いておく場所って何がいいんだろうってずっと思っていたのですが、無料でこれはめちゃくちゃ便利~!無料というのは超大事で、極端な話いつまでも放置し続けられるわけです。少しでも有料の要素があると、いつかはお金を払わなくなって消滅する日が来ます。でも無料ならサービスが生き続ける限りはずっと残るからね。

当初はBOOTHでの配布などを考えていたのですが、お誕生日を迎えるシャルちゃん本人がダウンロードからインストールまでの手順をきちんと理解できるようにしたかったので、(見た目はめちゃくちゃショボいのですが)作って良かったなって思います。

宣伝用動画の話

今回、宣伝用動画を編集する担当にもなりました。

私の動画の技術って、その昔アニメ録画にめちゃハマってたころに培ったAviUtlでCMカットをできる能力ぐらいしかありませんでした。テロップを入れたりシーン切り替えの演出を入れたりする方法は、ここ1年ぐらいVTuberの切り抜き動画を作りながら覚えたものだったりします。その切り抜きもTwitterへの投稿がほとんどだったので、今回のように「ゲーム画面を録画して編集する」「10分以上の動画を投稿する」というのは、どちらも初めての経験でした。

……にもかかわらず、作業がギリギリになってしまったのは本当に申し訳ない。

youtu.be

というわけで出来た動画がこちら。見た人から「動画良かった」とか「動画見て泣いた」とか言ってもらえてうれしかったです。ハッピーバースデーの曲が流れる「ソングロード」を一番最後に持ってくることだけは早くから決まっていたので、狙い通りだったんじゃないかな。それ以外のシーンは、Discordで「こんな風に撮るんですけど」と言いながら画面を見せつつ録画しました。

ここでの悩みは「自分、マイクラの操作が下手」。録画しながらワールド内を走ってる途中に間違って飛んでしまったり、ジャンプがうまく出来なかったり、間違ってブロックを壊してしまったり………。ゲーム実況をしている人たちは本当にすごいと思うし、配信を観ていて「シャルちゃんはマイクラの操作が上手だな!」と思ったりもしました(めちゃくちゃ失礼)。

あと、ハニストデビュー2周年(7月14日)に向けてもう1本動画を作りました。

壁画建築の様子をタイムラプス風に早回しで見せるというもの。こちらは、時間がかかることがもうわかりきっていたのでかなり早くから着手しました。というのは、4日分の動画を数千倍速でエンコードして2分20秒以内にまとめるというだけで、ひたすらエンコード時間との闘いだからです。動画編集を始めたあとから使う曲を決めたので、曲の尺に合わせてエンコードを全部やり直したりとか良い思い出だ。

f:id:karia:20200714064553p:plain
LLLTの歌詞をスプレッドシートに書き出してタイミングを調整したりした

次からはちゃんと最初からタイミングを計算しような!!

その他の話

技術的な話は別にして、今回は全体を通して「表向きにあんまり自分の名前を出さないようにする」というのを意識しました。告知用TwitterアカウントもYouTubeアカウントも専用のものだし、配布サイトも自分が運営しているサイトに寄生させずに独立させたし、動画のエンディングにあるスタッフロールでも「建築チーム」の中の一人として五十音順で紛れ込ませたりしました。

シャルちゃんの配信で「開発者の部屋」に入ったときに自分の名前が画面に出ているのですが、実はこの開発者の部屋を作っている最中にも「自分の名前だけ出さないでもらおうかな」と考えたほどです。1人だけ名前が出ないというのもヘンなので結局入ってますけども。

f:id:karia:20200714034916p:plain
配信に自分の名前がめちゃくちゃ出ている様子

何故かというと、今回の企画の主催はねぎまさんだし、主役はあくまでも黙々と(時には協力して)建築をしていたひつじさんたちである、という気持ちからです。たくさんのイラストで世界を彩ってくれた方たちも、もうひとつの主役。私はあくまで出稼ぎの使い魔であって、存在自体がバグみたいなもの。

あとは、私は建築をほとんどしてないしね!「全くしてない」というわけじゃなくて壁画を建築するお手伝いを少ししたりとか、「(あつ森の)飛行場の出入口の形がちょっと違う~!」ってイチャモン付けつつ自分で直したりとかはしたけど、そのぐらいです。

でも、一応ホイールクリックでスポイト的な機能が使えることは覚えたので、「ブロック壊しちゃったけど直し方わからない!」ということは無くなりました。動画撮影とか配布データのチェックとかあって結構な時間マイクラにログインしてたので、お誕生日前日にサーバーの火を落としたあとすぐ「またマイクラにログインしてあのワールドに行きたいな」って気持ちになりました。SAOのキリトとアスナの気持ちがちょっとわかる感じ。

またみんなでマイクラしたいね!ということで、とりとめもなく終わります。

追伸

この記事を見て、今回の配布ワールドに興味を持ったりダウンロードした人がいたら、ぜひ「#シャルの羊の世界2020」のハッシュタグを付けて感想やスクショや動画をツイートしてね。遊んでもらってナンボのものなので、よろしくお願いいたします。何なら、マイクラ持ってない人向けにバーチャル赤羽を旅する配信でもしようかな?