LoginSignup
3
3

More than 1 year has passed since last update.

Unityゲーム制作奮闘記 - AudioClipによるメモリ使用量を削減する

Last updated at Posted at 2022-07-06

はじめに

本記事は、AudioClipがメモリを消費し過ぎることで、ゲームの起動が遅くなったり、
プレイに必要な必須メモリ量が増えてしまう、といった事象を解消する為に、
設定を見直した際の覚書です。

まず前提として、作成しているゲームは以下の音声を組み込んでいます。

◆前提
・キャラボイス:1000ファイル以上
・BGM:5ファイル前後
・SE:100ファイル前後

先に結論を書くと、
キャラボイスのAudioClip設定から「Preload Audio Data」のチェックを外す
というのが今回の本題です。

原因

まず、原因を簡単に整理すると以下になります。
①キャラボイスの量が多いこと
起動時に全音声ファイルを読み込んでいたこと

①についてはボイスを減らすわけにもいかないので、
解消すべき原因は②になります。

見直し前は、ゲーム起動時に非同期で全AudioClipを読み込む処理にしていました。

AudioClip[] voiceClips = Resources.LoadAll<AudioClip>("Audio/Voice");

AudioClipの設定は、下記のようにLoad Typeを「Compressed In Memory」に変更していました。
image.png
Compressed In Memory:圧縮状態でメモリに格納
上記の設定にしておけば起動遅延は殆ど感じなくなるのですが、
それでもファイル数が増えるとメモリをかなり使ってしまうので、やはり見直しが必要でした。

対策

検討の結果、今回の対策は以下にしました。
①キャラボイス(AudioClip)の読み込みタイミングを「起動時」から「再生直前」に変更する
②キャラボイス(AudioClip)再生後に読み込んだ音声ファイルをアンロードする
③キャラボイス(AudioClip)のLoad Typeを「Decompressed On Load:ロード中に解凍」にする
④キャラボイス(AudioClip)の「Preload Audio Data:オーディオデータをプリロード」のチェックを外す

但し、これは一概にこうすれば良いというモノでは無く、
再生直前で読み込むというのは当然負荷も増えるため、
再生遅延が生じる可能性があると想定されます。

今回のキャラボイスは、1ファイルのサイズが小さめ(5MB以下)なので殆ど遅延は無いですが、
サイズが大きいようなら別の設定を検討する方が良いかもしれません。

①キャラボイス(AudioClip)の読み込みタイミングを「起動時」から「再生直前」に変更する

これは単純に再生処理の話です。
起動時のAudioClip読込み処理を無くして、代わりに再生直前に読み込みます。

AudioClip loadClip = Resources.Load<AudioClip>("Audio/Voice/" + name);
mainVoiceSource.clip = loadClip;
mainVoiceSource.Play();
②キャラボイス(AudioClip)再生後に読み込んだ音声ファイルをアンロードする

これも再生処理の話です。
アンロードしないとメモリが解放されないので、見直した意味が無くなってしまいます。
※ただ「音声の再生が完了」してからアンロードする必要があると思われるので注意。

Resources.UnloadAsset(loadClip);
③キャラボイス(AudioClip)のLoad Typeを「Decompressed On Load:ロード中に解凍」にする

Load Typeはそれぞれメリット/デメリットがあるため、音声の種類によって使い分ける必要があります。

【Load Typeの種類】
・Decompressed On Load:ロード中に解凍
 読込と同時にメモリへ展開する。
 再生負荷が少ないが、圧縮していない為、メモリ使用量が多い。

・Compressed In Memory:圧縮状態でメモリに格納
 圧縮されてメモリに載り、再生時に展開される。
 再生時に展開する為、再生負荷がかかるが、メモリ使用量は減る。

・Streaming:ストリーミング
 読込/展開を都度実行する。
 再生負荷は高いが、メモリ使用量は少ない。再生遅延が発生する。

色々調査してみると、以下となっている場合が多いようです。
・BGMはサイズが大きく、再生遅延が生じても問題ない為、Streaming
・サイズが小さいSE等は、Decompressed On Load
・ボイスやその他は、Compressed In Memory

ただ、今回の処理方法(再生直前にロードし、再生後にアンロード)を加味すると、
わざわざ負荷を上げる必要は無いので「Decompressed On Load:ロード中に解凍」にしました。

④キャラボイス(AudioClip)の「Preload Audio Data:オーディオデータをプリロード」のチェックを外す

実は、今回メインで書きたかった内容はコレです。
上記①~③を設定する事でメモリ使用率が減ると想定していたのですが!
結果は…全然減らなかったのです。

①の対策で起動時の読込みは無くした筈なのに、どう見ても読込んでいるのです…
そして色々調べた結果、この「Preload Audio Data」のせいでした。

・Preload Audio Data:オーディオデータをプリロード
 アプリ起動時にメモリ上へ展開する。

もう見たままなんですが、デフォルトでこの設定になっている為、
全てのAudioClipがメモリ上に載ってたのです…

Preload Audio Dataをオフにする事で今回の設定変更が効き、
メモリ使用量を1/100程度まで削減出来ました。

おわりに

Audioの設計も中々奥が深いですね。
今回はPCゲームなのでまだ良いですが、
これがスマホゲームなら致命的な問題になる可能性もあります。

同じ悩みを抱えている人に、何かしら参考になる部分があれば幸いです。
ここまでお読みいただき、ありがとうございました。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3