リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
マップCanvas描画の差分レンダリング化による移動・操作の体感速度向上
1. 目的:
これまでの改善でサーバー側(Ajax応答・DB書き込み・APCu/IndexedDBキャッシュ)は十分高速化済みだが、クライアント側のマップ描画処理(Canvasへの毎フレーム全面再描画)がボトルネックとして残っている。特にスマホや低スペック端末では、256x256タイルのワールドマップを移動するたびにビューポート全体のタイル・天候演出・キャラクター・地名ラベルを毎回フルスクラッチで描き直しており、方向キー連打時にコマ落ちが発生しやすい。Canvas描画をレイヤー分離・差分更新方式に切り替え、体感速度をさらに向上させる。
2. 具体的な仕様:
- マップ描画用Canvasを2枚以上のレイヤーに分離する: (a) 地形タイル+訪問済みマーカーを描く「背景レイヤー(オフスクリーンCanvas)」、(b) プレイヤー・NPC・敵アイコン・天候演出・地名ラベルを描く「前景レイヤー」。
- プレイヤーが1タイル分だけ移動した場合、背景レイヤーは全面再描画せず、既存オフスクリーンCanvasの内容を`drawImage`でタイル1つ分だけ平行移動コピーし、新たに視界に入った端の1行/1列のタイルのみ再描画する(既存のサーバー側「新規に見える行・列だけの差分キャッシュ更新」と対になるクライアント描画側の最適化)。
- 前景レイヤー(常に変化するキャラクター・天候パーティクル)は`requestAnimationFrame`でのみ再描画し、同一フレーム内で複数回呼ばれないよう`dirty`フラグで間引く。移動していない待機中はキャラクターのアイドルアニメーションのみ低頻度(例: 250ms間隔)で再描画し、無駄なフレーム処理を止める。
- タブが非アクティブ(`document.hidden`)の間は`requestAnimationFrame`ループを一時停止し、復帰時に再開する。
- 既存のマップタイル画像・WebP変換・IndexedDBキャッシュ・訪問済みタイル記録・スプライトシート・音声処理・Ajax通信仕様は変更しない。あくまで既に取得済みのタイル/画像データをどうCanvasに描くかというクライアント描画ロジックの最適化であり、サーバーAPIやDBスキーマへの変更は不要。
- サブマップ・戦闘画面のCanvas描画には影響を与えず、対象はワールドマップ・サブマップの移動時描画処理に限定する。
3. 既存機能との整合:
- 描画結果(タイル配置、キャラクター位置、天候演出、地名ラベル)は現状と完全に同一に保ち、見た目の変更はなし。
- 既存の予測描画・連打時の最新操作反映ロジック、Service Workerキャッシュ、Ajax差分キャッシュとは独立した層で動作するため、既存の高速化施策と競合しない。
- PC/スマホ双方のタッチ操作・方向パッド・キーボード操作いずれにも同様に適用可能で、後方互換を維持する。
これまでの改善でサーバー側(Ajax応答・DB書き込み・APCu/IndexedDBキャッシュ)は十分高速化済みだが、クライアント側のマップ描画処理(Canvasへの毎フレーム全面再描画)がボトルネックとして残っている。特にスマホや低スペック端末では、256x256タイルのワールドマップを移動するたびにビューポート全体のタイル・天候演出・キャラクター・地名ラベルを毎回フルスクラッチで描き直しており、方向キー連打時にコマ落ちが発生しやすい。Canvas描画をレイヤー分離・差分更新方式に切り替え、体感速度をさらに向上させる。
2. 具体的な仕様:
- マップ描画用Canvasを2枚以上のレイヤーに分離する: (a) 地形タイル+訪問済みマーカーを描く「背景レイヤー(オフスクリーンCanvas)」、(b) プレイヤー・NPC・敵アイコン・天候演出・地名ラベルを描く「前景レイヤー」。
- プレイヤーが1タイル分だけ移動した場合、背景レイヤーは全面再描画せず、既存オフスクリーンCanvasの内容を`drawImage`でタイル1つ分だけ平行移動コピーし、新たに視界に入った端の1行/1列のタイルのみ再描画する(既存のサーバー側「新規に見える行・列だけの差分キャッシュ更新」と対になるクライアント描画側の最適化)。
- 前景レイヤー(常に変化するキャラクター・天候パーティクル)は`requestAnimationFrame`でのみ再描画し、同一フレーム内で複数回呼ばれないよう`dirty`フラグで間引く。移動していない待機中はキャラクターのアイドルアニメーションのみ低頻度(例: 250ms間隔)で再描画し、無駄なフレーム処理を止める。
- タブが非アクティブ(`document.hidden`)の間は`requestAnimationFrame`ループを一時停止し、復帰時に再開する。
- 既存のマップタイル画像・WebP変換・IndexedDBキャッシュ・訪問済みタイル記録・スプライトシート・音声処理・Ajax通信仕様は変更しない。あくまで既に取得済みのタイル/画像データをどうCanvasに描くかというクライアント描画ロジックの最適化であり、サーバーAPIやDBスキーマへの変更は不要。
- サブマップ・戦闘画面のCanvas描画には影響を与えず、対象はワールドマップ・サブマップの移動時描画処理に限定する。
3. 既存機能との整合:
- 描画結果(タイル配置、キャラクター位置、天候演出、地名ラベル)は現状と完全に同一に保ち、見た目の変更はなし。
- 既存の予測描画・連打時の最新操作反映ロジック、Service Workerキャッシュ、Ajax差分キャッシュとは独立した層で動作するため、既存の高速化施策と競合しない。
- PC/スマホ双方のタッチ操作・方向パッド・キーボード操作いずれにも同様に適用可能で、後方互換を維持する。
💬 返信 (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