ゲーム開始時点で大量のファイルをプリロードするのはどうなのよ問題【ティラノスクリプト】
ティラノ製のゲームを開始しても画面が真っ黒なまま問題
ティラノスクリプト製のゲームはブラウザからもプレイできるため、PCだけでなくスマホからも気軽にプレイできます。
が、ノベコレから気になるゲームを選んでゲーム開始…したのに、いつまで経ってもゲームが始まらない…ずっと真っ暗な画面…
そんな現象に遭遇したことはないでしょうか。
これは別にエラーが起きているわけではなくて、多くは大量の画像や音声ファイルをプリロードしているために処理待ちが発生しているだけです。
しばらく…まあ気長に…コーヒーでも飲んで待っていれば、そのうちゲームは始まります。……タブンネ
でも、真っ暗な画面とにらめっこしながらいつ始まるかわからないゲーム開始を待つって、なかなかに苦痛です。
中にはエラーだと勘違いしてゲーム画面を閉じてしまうプレイヤーの方もいることでしょう。
これはゲーム制作者の側としても本意ではないはずです。
大量のファイルを、ゲーム開始時点でプリロードするのは、ゲーム開始後に画像を表示するタイミング、BGMを再生するタイミングでロード待ちが発生するのを防ぐため。
つまりは、プレイヤーのゲーム体験を損なわないためです。
しかしそのよかれと思ってしたことが、逆にプレイヤーのゲーム体験をより損なってしまっている。
これはいけません。
そもそもプリロードとは?
さて、まずはプリロードとは何かについて考えていきましょう。
プリロード、preloadとは、読んで字のごとく「事前に読み込んでおく」ことです。
前述したとおり、ブラウザゲームはリソース(画像とか音声とか)のロード開始から終了までに(ローカルアプリと比較して)時間がかかります。
そのため、例えば容量の大きいBGMを再生しようとすると、BGMのファイルを読み込み完了してから再生開始されるため、ゲーム内で謎の間が発生してしまうことがあります。
プリロードは、予めファイルを読み込んでおくことで、この間が発生しないようにすることができます。
しかし注意しておきたいのは、
事前に読み込んでおくか、必要になったときに読み込むかの違いがあるだけで、ファイルを読み込む時間は変わらず必要となる
ということです。
プリロードの弊害
はい、ここで冒頭の問題に振り返ってみます。
ぼく「BGMの再生待ちで間ができるのはゲームへの没入感を損なう!必要なファイルは全部プリロードしておこう!」
プレイヤー「ゲームするやでー。おっ、これにしよか」
プレイヤー「タップしてスタート、ポチッとな」
プレイヤー「……」
プレイヤー「……」
プレイヤー「全然ゲーム始まらんやんけ! やめやめ! ウマ娘やろ」
むやみやたらにプリロードするファイルを増やしてしまうと、その分ファイルを読み込む時間が必要となります。
もしかすると、テストプレイ段階ではプリロードにそれほど時間がかかっていなかったかもしれません。
しかし、ローカルファイルを読み込むのとネットワーク上のファイルを読み込むのとでは読み込み時間に雲泥の差があります。
ブラウザのファイル読み込みは恐ろしいほどの時間がかかるのです。
それが数十ファイル、あるいはそれ以上となれば、プレイヤーに強いる待ち時間は久遠のごとしです。
さらに悪い問題があります。
プリロードで読み込んだファイルは、ブラウザのメモリ領域に保存されます。このメモリの容量は、ゲームをプレイしている端末によってまちまちです。
たとえばちょっと昔のスマートフォンや、貧弱なスペックのPCの場合、プリロードで読み込もうとしている容量がブラウザのメモリ容量を上回り、最悪の場合ブラウザがクラッシュします。
プレイヤーのためを思って実装したはずの機能が、逆にプレイヤーに不便を強いかねない…
これは…これはいけません……
プリロードが必要な場面
じゃあプリロードを使ってはいけないのかと言うと、そんなことはありません。
要は使い方を考えましょうということです。
タグリファレンスの[preload]の項を見てみましょう。
storage …事前に読み込む画像ファイルをフルパスでしていしてください。配列を渡すことでまとめて指定することもできます
wait …trueを指定すると、全ての読み込みが完了するまでゲームを停止します。
注目するべきは「wait」パラメータです。
ここにtrueを指定すると、指定した全ファイルの読み込みが完了するまでゲームを停止します。
まずはここに「false」を指定してやればいいのです。
ぼく「えっ!? そんなことしたら、ファイルが読み込まれる前にゲームが始まってしまうよ!」
それがどうかしましたか?
考えてみてください。ゲーム開始直後の時点で読み込みが完了している必要のあるファイルはどれだけありますか?
せいぜいタイトル画像やタイトルBGM、ボタン画像がいくつか程度でしょう。
それでは、その「必要なファイル」だけをwait=trueでプリロードして、その他のファイルはwait=falseで読み込んでおけばいいのです。
さらに、貧弱スペック端末への対応まで考えるのなら、wait=falseで読み込むファイルについても厳選が必要です。
絶対に読み込みによる遅延を発生させてはいけないファイルに絞ってプリロードを行いましょう。
世の中には我々の想像を絶するほどの低スペック端末を利用してインターネットを利用している人々というのがいるのです。それらすべてに対応しようというのなら、それはもはや修羅の道です。
で、結局何が正解なの?
個人的には、ゲーム開始直後に全ファイルプリロード、は悪手だと思っています。
もし、今まで特段の理由なく「ゲーム開始直後に全ファイルプリロード」をしてきた方がいるのなら、今一度、なぜ、「ゲーム開始直後に全ファイルプリロード」しなければいけないのか考えてみてください。
プレイヤーにゲーム開始までの待ち時間を強いてまで、そのファイルはプリロードしなければならないものですか?
待ち時間が発生することによるプレイヤーの離脱リスクを負ってまで、そのファイルはプリロードしなければならないものですか?
プレイヤーの端末によってはブラウザごとクラッシュするリスクを負ってまで、そのファイルはプリロードしなければならないものですか?
熟考の末「ゲーム開始直後に全ファイルプリロード」が必要だという結論に達したのなら構いません。
他の結論に達したのなら、そちらの手段を取るのもいいでしょう。
大事なのは、「意図を持って行う」ことです。
あなたが何を優先し、何を犠牲にしてゲームを作ろうとしているのか。
それを見極めた上で、プリロードについても考えてみてください。
(21/7/25追記)補足記事あげました。
サポートをしていただけると私がたいへんよろこびます。 ちなみに欲しい物リストはこちら→https://www.amazon.jp/hz/wishlist/ls/2DBRPE55L3SQC?ref_=wl_share