2024年10月12日

Unityで、同時に複数のカメラが存在したことでレンダリングの競合が起きてしまっていたという反省です。実に1年越しの解決です。罠というかただの初心者の確認不足です。

「同じ3Dのゲームなのに、輪投げはスマホでも動く。なぜ刑務所はパソコンで処理落ちするのか?」

この問題についてずっと悩んでいました。というのもこの処理落ち問題がトラウマで、新しい3Dゲーム作りになかなか挑戦できずにいました。

結果、厳密には処理落ちではなく、レンダリングの競合だったと自己解決に至りました。

症状

3Dのカットで、灰色のブロックノイズが出てしまっていました。

ゲーム開発者のすいでんさんによるゲーム実況からの引用です。ここで初めて問題に気づけました。感謝!!

その後何回かに分けて、ライトを改善したりモデルを結合したりして最適化を図りました。

ここであれこれ試したのに、その後のありがたいゲーム実況により問題が改善していないことが判明……。画面のチラツキやフラッシュが出てきてしまっていました。

申し訳ないと思いながらも、原因が分からず対処しかねていました。前回の最適化でできることは全てやったと思っていたし、逆にいろいろ試しすぎてそれが不具合につながっている可能性もありました。問題なく再生できているゲーム実況もあるし、私の環境でもこの症状を再現できなかったのでお手上げでした。

Unity6で分析機能が強化されたとの話を聞き、もう一度原因を探すことにしました。

カメラの重複

前回、カメラの重複により2倍描写してしまっていた問題が発覚し、カメラをタイムラインで切り替えることにより解決した……と思っていました。しかしタイムラインを再確認したところ、切り替わるはずのメインカメラがずっとオンになっていたことが判明。ポンコツ。しかも2倍の描写負荷に留まらない直接的な問題に思い当たりました。

複数のカメラがオンになっていたことにより、レンダリングの競合が起こっていたようです。

ChatGPTに聞いたところ、改善策として、カメラの優先度(Depth)の設定やクリアフラグの見直しが挙げられていました。GPUの性能やバージョンによってこの問題が起きたり起きなかったりするようです。スペックが高いGPUのほうが問題が起きにくい傾向にあるものの、完全には避けられないとのこと。

環境によっては全く問題なく表示されるため、注意が必要な問題だと思いました。ゲーム実況を通じて問題を把握できたのは非常に幸運でした。感謝そして感謝……。

今度こそ1度に1つのカメラだけが有効になるようにしました。

修正後に複数のブラウザで動作確認し、Androidでも再生出来ることを確認しました。スマホで見られるなら、大抵のPCで問題なく再生できるのでは。

一番重いシーンも再生できました。一安心です。

その他やってみたこと

上記の原因が分かる前に最適化すべく試したことなど

SetPass callsに限れば、153 → 100 → 57と順当に削減されました。ウィンドウ→分析→プロファイラーのグラフもなだらかになっていきました。

VRMの余分なボーンを削除

Vroid製のVRMのため、いくつか不要なボーンがついていました。コートやスカートは着ていないのに、なびくようになっていました。髪と胸のボーン?もまとめて削除してスッキリしました。

VRMの余分なColliderを削除

今作は静的な鑑賞作品のためColliderは基本的に不要です。これをオフにするとエラーが出てきてしまいましたが、ChatGPTの助力を得てVRMのScriptにnull処理を書き足すことで事なきを得ました。

Vroidのモデルは頂点が結合していないことが多い」との記事を見て、実際にBlenderで開いたらそのとおりでした。可能なら一旦Blenderでモデルを調整したほうが良さそうです。

マテリアルの見直し

今作は受刑者のプライバシー配慮のためマテリアルをオフにしており、そのせいで一部エラーが出てきてしまっていました。今回エラー部分を見直し、ちゃんとオフになるようにしました。

投影をオフ

オブジェクトの投影をできる限りオフにしました。前回のライトの種類変更ほどの効果は無かったものの、できることは何でもしようという感じです。

また、環境リフレクションをできる限りオフにしました。

背景のColliderを削除

背景モデルはアセットストアからお借りしており、デフォルトでColliderがついていました。今作では不要のため削除しました。

Unity6

最新のUnity6では分析がアップグレードされたと聞き、試してみました。UIが洗練され見やすい印象です。

プロファイラーのハイライトが分かりやすい感じです。3DのシーンでGPUに負担がかかっています。

VRMのScriptをいくつかオフにしたらグラフの水色の部分を削減できました。

その他にも分析がいくつか追加されていましたが、初心者にはこのプロファイラーのハイライトが一番分かりやすそうです。CPUはずっと真っ赤ですがそちらはちょっとまだ分かりません(ゲームのFPSを30に設定しているのに、分析では横着して60のままなのでガバガバです)。

新たな問題?

Unity2022から6000にアップデートした関係なのかは分かりませんが、ビデオシーンで冒頭の効果音が鳴らなくなってしまっていました。読み込みが間に合っていないのかなと考えています。以前からこの部分はタイミングがずれていて、軽微なバグで修正方法も不明なのでそのままです……。

余談

Unity6ではゲーム開始時に表示されるスプラッシュスクリーンが非表示可能になっていました。今までは有料版のみの機能でした。

一部でご好評いただけた本作のスプラッシュスクリーン

ありがとうスプラッシュスクリーン……。

その他変更点

シェアボタンの追加

最近シェアボタンを作る方法をまとめた関係で、このゲームにもシェアボタンをつけてみました。Open URLでの挙動を確認できると思います。

ランキング仕様変更

最高得点を出したときに、自動でハイスコアランキングに名前が残るようにしました。素晴らしい功績ですからね。それはそう。

画面停止時のBGMをオフ

BGMの主張が激しいかなと思い、一部シーンでのBGMをオフにしました。停止ではなく音量が0になります。本来(?)のプレイでは一時停止されるのですが、BGMを聞かせたいばっかりにオンのままにしていました。

おわりに

この問題を通じて3Dゲームへの理解が深まったと思います。ここに至るまでにかなり時間がかかってしまいました。服役期間の終わりを感じます。気のせいかも。カメラの重複には気をつけたいと思いました。

私の環境ではちらつきを再現できなかったので、本当に解決できたのかは未知ですが、現時点では最善の対応ができたのではと思います。

うまく再生できないなどの不具合を見つけた場合はご連絡いただけると幸いです。

Categories: