Unityでゲームを作っていると、リアルタイムライトをシーンにたくさん配置したくなる場合があります。
例えば今私が作っている2Dアクションゲームは「暗闇の中」が舞台なので、キャラクターの位置が分かるようにたくさんのライトが必要です(下図)。
ただ、このような場合に気になるのがパフォーマンスの問題です。なんといってもリアルタイムライトは重いので…。
そこでここでは上記のような場合でもライトの負荷を下げる方法を簡単にご紹介します。
リアルタイムライトをたくさん配置する場合の最適化方法
では早速ですが最適化方法を見ていきましょう。リアルタイムライトの描画負荷を下げる方法は主に次の4つがあります。
- ポイントライトの代わりにスポットライトを使う
- マテリアルのでシェーダーを高速なものに変える
- ライトに重要度を設定する
- 影をOFFにする
ポイントライトの代わりにスポットライトを使う
まず一つ目は「ポイントライトの代わりにスポットライトを使う」ことです。
実はポイントライトは描画コストが高くて重いです。そこで、もし可能であればより軽量なスポットライトを使うと描画の負荷を下げることができます。
マテリアルのでシェーダーを高速なものに変える
次に二つ目は「マテリアルのシェーダーを高速なものに変える」ことです。
例えば3DゲームならStandardシェーダーを使うことが多いと思います。しかしStandardシェーダーは表現の幅が広い代わりに重いので、リアルタイムライトをたくさん置きたいときには向きません。そこでより軽量なシェーダーを使うことで負荷を下げることができます(※例えばMobile/VertexLit等)。
ライトに重要度を設定する
三つ目は「ライトに重要度を設定する」ことです。
ライトのコンポーネントを見てみると「レンダーモード」というのがあるのですが、ここでライトの重要度を設定することができます。ここでメインで使用するライトは「重要」、そうではないライトは「重要でない」に設定しておけば描画の負荷を下げることが可能です。
影をOFFにする
最後に四つ目は「ライトが落とす影を無効化する」ことです。
やはりリアルタイムライトによる影の描写はコストが高いので、それを無効にすれば軽量化できるのは間違いありません。
…まあ3Dゲームでは影がないと立体感が分かりづらくなる場合もあるので無効にしづらい場合もあるかと思いますが、もし可能であれば思い切って影をなくしてしまったほうがパフォーマンス向上につながります。
最適化の効果
さて、上記の方法を適用するとどのくらい描画負荷が減ったのか?ということですが、具体的な数値を挙げると私のプロジェクトの場合はBatchesが「115」→「77」に減少しました(※値が低いほど高速)。
負荷が激減したというわけではないですが、それなりの効果があったことが分かりますね。
おわりに
以上、ごく簡単ではありますがリアルタイムライトの負荷を軽減するための最適化方法について書きました。
リアルタイムライトをたくさんシーンに置くような状況はかなり限定的だと思われますが、何かしら参考になれば幸いです。