のにっき

【Unity】Androidアプリの起動が遅い時の対処

ちびちび作ってたアプリがようやく完成間近の段階になってブラッシュアップ中の事。
改善必須の厄介な現象につかまりました。
検索しても出てこなかったので色々試行錯誤して、やっと解決したのでまとめます

環境と現象

Androidアプリでの現象
実機デバッグを行った際に、起動後に「Unityロゴ」が出てから
タイトル画面の表示が描画されるまでに「15秒」もかかった

f:id:apuridasuo:20200512150908p:plain
図:表示するタイトル画面の構成
今回は、上記の遅すぎる起動をどのように解決したかまとめていきます
※今回は、対応としては設定1つの変更で解決したのですが、
解決までの過程で色々対応してどんな効果があったのか、ためになったので紹介します。
※解決法だけ知りたい方は以下の「解決法(結論)」の項目だけお読みください

解決法(結論)サウンドの読み込みによる遅延

遅延の原因は、オブジェクトの描画でも、Startイベントで行っている
オブジェクトキャッシュ処理でもありませんでした。
アプリ起動時にサウンドデータを読み込む処理が遅かっただけでした。
サウンドデータをバックグラウンドで読み込むことで解決します

f:id:apuridasuo:20200512152019p:plain
図:サウンドデータの設定方法
上図のように、サウンドデータを選択して、
「Load In Background」にチェックするだけ!
これで起動が「 15秒 → 1秒未満 」に改善されました
音ゲー作ってたので大量の音データの読み込みに時間がかかってたみたいです。。。

※タイトル画面で使用する音(すぐに出力するBGM等)は、
チェックを入れると音の出力が遅れてしまうのでチェックを入れないように!!

(過程)以外と起動の遅延には関係なかった者たち

遅延と聞いて原因を予想する時、何を考えるでしょうか?
今回の様に、サウンドデータのことを思いつく人なんて天才かよ!?って感じです。
私はまず「Startイベントのキャッシュ処理」「3Dオブジェクトの描画」
この2点が原因で起こった遅延だと思っていました。
(そのせいで、解決するまでクソほど遠回りしちゃいました泣)
そこで行った対応が以下になります
・3dオブジェクトを非表示にしてビルド
・3dオブジェクトを削除してビルド
・Startイベントを全てコメントアウトしてビルド

この3つの対応をすれば、とりあえず起動は早くなるだろうから
そこから原因を深堀していけばいいや・・・と思っていました。
結果は、起動時間は全く変わりませんでした
以外だったのは、少しも速くならなかったことです。

◆Startイベントって起動の遅延に影響ないの?

改めて、Startイベントのタイミングを調べてみたのですが、
Unity - マニュアル: イベント関数の実行順
上記サイトの記入では
▼ Startイベントのタイミング
スクリプトインスタンスが有効になると、最初のフレームのアップデート前に呼ぶ
との事でした。
最初のフレームのアップデート前という事は、
やはりStartイベントの内容は描画前に呼ばれているイベントだと思います。
実際はキャッシュ処理で起動が遅くなっているのでしょうが、
まったく気にしなくていいぐらいの遅延だったのでしょう。
以外とキャッシュ処理って起動に影響しないんだ。。。とビックリしました

◆3Dオブジェクト大量においても遅延ないの?

3Dオブジェクトの描画で起動時間が遅れることはないのか!?
気になったので、今のタイトル画面にUnityちゃんを102体設定してビルドしてみました

f:id:apuridasuo:20200512155954j:plain
図:51vs51のラップバトル
実際のタイトル画面です。ラップバトルをイメージしたタイトル画面なのに
ちょっとした戦争ものみたいになっちゃいましたw
実際に起動したときの挙動は、
・起動時間は0.5秒→3秒ぐらいに長くなった(遅延した)
・起動の遅延よりも起動後の操作遅延がえぐかった
・0.5秒でBGMはなったので、Startイベントの処理は描画の遅延に関わらず終わった
こんな感じでした。
やはり、3Dオブジェクトの描画は起動の遅延にも影響があるみたいですね
ただ、オブジェクトの描画による遅延は今回のデータ読み込み遅延と違って
Startのイベントはすぐに完了する
という部分が大事だと思いました。
処理的には終わってるけど描画が追い付いていないって感じなんでしょうね
A. Startイベントはすぐ終わる起動遅延=オブジェクト描画が原因
B. Startイベント終わってない起動遅延=データ読み込み等の他の原因

こんな感じで、起動遅延の原因追及がなんとなく調べやすくなりました!!

以上です、アプリが出来たら下にリンク張るので是非遊んでね!

この問題を経て作ったアプリ

やっとやっとできたので紹介します!
リズムゲームの要素で、押すボタンがクイズになってる感じです。
操作自体は簡単なので、ぜひプレイしてみてください。
play.google.com