Resources.Loadで発生する謎のラグ
ボールを連続で消していく時に起きた、Unityエディタ上では発生せず、実機で実行するときにのみ発生する謎のラグ。 ある程度ゲームの形が整ってきて、初めて実機テストを行ったときにハマったのがコレ。
ほんの一瞬だけのラグだけど、やはり、ボールを消していくときに突っかかるようなラグは、ゲームとして致命的な動作といえます。ということで、ボールを消したあとにのみ起こっているので、その周辺のコードを集中的にチェックを開始。処理の流れは以下の通り。
- ゲームフィールドに同色のボールがあるかどうかを判定
- 同色のボールが3個以上あれば、消去用のエフェクト(雲みたいなパーティクル)を生成
- 連続して消去するとチェイン扱いになり、チェインが発生したら「Chain」の文字とチェイン数字をスプライトで表示
テストプレイと並行してコードのチェックもしていくと、ラグは、チェインが発生したときのみに発生することが確定。つまり、1と2は、ラグの原因から除外していいことに。3をさらに細かく見ていくと、スプライト数字を表示させないとラグが起きないため、どうやら原因はスプライト数字の表示関係と特定できた。
このスプライト数字系は、サイトで見つけたルーチンをアレンジしたところ。おぼろげにしか把握してないので、この際しっかり見ていこうと追っかけてみると、なぜか1文字を生成するごとに、
Resources.LoadAll<Sprite>("スプライトデータ");
と毎回スプライトデータを読み込んでいる場所を発見。
プロジェクト内に「Resources」フォルダを作っておけば、そこに置いてあるデータを読み込んでくれる便利屋「Resources.Load」さん。たいしたデータを読み込ませてるわけじゃないと、高をくくっていたら、データの大きさに関わらず実機で実行されるときは、ほぼ必ず一瞬止まるような動作をする模様。
結局、初期処理の段階でいったんスプライトデータをキャッシュしておき、実際の表示は、そのキャッシュしたところから引っ張りだしてことなきを得ました。そもそも謎でもなんでもなく、「そういうもの」なのかも知れませんが、リアルタイム処理を行っている時は使わないようにしよう。うん。
テスト環境
freetel FT142A
Sony Xperia Z3 Tablet Compact SGP611