初めに
おはようございます
突然ですが、"Vivecraft"というmodを知っていますか?
SteamVRに対応したHMDでMinecraftができるmodです
Minecraftには統合版の公式VRバージョンがありますが、それに比べVivecraftは
・SteamVR対応のHMDならなんでも動く(統合版はOculusのみの対応)
・Forgeに対応している
・モーションコントローラーを振り回すことでブロックの破壊や攻撃などの行動ができる
という3つの大きな利点があります
しかし、Java版におけるもっとも大きな問題として、ガベージコレクションが発生したとき、画面のカクつき(スタッター)が起きることです
特にmodを大量に入れた環境では頻発し、モニターを見ているだけでも不快要素なのにVRだともう最悪です
今回、ほぼ解決したので備忘録的に残しておきます
忘れちゃいけないこと!
Minecraftの仕様上(Javaの仕様上)ガベージコレクションは絶対に発生します
メモリの割り当てを増やしたところで先延ばしにするだけで避けられるものではないので、カクついたらメモリ割り当て増やそ!みたいなのはそこまで意味がないです
また、この方法を実践しても全員が全く同じようにカクつきが低減されるとは限りません
ガベコレ関係なくPCスペックの問題で常にカクついている場合は無意味なのでまずPC買い替えてください
解説
JVM引数を調べまくった人なら"-XX:+UseG1GC"や "-XX:+UseConcMarkSweepGC"という文字列を見たことがあると思います
基本的にはこの2つのどちらかが引数に入っていると思いますが、今回はこのGCアルゴリズムを別のものにしてガベージコレクションの処理を高速化させます
上記の引数を消し、"-XX:+UseShenandoahGC"を代わりに書き込みます
各GCの詳細についてはこちらが詳しいです
このShenandoahGCはデフォルトで入っているJava8では動作しないので、RedHat版のOpenJDK8をインストールする必要があります
OpenJDKではOpenJDK12から試験的に採用されていますが、RedHat版ではJDK8からShenadoahGCが実装されており、現環境を大幅に変えることなくShenadoahGCを試すことができます
方法だけ知りたい人はここから
Java8を使いたい人向け
まずRedHat DeveloperよりOpenJDK8をダウンロードします
OpenJDK Download | Red Hat Developer
一応注意点として、WindowsOSで動くものはRed Hatにアカウントを作る必要があります
ダウンロードするものは
"jdk-8uXXX-x64 MSI"です (XXXはバージョン テスト時は275ですが最新バージョンでいいでしょう)
手動でPath通せる人はZIPでもいいですよ!
ダウンロードしたらインストールして、MinecraftのJavaのパスをOpenJDKのjavaw.exeに指定します
JVMの引数に"-XX:+UseG1GC"、"-XX:+UseConcMarkSweepGC"の文字列があれば関連する引数も含め削除し、代わりに"-XX:+UseShenandoahGC"を書き込みます
Java8じゃなくてもいい人用
(こっちは動作未確認ですが、たぶん動くんじゃないかな?と思います)
OpenJDKより、OpenJDK12以降のものをダウンロードします
Path通したらあとはOpenJDK8とやることは同じです
最後に
ガベコレの頻度はどうしようもありませんが、少なくともガベコレ発生時のカクつきはかなり低減したと思います 多分
あと適当にメモリとかをJVM引数で指定してやればいい感じに動いてくれると思います
お疲れさまでした