読者です 読者をやめる 読者になる 読者になる

Nobollel開発者ブログ

Nobollelのエンジニアが、UnityやCocos2d-xの旬な情報・技術を紹介します。

Unityのシーン初期時のリソース(Audio)生成速度の比較

初めまして。NobollelUnityエンジニアの山田です。

Unityを使っていると自分で毎回課題に上がるのがリソースの読み込み方法です。 どこまでAssetBundleにするのか、ResourcesLoadを使うのか、SceneのHierarchyに非アクティブで置いておきアクティブ状態で切り替えるのか。

特に個人的に気を使うのがAudioの扱いです。 物にもよりますがAudioは重たいので、単純にResources.Loadで読み込むと音が途切れやすいです。 また、設定によりますが一気にメモリを食うのでアプリがクラッシュしやすい場面でもあります。

なのでAssetBundleを使わないような場合、よく使うAudioはキャッシュしておくパターンも使われると思います。

そこで今回はシーン初期時に行うAudioのキャッシュ方法の速度について調べてみました。

調査環境は以下の通りです ・Unity5.5.0p3 ・Android XperiaZ3Compact ・AudioのPreloadAudioDataのチェックは外しておく

今回比較するのは以下の3つのパターンです。

1.ヒエラルキー上にAudioを置いておく 2.Awake時にResources.LoadAllを使い指定フォルダのAudioを全て読み込み、GameObjectを生成していく 3.Inspecter上にAudioを設定しておき、Awake時にループでGameObjectを生成していく

メインとなるシーンが読み込み終わって、最初のStartが呼ばれるまでにかかった時間(Time.realtimeSinceStartup)を計ります。

これらをそれぞれ10回実行し、中央値を取りました。

使用するAudioはCasual Music Pack

https://www.assetstore.unity3d.com/jp/#!/content/21086

の全20ファイル(376.2MB)を使用しました。

1.ヒエラルキー上にAudioを置いておく ヒエラルキー上に20ファイルを置いておき、ビルドして実行しました。 ResourcesフォルダにはAudioファイルは置いていません。 (Resourcesフォルダにファイルがあると起動時間が若干伸びてしまうため)

結果: 7.216597秒

2.Awake時にResources.LoadAllを使い指定フォルダのAudioを全て読み込み、GameObjectを生成していく こちらはこのようなコードでテストをしました void Awake() { AudioClip[] clips = Resources.LoadAll("Music"); foreach (AudioClip clip in clips) { GameObject go = new GameObject(); AudioSource source = go.AddComponent(); source.clip = clip; source.Play(); //一応Playもさせておく } }

結果: 6.130289秒

3.Inspecter上にAudioを設定しておき、Awake時にループでGameObjectを生成していく こちらは2.のコードのclipsをヒエラルキーであらかじめ全て入れておいたものになります。 Resourcesフォルダからも移動をしております。

結果: 6.853645秒

というわけで今回は以下の結果になりました。 ヒエラルキー  7.216597秒 LoadAll  6.130289秒 Inspecter  6.853645秒

意外にもResources.LoadAllが一番速度が出ました。

今回試していないパターン(Application.LoadLevelAdditiveなど)でどのぐらい速度が出るのか、 またAudioでなくUIなどではどうなるのかなども調査が必要そうです。