#41 「最適化の取り組み 中編」
お久しぶりです。プログラマーの堀内です。
最近は寒暖差が激しい日が続き、風邪も増えてきているようなので皆さんもお気をつけください。
さて、今回は前回に続き『リトルリコレクター』の軽量化(最適化)についてのお話になります。 前回の記事をご覧になっていない方はこちらを読んだ上で今回の記事をご覧になっていただくとおわかりやすくなっております。
計測してみたら、予想と少し違った話
最適化を始めるにあたり、まず最初にやったことは「計測」でした。
前回もお話しましたが、勘ではなく実際のデータを見ることが何より重要です。
とはいえ、正直ある程度の予想はしていました。
背景も多いし、キャラクターも動き、エフェクトも派手。
ここで実際に Unity Profilerなどを使い処理時間を確認してみると、
目立って時間を使っている箇所がはっきり見えてきました。
特に負荷が大きかったのが 描画処理 でした。
エフェクトというのは例えば、
ブラックホールや霧のエフェクト
など、ゲームを派手に見せてくれる大事な要素です。
ただし見た目の派手さと引き換えに、処理負荷が非常に高くなりやすい部分でもあります。
なぜ描画処理は重くなりやすいのか
今回特に問題になっていたのは、半透明描画が大量に重なっていることでした。
なぜ半透明の描画が重いのかですが、ゲームで画面に何か絵やキャラクターを表示した際に、前後関係を考慮する必要があるからです。
不透明なものは上から重ねてしまえば大丈夫なのですが、半透明の場合は前後関係を正しく計算をしないと色を重ねる際に、見え方が想定していたものと違って見えて破綻してしまうからです。
エフェクトは透明度を使うものが多く、描画の仕組み上どうしても処理コストが高くなります。
しかも探索中は複数のエフェクトが同時に発生するため、負荷が一気に跳ね上がっていました。
見た目ではそこまで大きく感じない小さな光や煙でも、
それが何十個と重なると処理負荷が高くなりゲーム体験に影響をしてきます。
実際に試してみたこと
そこで検証として、一部のエフェクトを一時的にオフにして動作を確認してみました。
結果として、どのエフェクトの描画処理が重たいのかを再確認し今後どうやって軽量化をしていくのかを検討することが出来ます。
それに加えて細かくエフェクトを切り替えることでどれが一番処理負荷がかかっているかを特定できます。
ここでやっと原因が見えてくるのですが、「重そうに見えるもの」と「本当に重いもの」は必ずしも一致しません。
今回の調査で改めて感じたのは、最適化はまず原因を特定するところから始まるということです。
なんとなく削るのではなく、
- 計測する
- 重い部分を特定する
- 仮説を立てる
- 実際に切って確認する
この繰り返しがとても重要になります。
次回は、このエフェクト周りを どうやって軽くしたのか、
見た目を大きく崩さずに負荷を下げるために行った工夫についてお話していきます。