Unity プレハブの動的生成を止まらないようにする

◆プレハブを動的生成する際の注意

プレハブのInstantiateは、PCではあまり感じないが、
モバイル端末やVITAなどではめっちゃ止まる。
2回目の生成からは高速だが、1回目はとにかく止まる。
PCで0.1秒止まるなら、VITAなら5秒ぐらい止まる。
(もちろんPC性能や状況による)

○なぜ止まるのか?
大きく分けて3つ原因がある
1.テクスチャの読み込み
2.シェーダーのコンパイル
3.その他・オブジェクト生成

1と2は、事前準備をしておくことで回避できる。

というわけで以下対策について

■1の対策 テクスチャの事前読み込み

こっちは基本の話。

Resources.Load()を使う。
Instantiateはまだしないで、読み込みだけしておく。
Resources.LoadAsyncなら、画面を止めずに裏側で読み込める。
尚、この時点ではまだシェーダのコンパイルはされない

ヒエラルキー上のオブジェクトに、プレハブをアタッチしておくと、
Resoueces.Loadをしたのと同じことになる

また、アタッチしたオブジェクトに、さらにプレハブがアタッチされていると、
それもResoueces.Loadしている

ので、アタッチしているとシーンのロード時間は長くなるが、プレハブ生成は高速になる。

*実験
プレハブA・・・読み込み0.1秒
プレバブB・・・読み込み8秒
という2つのプレハブを用意し、プレハブAに、プレハブBをアタッチしておく。
ここでプレハブAを読み込み(Resources.Load)すると、8秒程度止まった。
その後、プレハブBをResoueces.Loadすると、0.2秒程度で読み込めた。

なので、プレハブがたくさんアタッチされたプレハブを読み込もうとすると、
すっごい止まるよ!

ちなみに、事前読み込みしていても、シーン移動やUnUsedAssetsなどをすると
キャッシュが消えちゃうので遅くなります

■2の対策 シェーダーの事前コンパイル

Resources.Loadをしても、Instantiate時に、
まだコンパイルしていないシェーダについてはコンパイル処理が走ってしまう。

いくつか方法があると思うが、
Edit>Project Settings>Graphicsに、
Preload Shadersというのがあるので、
ここに登録しておけばゲーム起動時にコンパイルされる、と思う。
(試してない)

ダメならスクリプトで読み込むか、カメラの外に、
そのシェーダを使った画像でも表示させればいいじゃない(投げやり)

 

■3.オブジェクトの生成対策
ここまでで、軽いプレハブなら、殆ど止まらないで生成出来る。
だが重いプレハブだとやっぱり止まる。
これはもう単純にオブジェクトの数が多すぎて、生成が1フレーム以内に終わっていない状態。

シーン遷移の代わりとしてプレハブを読み込むなら、これぐらい止まってもどうってことは無いが、
動的な演出として読み込むのであれば、これは困る。

もし1フレーム内でInstantiateを何度もしているなら、
数フレームに分けて行い、全て生成が終わったところで演出を行うのが良いと思う。
下記のサイトではコルーチンを使って、1フレームに1回ずつInstantiateをしている。

テラシュールウェア様
http://tsubakit1.hateblo.jp/entry/2014/08/21/005830

参考にさせて頂きました。

以上でプレハブの動的生成を、画面を止めないで出来ると思います。

コメントを残す

メールアドレスが公開されることはありません。

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)