リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
ワールドマップ移動APIの差分レスポンス化と訪問済みタイルのビットセット圧縮による高速化
1. 目的:
これまでオプティミスティック移動やCanvasオフスクリーンバッファリングなどクライアント描画側は高速化済みだが、移動のたびにサーバーへ送受信されるstate_json(訪問済みタイル一覧・ワールド256×256データ)自体のペイロードとDB書き込み量が大きいままで、通信・保存処理がボトルネックになっている。ここを削減しさらなる体感速度向上を狙う。
2. 具体的仕様:
- 移動系Ajaxエンドポイント(pages/play.php内の移動処理APIなど)のレスポンスJSONに、既存の`state`全量に加えて`visited_delta`(今回の移動で新たに訪問した座標配列のみ、最大でも数件)を付与する。サーバー側では現stateのvisited集合と比較し新規分だけを算出する。
- クライアントJSは`visited_delta`が存在する場合、ローカルのvisitedTiles/ミニマップ描画キャッシュへ差分マージのみ行い、既存のダーティフラグ機構で該当タイルだけ再描画する。`visited_delta`が無い場合(旧キャッシュ・互換性維持のため)は従来通りfull stateから再構築するフォールバック処理を残す。
- サーバー保存側では、state_json内のvisited_tilesを「[[x,y],...]座標配列」から「256×256=65536bitのビットセットをbase64エンコードした固定長文字列」に変換して保存する関数を追加する。読み込み時、既存セーブが旧配列形式の場合は自動変換して透過的に扱う(rpgsf_normalize_visited_tiles()のようなヘルパーを追加し、保存・ロード両方で通す)。これによりMEDIUMTEXTへの書き込みサイズと文字列比較コストを削減し、既存の状態保存デバウンス処理と合わせてDB I/Oを軽くする。
- サブマップ内の訪問済みタイルについても同様の差分応答・ビットセット化を適用する。
3. 既存機能との整合:
- レスポンス構造は既存フィールドを維持したまま`visited_delta`を追加するだけなので、旧クライアントJS(未更新時)は単に無視して従来通り動作する。
- ビットセット形式への変換は読み込み時に自動判定するため、既存のrpgsf_save_states内の過去セーブデータ・冒険の書スロット・旅の記憶帳データも壊れず引き続き読み込める。
- ミニマップ描画・ワールドマップ既訪問タイル表示・図鑑・旅の記憶帳など他機能のロジックは変更せず、内部データ形式の差し替えのみで対応する。
これまでオプティミスティック移動やCanvasオフスクリーンバッファリングなどクライアント描画側は高速化済みだが、移動のたびにサーバーへ送受信されるstate_json(訪問済みタイル一覧・ワールド256×256データ)自体のペイロードとDB書き込み量が大きいままで、通信・保存処理がボトルネックになっている。ここを削減しさらなる体感速度向上を狙う。
2. 具体的仕様:
- 移動系Ajaxエンドポイント(pages/play.php内の移動処理APIなど)のレスポンスJSONに、既存の`state`全量に加えて`visited_delta`(今回の移動で新たに訪問した座標配列のみ、最大でも数件)を付与する。サーバー側では現stateのvisited集合と比較し新規分だけを算出する。
- クライアントJSは`visited_delta`が存在する場合、ローカルのvisitedTiles/ミニマップ描画キャッシュへ差分マージのみ行い、既存のダーティフラグ機構で該当タイルだけ再描画する。`visited_delta`が無い場合(旧キャッシュ・互換性維持のため)は従来通りfull stateから再構築するフォールバック処理を残す。
- サーバー保存側では、state_json内のvisited_tilesを「[[x,y],...]座標配列」から「256×256=65536bitのビットセットをbase64エンコードした固定長文字列」に変換して保存する関数を追加する。読み込み時、既存セーブが旧配列形式の場合は自動変換して透過的に扱う(rpgsf_normalize_visited_tiles()のようなヘルパーを追加し、保存・ロード両方で通す)。これによりMEDIUMTEXTへの書き込みサイズと文字列比較コストを削減し、既存の状態保存デバウンス処理と合わせてDB I/Oを軽くする。
- サブマップ内の訪問済みタイルについても同様の差分応答・ビットセット化を適用する。
3. 既存機能との整合:
- レスポンス構造は既存フィールドを維持したまま`visited_delta`を追加するだけなので、旧クライアントJS(未更新時)は単に無視して従来通り動作する。
- ビットセット形式への変換は読み込み時に自動判定するため、既存のrpgsf_save_states内の過去セーブデータ・冒険の書スロット・旅の記憶帳データも壊れず引き続き読み込める。
- ミニマップ描画・ワールドマップ既訪問タイル表示・図鑑・旅の記憶帳など他機能のロジックは変更せず、内部データ形式の差し替えのみで対応する。
💬 返信 (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