リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
隣接タイル・遭遇候補画像のバックグラウンド先読みプリフェッチ
1. 目的:
マップ移動そのものはAjax差分応答・Canvasキャッシュ化で高速化済みだが、実際に敵と遭遇したり新しいエリア(村・洞窟・神殿・別バイオーム)へ移動した瞬間は、その場で初めて必要になるモンスターPNGや戦闘背景PNGの読み込みが発生し、回線やSWキャッシュ未ヒュ時に一瞬の表示遅延・チラつきが起きる。移動先を先読みしておくことで体感速度をさらに底上げする。
2. 具体的仕様:
- assets/js側(マップ描画・プレイヤー移動処理)に `rpgsfPrefetchAhead(playerX, playerY, facingDir, mapMeta)` を追加する。
- プレイヤー移動確定時(現状のAjax差分応答が返った直後)に、現在位置から進行方向前方3〜5マス以内のタイルのバイオーム/地形種別を、既にクライアントが保持しているタイルメタ情報(既存のミニマップ/ビットセットデータ)から算出する。
- 算出したバイオーム・天候・時間帯・エリア種別(フィールド/ダンジョン/村など)に対応する「想定される戦闘背景PNG」「そのエリアの遭遇テーブルに含まれるモンスターPNG(上位数種のみ)」のURL一覧を、既存のPHP側モンスター/アセットインデックス(既にAPCuキャッシュ済み)を使い、軽量なAjaxエンドポイント `?ajax=prefetch_hint` で1回だけ取得する。
- クライアントは受け取ったURL一覧に対して `requestIdleCallback`(未対応環境は`setTimeout(fn,300)`)でバックグラウンドに `new Image().src = url` を発行し、ブラウザキャッシュ及びService Workerのキャッシュファースト戦略に載せておく。既にキャッシュ済みのURLは何もしない(重複リクエスト防止のためJS側でロード済みURLのSetを保持)。
- 同一タイル範囲に対する先読みは1回だけ行い、プレイヤーが大きく移動した場合のみ再計算する(連打・小刻み移動での過剰リクエストを防止)。
- 通信量・サーバー負荷を抑えるため、先読み対象は最大8枚まで、かつ低優先度(fetchPriority='low'または遅延実行)で行う。
- 戦闘開始・マップ切替時の既存の画像読み込み処理には一切手を加えず、あくまで事前ロードのみを追加する。
3. 既存機能との整合:
- 既存のマップ移動API・戦闘開始処理・Service Workerキャッシュ戦略はそのまま利用し、新規追加するprefetch_hintエンドポイントとJS側のプリフェッチ関数はオプトインの追加処理のため、失敗しても(Ajax失敗・非対応ブラウザ含め)本来のゲーム進行には影響しない設計にする(try/catchで握りつぶし、フォールバックとして何もしない)。
- 通信量が心配な環境向けに、設定画面や既存の音量設定パネル付近に「先読みを無効化」チェックボックス(localStorage保存)を追加し、モバイル回線ユーザーがオフにできるようにする。
マップ移動そのものはAjax差分応答・Canvasキャッシュ化で高速化済みだが、実際に敵と遭遇したり新しいエリア(村・洞窟・神殿・別バイオーム)へ移動した瞬間は、その場で初めて必要になるモンスターPNGや戦闘背景PNGの読み込みが発生し、回線やSWキャッシュ未ヒュ時に一瞬の表示遅延・チラつきが起きる。移動先を先読みしておくことで体感速度をさらに底上げする。
2. 具体的仕様:
- assets/js側(マップ描画・プレイヤー移動処理)に `rpgsfPrefetchAhead(playerX, playerY, facingDir, mapMeta)` を追加する。
- プレイヤー移動確定時(現状のAjax差分応答が返った直後)に、現在位置から進行方向前方3〜5マス以内のタイルのバイオーム/地形種別を、既にクライアントが保持しているタイルメタ情報(既存のミニマップ/ビットセットデータ)から算出する。
- 算出したバイオーム・天候・時間帯・エリア種別(フィールド/ダンジョン/村など)に対応する「想定される戦闘背景PNG」「そのエリアの遭遇テーブルに含まれるモンスターPNG(上位数種のみ)」のURL一覧を、既存のPHP側モンスター/アセットインデックス(既にAPCuキャッシュ済み)を使い、軽量なAjaxエンドポイント `?ajax=prefetch_hint` で1回だけ取得する。
- クライアントは受け取ったURL一覧に対して `requestIdleCallback`(未対応環境は`setTimeout(fn,300)`)でバックグラウンドに `new Image().src = url` を発行し、ブラウザキャッシュ及びService Workerのキャッシュファースト戦略に載せておく。既にキャッシュ済みのURLは何もしない(重複リクエスト防止のためJS側でロード済みURLのSetを保持)。
- 同一タイル範囲に対する先読みは1回だけ行い、プレイヤーが大きく移動した場合のみ再計算する(連打・小刻み移動での過剰リクエストを防止)。
- 通信量・サーバー負荷を抑えるため、先読み対象は最大8枚まで、かつ低優先度(fetchPriority='low'または遅延実行)で行う。
- 戦闘開始・マップ切替時の既存の画像読み込み処理には一切手を加えず、あくまで事前ロードのみを追加する。
3. 既存機能との整合:
- 既存のマップ移動API・戦闘開始処理・Service Workerキャッシュ戦略はそのまま利用し、新規追加するprefetch_hintエンドポイントとJS側のプリフェッチ関数はオプトインの追加処理のため、失敗しても(Ajax失敗・非対応ブラウザ含め)本来のゲーム進行には影響しない設計にする(try/catchで握りつぶし、フォールバックとして何もしない)。
- 通信量が心配な環境向けに、設定画面や既存の音量設定パネル付近に「先読みを無効化」チェックボックス(localStorage保存)を追加し、モバイル回線ユーザーがオフにできるようにする。
💬 返信 (3)
🛠 開発を開始しました (機能追加 rpg-story-forge)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
ご要望いただいた「RPGストーリーフォージ AI風ドット絵冒険」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=rpg-story-forge
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/rpg-story-forge/
ご利用ありがとうございます!
Echo
Iris