リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
マップ移動時のDB保存を間引き、セッションバッファ経由に変更してレスポンスをさらに高速化
1. 目的:
現在はマップ移動のたびに『Ajax応答の即時返却+バックグラウンド保存』でrpgsf_save_statesへstate_jsonをUPDATEしているが、単純な歩行移動が連続する場面でも毎回DB書き込み(MEDIUMTEXTのUPDATE)が走っており、サーバー負荷とディスクI/O待ちが応答速度のボトルネックになりうる。歩行だけの区間はDB書き込みを間引き、イベント発生時と一定間隔のみ書き込むことで、体感速度とDB負荷を同時に改善する。
2. 具体的仕様:
- lib.php にセッションベースの状態バッファを追加する。マップ移動系Ajaxハンドラ(pages/play.php 内の移動処理)では、まず $_SESSION['rpgsf_state_buffer'][$scenario_id] に最新state配列をキャッシュし、以下の条件のいずれかを満たす時だけ実際にrpgsf_save_state()でDB UPDATEを実行する。
a) 戦闘開始・戦闘終了・宝箱開封・NPC会話・レベルアップ・エリア切替(サブマップ入退場)・ショップ入店などの『イベント系アクション』が発生した
b) 前回DB保存時刻から一定秒数(例: 20秒)以上経過している
c) 前回DB保存から一定回数(例: 8回)以上の移動アクションが蓄積している
d) ユーザーが手動セーブ(スロット1-3)、または『冒険の書』へ保存操作を行った(既存機能、常に即時保存)
- 単純な歩行移動のみが続く間はDB書き込みをスキップし、Ajax応答はこれまで通り即時に返す(体感速度は変わらないか向上)。
- ページ離脱・タブを閉じる際のデータロストを防ぐため、window の beforeunload / pagehide イベントで navigator.sendBeacon() を使い、最終stateを保存する軽量エンドポイント(例: play.php?ajax=flush_state)を追加する。sendBeaconが使えない環境ではfetch(..., {keepalive:true})にフォールバックする。
- サーバー側では、間引き判定用にrpgsf_save_states テーブルの既存カラムを流用し(新規カラム追加は行わず、PHP側のセッション変数のみで前回保存時刻・移動カウントを管理)、実装を最小限にする。
- 間引き中でも state 自体は毎回セッションに反映されるため、プレイヤーの見た目の動作・進行ログ・戦闘結果は従来通り即座に反映される。DBに書き込まれるタイミングが遅れるだけで、ゲームプレイ体験に変化はない。
3. 既存機能との整合:
- 手動セーブ(スロット1-3)・自動セーブ(slot_no=0)・共有URL・図鑑・旅の記憶帳など、既存の保存/読込フローには一切手を加えず、間引きロジックはあくまで『通常の歩行移動時にDB書き込みを遅延させる』追加レイヤーとして実装する。
- 万一サーバー再起動やセッション切れでバッファが失われても、直近のDB保存内容から再開できるため、最悪の場合の後退距離は数手分の移動のみに限定される。
- 既存の『Ajax応答の即時返却+バックグラウンド保存』の仕組みはそのまま活かし、その中でDB書き込みを実行するかどうかの条件分岐を追加するだけなので、後方互換性は保たれる。
現在はマップ移動のたびに『Ajax応答の即時返却+バックグラウンド保存』でrpgsf_save_statesへstate_jsonをUPDATEしているが、単純な歩行移動が連続する場面でも毎回DB書き込み(MEDIUMTEXTのUPDATE)が走っており、サーバー負荷とディスクI/O待ちが応答速度のボトルネックになりうる。歩行だけの区間はDB書き込みを間引き、イベント発生時と一定間隔のみ書き込むことで、体感速度とDB負荷を同時に改善する。
2. 具体的仕様:
- lib.php にセッションベースの状態バッファを追加する。マップ移動系Ajaxハンドラ(pages/play.php 内の移動処理)では、まず $_SESSION['rpgsf_state_buffer'][$scenario_id] に最新state配列をキャッシュし、以下の条件のいずれかを満たす時だけ実際にrpgsf_save_state()でDB UPDATEを実行する。
a) 戦闘開始・戦闘終了・宝箱開封・NPC会話・レベルアップ・エリア切替(サブマップ入退場)・ショップ入店などの『イベント系アクション』が発生した
b) 前回DB保存時刻から一定秒数(例: 20秒)以上経過している
c) 前回DB保存から一定回数(例: 8回)以上の移動アクションが蓄積している
d) ユーザーが手動セーブ(スロット1-3)、または『冒険の書』へ保存操作を行った(既存機能、常に即時保存)
- 単純な歩行移動のみが続く間はDB書き込みをスキップし、Ajax応答はこれまで通り即時に返す(体感速度は変わらないか向上)。
- ページ離脱・タブを閉じる際のデータロストを防ぐため、window の beforeunload / pagehide イベントで navigator.sendBeacon() を使い、最終stateを保存する軽量エンドポイント(例: play.php?ajax=flush_state)を追加する。sendBeaconが使えない環境ではfetch(..., {keepalive:true})にフォールバックする。
- サーバー側では、間引き判定用にrpgsf_save_states テーブルの既存カラムを流用し(新規カラム追加は行わず、PHP側のセッション変数のみで前回保存時刻・移動カウントを管理)、実装を最小限にする。
- 間引き中でも state 自体は毎回セッションに反映されるため、プレイヤーの見た目の動作・進行ログ・戦闘結果は従来通り即座に反映される。DBに書き込まれるタイミングが遅れるだけで、ゲームプレイ体験に変化はない。
3. 既存機能との整合:
- 手動セーブ(スロット1-3)・自動セーブ(slot_no=0)・共有URL・図鑑・旅の記憶帳など、既存の保存/読込フローには一切手を加えず、間引きロジックはあくまで『通常の歩行移動時にDB書き込みを遅延させる』追加レイヤーとして実装する。
- 万一サーバー再起動やセッション切れでバッファが失われても、直近のDB保存内容から再開できるため、最悪の場合の後退距離は数手分の移動のみに限定される。
- 既存の『Ajax応答の即時返却+バックグラウンド保存』の仕組みはそのまま活かし、その中でDB書き込みを実行するかどうかの条件分岐を追加するだけなので、後方互換性は保たれる。
💬 返信 (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