ゲームの最適化ガイド
ロード時間を縮め、スマホで軽く動かすための設定とコツをまとめたページです。Unity と Godot のおすすめのビルド設定も載せています。
1. まず見るところ
GameRush のプレイヤーは、フィードを流しながらスマホでゲームを次々に開きます。読み込みが長いゲームは遊ばれる前に飛ばされ、重いゲームは端末が熱くなったりページごと落ちたりします。次の項目から順に見てください。
- Unity は Compression Format を Brotli、Decompression Fallback を切る
- Unity は Managed Stripping Level を Medium 以上、Strip Engine Code を有効、IL2CPP Code Generation を Faster (smaller) builds
- Godot は Use Threads を切る(Godot 4.3 以降の単スレッド書き出し)
- 合計のビルドサイズは 30MB 以下 を目安にする(上限は 300MB)
- テクスチャと音声を圧縮し、使っていないアセットとパッケージを消す
- 最初のシーンは小さく作り、残りは後から読み込む
- スマホでは描画解像度とエフェクトを絞る
Unity と Godot の設定は SDK からまとめて適用してビルドできます(推奨設定でビルドする)。
2. GameRush が自動でやること
配信側で縮められる部分は GameRush が受け持ちます。作者が設定する必要はありません。
- 圧縮して配信する。 圧縮せずに上げたファイルも、起動に要るもの(
wasm/data/jsなど)はこちらで圧縮して配信します。 - 次に流れるゲームを先に読んでおく。 いま遊んでいるゲームの裏で、次のゲームのファイルを端末に取っておきます。間に合えば、開いたときにはダウンロードがほぼ終わっています。
- Unity の起動を急がせる。 Studio で Unity を選んで上げたビルドは、GameRush のプレイヤーが
wasmとdataのダウンロードを最優先で並行して始め、ローディングバーを出します。 - エッジにキャッシュする。 ビルドは書き換わらない URL で配信され、各地のエッジに置かれます。
ビルドそのものの重さ(wasm と data の大きさ、圧縮の設定、起動時にやる処理)は、配信側では削れません。ここから先は作者側の設定で決まります。
3. ロード時間を縮める
先読みが間に合っているとき、ロード時間はほぼ「wasm のコンパイル + 起動処理」の時間です。どちらも端末の CPU で決まり、ビルドが大きいほど長くなります。つまり体感を決めるのは主にビルドの大きさです。
| 合計のビルドサイズ | 体感 |
|---|---|
| 〜30MB | 快適 |
| 50MB を超える | 先読みが間に合わなかったとき、モバイル回線で待ちが目立ち始める |
| 300MB | アップロードの上限(超えると受け付けない) |
データを小さくする
- テクスチャ: 表示サイズより大きい画像を持ち込まない(スマホなら 1024px〜2048px が上限の目安)。圧縮フォーマットを使い、非圧縮のテクスチャを残さない。
- 音声: BGM は長いので圧縮率を上げる(Unity は Vorbis の Quality を下げる、Godot は Ogg Vorbis を使う)。短い効果音は小さく保つ。
- 使っていないもの: 試しに入れたパッケージやアセットは書き出し前に消す。Unity は Build Report や Editor.log の Build Report 節で、何が大きいかを確かめられる。
- 最初のシーン: 最初のシーンが参照するアセットは、起動時に必ず読まれるデータ(Unity の
.data、Godot の.pck)に入る。タイトル画面だけで起動し、残りは Addressables や後からの読み込みに回すと、起動が軽くなる。
ロード画面を早く外す
GameRush は、ゲームが最初の1枚を描いた時点でロード画面を外します。canvas を使わず DOM だけで描くゲームはこれを検出できないので、起動し終えたら次の1行を呼んでください。
parent.postMessage({ type: "grush:ready" }, "*");4. 処理負荷を下げる
スマホのブラウザは、同じ端末のネイティブアプリより使える CPU・GPU・メモリがずっと少なく、フィードの画面と同じタブの中で動きます。重いゲームはフレームが落ちるだけでなく、端末が熱くなって性能がさらに下がったり、メモリが足りずにページごと再読み込みされたりします。
フレームレートと解像度
- Unity の WebGL は
Application.targetFrameRateが既定の-1のとき、ブラウザの描画タイミング(requestAnimationFrame)に合わせて動く。ふつうはこのままにして、重い端末でだけ 30 に下げる。 - Godot は
Engine.max_fpsで上限を決められる。既定の 0 は上限なしで、ブラウザの描画タイミングに合わせて動く。熱や電池が気になるスマホでだけ 30 にする。 - 高解像度の画面で等倍に描くと、ピクセル数は 3〜4 倍になる。GPU が重いゲームは描画解像度を下げるのがいちばん効く。
- フルスクリーンのポストエフェクト(ブルーム・被写界深度・SSAO など)と、リアルタイムの影は、スマホでは真っ先に削る候補。
void Awake()
{
if (Application.isMobilePlatform)
{
Application.targetFrameRate = 30;
}
}func _ready() -> void:
if OS.has_feature("web_android") or OS.has_feature("web_ios"):
Engine.max_fps = 30CPU とメモリ
- 毎フレームの割り当てを減らす。 Unity の WebGL はガベージコレクションがフレームの合間にまとめて走るので、
Updateでnewや文字列の連結を繰り返すと、定期的にカクつく。弾や敵はオブジェクトプールで使い回す。 - スレッドに頼らない。 GameRush ではマルチスレッドの書き出しが動かないので、重い計算は複数フレームに分けるか、事前に済ませておく。
- メモリを使い切らない。 iPhone の Safari は1つのタブが使えるメモリに上限があり、超えるとページごと再読み込みされる。大きなテクスチャや音声を一度に全部読み込まず、使い終わったシーンのアセットは解放する。
- 物理とパーティクルの数を絞る。 同時に動かすオブジェクトの数が、そのまま CPU の負荷になる。
測る
Studio のアナリティクスには、実際のプレイヤーの端末で測ったロード時間(平均・p95・途中離脱率)とフレームレートが出ます。API からも取れます(アナリティクス)。設定を変えたら、次のビルドで数字がどう動いたかを見てください。
手元で確かめるときは、パソコンのブラウザではなく実際のスマホで、できれば数年前の機種で開いてください。パソコンで快適なゲームがスマホで重いのはよくあることです。
5. Unity のおすすめ設定
Player Settings > WebGL で設定します。SDK の GameRush > 推奨設定でビルド を使うと、下の表をまとめて適用してビルドできます(推奨設定でビルドする)。
| 設定 | おすすめ | 理由 |
|---|---|---|
| Publishing Settings > Compression Format | Brotli | いちばん小さくなる。GameRush は正しいヘッダーを付けて配信する |
| Publishing Settings > Decompression Fallback | オフ | オンにすると JavaScript で解凍してからコンパイルする形に固定され、ダウンロードとコンパイルが並行しなくなる |
| Publishing Settings > Data Caching | オフ | GameRush が自分で先読みとキャッシュをするので二重になる |
| Other Settings > Managed Stripping Level | Medium(High でも可) | 使っていないコードを削って wasm を小さくする |
| Other Settings > Strip Engine Code | オン | 使っていないエンジンの機能を削る |
| Other Settings > IL2CPP Code Generation | Faster (smaller) builds | 実行速度よりサイズを優先する |
| Other Settings > C++ Compiler Configuration | Release | デバッグ用の情報を載せない |
| Build Settings > Code Optimization(2022 以降) | Disk Size(Unity 6 は Disk Size with LTO) | wasm が小さくなる |
| Publishing Settings > Enable Exceptions | Explicitly Thrown Exceptions Only | 例外の検査を減らして小さく速くする。None にするとエラーの原因が追えなくなる |
| Other Settings > Graphics APIs | WebGL 2 だけ | WebGL 1 向けの分を持たない |
| Publishing Settings > Enable Multithreading | オフ | GameRush の配信ではスレッドが動かない |
| Build Settings > Development Build | オフ | 開発用ビルドは大きく遅い |
Managed Stripping Level を High にすると、リフレクションで呼んでいるコードまで削られて動かなくなることがあります。そのときは Medium に戻すか、link.xml で残す型を指定してください。
レンダーパイプラインは Built-in か URP を使ってください。HDRP は WebGL に対応していません。
6. Godot のおすすめ設定
Godot 4.3 以降の Project > Export の Web プリセットで設定します。SDK の GameRush SDK Build プラグインを使うと、下の設定の「GameRush Web」プリセットを作って書き出せます(推奨設定でビルドする)。
| 設定 | おすすめ | 理由 |
|---|---|---|
| Variant > Thread Support | オフ | GameRush の配信ではスレッドが動かない |
| Variant > Extensions Support | オフ | GDExtension を使わないなら要らない |
| VRAM Texture Compression > For Mobile | オン | スマホの GPU が読める形式(ETC2 / ASTC)のテクスチャを入れる |
| VRAM Texture Compression > For Desktop | オン | パソコンのブラウザで遊ぶ人向け |
| Progressive Web App > Enabled | オフ | GameRush の先読みとぶつかる |
| Export Path | index.html | GameRush はいちばん上の index.html を入口にする |
- レンダラーは Compatibility を使ってください。Web への書き出しで動くのは Compatibility だけです。
- For Mobile をオンにするには、Project Settings の Rendering > Textures > VRAM Compression > Import ETC2 ASTC もオンにします。テクスチャの取り込み直しが走り、
.pckは大きくなります。2D で Lossless のテクスチャしか使っていないなら影響はほとんどありません。 .pckは起動時に丸ごと読まれます。使わないリソースは Export の Resources タブで除外してください。- Godot 4.5 系は、音を鳴らすと iOS で落ちるという報告があります。公開前に iPhone の実機で通して遊んでください。
7. Phaser と Web(その他のツール)
- アセットの参照は相対パスにする(Vite なら
base: "./")。 - 本番用にビルドして minify する。ソースマップは上げない。
- 画像はスプライトシートにまとめ、
webpを使う。音声はogg/m4aにする。 - 起動に要らないアセットは、タイトル画面を出してから読み込む。
- GameRush のローディングバーは出ないので、読み込み中の表示はゲームの側で用意する。
書き出しの手順とアップロードで弾かれる条件は 対応エンジンと書き出しガイド にあります。