リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: RPGストーリーフォージ AI風ドット絵冒険
マップ移動のCanvas描画をオフスクリーンバッファリングとダーティフラグで高速化
## 1. 目的
256×256タイルの広大なワールドマップと複数サブマップをCanvas描画する際、毎フレーム全タイルを再描画しているため、移動時のフレームレートが低下しやすい。オフスクリーンCanvas(バックバッファ)と「ダーティフラグ」方式を導入し、変化のあった領域だけを再描画することで、マップ移動・スクロール全体の描画速度を大幅に改善する。
## 2. 具体的な仕様
### 2-1. オフスクリーンCanvas(地形レイヤー)のキャッシュ
- ページロード時(またはマップ切替時)に `OffscreenCanvas`(非対応ブラウザは通常のCanvas要素をdisplay:noneで生成)へ、地形タイル全体を一度だけ描画してキャッシュする。
- メインCanvasへの描画は「キャッシュCanvasの必要ビューポート範囲をdrawImageで貼り付け」→「プレイヤー・NPC・イベントオブジェクトだけを上書き描画」の2ステップに分離する。
- マップ遷移・天候変化・地形変化イベント発生時のみキャッシュを再生成するフラグ `terrainDirty = true` を立てる。
### 2-2. ダーティフラグによる差分描画
- プレイヤー移動1歩ごとにビューポートが1タイル分ずれるだけなので、地形キャッシュCanvas上の「前フレームのビューポート矩形」と「今フレームのビューポート矩形」のXOR差分(左右または上下1列分のみ)だけを再描画する。
- オブジェクトレイヤー(プレイヤー・NPC・宝箱・モンスター表示・天候エフェクト)は毎フレーム前回描画位置をclearRect→再描画するが、地形レイヤーへのclearRectは行わない。
### 2-3. requestAnimationFrameループの最適化
- 現状の`setInterval`または同期的な描画呼び出しを`requestAnimationFrame`ベースのゲームループに統一する(既にrAFを使用している場合はスキップ)。
- 移動入力がない・天候変化なし・アニメーション完了の静止フレームは `needsRedraw` フラグで描画をスキップし、CPU使用率を下げる。
### 2-4. タイル画像のスプライトシート化(任意・効果大)
- 現状16px個別タイルを複数回`drawImage`している場合、全地形タイルを1枚の `tileset.png`(スプライトシート)にまとめ、`drawImage(img, sx, sy, 16, 16, dx, dy, 16, 16)` の形式で描画する。
- これによりHTTPリクエスト数削減と、ブラウザのテクスチャキャッシュヒット率向上を図る。
- 既存のタイルPNGアセットはそのまま維持し、スプライトシートは `assets/tileset_world.png` / `assets/tileset_sub.png` として別途生成する。既存単体PNGへのフォールバックを残して後方互換を保つ。
### 2-5. ミニマップの更新頻度削減
- ミニマップCanvasは移動のたびに全256×256を再描画せず、「新規訪問タイルが増えたとき」と「マップ切替時」のみ再描画する(`minimapDirty`フラグ)。
- プレイヤーカーソルのみ毎フレーム上書き描画する。
## 3. 既存機能との整合(壊さない点)
- 天候・時間帯エフェクト(雨・雪・霧・夕暮れ・夜)はオブジェクトレイヤー上に重ねて描画するため、地形キャッシュには含めない。`terrainDirty`フラグで天候変化時はキャッシュ再生成。
- NPC接触・宝箱開封・イベントタイル踏み込みのロジックはCanvas描画と分離されているため影響なし。
- セーブ/ロード・戦闘切替・サブマップ遷移時は `terrainDirty = true` を必ず立てて、キャッシュを確実に再生成する。
- スマホ/PCどちらでもrAFループは動作するため、スマホ対応に影響なし。
- PHPサーバーサイドの処理(シナリオ生成・DBアクセス)は一切変更しない。
## 4. 実装ファイルと変更範囲
- `pages/play.php` 内のインラインJS(またはインクルードされる `assets/js/game.js` 相当ファイル)の描画ループ部分のみ改修。
- `assets/tileset_world.png` / `assets/tileset_sub.png` を新規追加(スプライトシート化を採用する場合)。
- PHPファイル・DBスキーマ・既存アセットPNGへの変更なし。
256×256タイルの広大なワールドマップと複数サブマップをCanvas描画する際、毎フレーム全タイルを再描画しているため、移動時のフレームレートが低下しやすい。オフスクリーンCanvas(バックバッファ)と「ダーティフラグ」方式を導入し、変化のあった領域だけを再描画することで、マップ移動・スクロール全体の描画速度を大幅に改善する。
## 2. 具体的な仕様
### 2-1. オフスクリーンCanvas(地形レイヤー)のキャッシュ
- ページロード時(またはマップ切替時)に `OffscreenCanvas`(非対応ブラウザは通常のCanvas要素をdisplay:noneで生成)へ、地形タイル全体を一度だけ描画してキャッシュする。
- メインCanvasへの描画は「キャッシュCanvasの必要ビューポート範囲をdrawImageで貼り付け」→「プレイヤー・NPC・イベントオブジェクトだけを上書き描画」の2ステップに分離する。
- マップ遷移・天候変化・地形変化イベント発生時のみキャッシュを再生成するフラグ `terrainDirty = true` を立てる。
### 2-2. ダーティフラグによる差分描画
- プレイヤー移動1歩ごとにビューポートが1タイル分ずれるだけなので、地形キャッシュCanvas上の「前フレームのビューポート矩形」と「今フレームのビューポート矩形」のXOR差分(左右または上下1列分のみ)だけを再描画する。
- オブジェクトレイヤー(プレイヤー・NPC・宝箱・モンスター表示・天候エフェクト)は毎フレーム前回描画位置をclearRect→再描画するが、地形レイヤーへのclearRectは行わない。
### 2-3. requestAnimationFrameループの最適化
- 現状の`setInterval`または同期的な描画呼び出しを`requestAnimationFrame`ベースのゲームループに統一する(既にrAFを使用している場合はスキップ)。
- 移動入力がない・天候変化なし・アニメーション完了の静止フレームは `needsRedraw` フラグで描画をスキップし、CPU使用率を下げる。
### 2-4. タイル画像のスプライトシート化(任意・効果大)
- 現状16px個別タイルを複数回`drawImage`している場合、全地形タイルを1枚の `tileset.png`(スプライトシート)にまとめ、`drawImage(img, sx, sy, 16, 16, dx, dy, 16, 16)` の形式で描画する。
- これによりHTTPリクエスト数削減と、ブラウザのテクスチャキャッシュヒット率向上を図る。
- 既存のタイルPNGアセットはそのまま維持し、スプライトシートは `assets/tileset_world.png` / `assets/tileset_sub.png` として別途生成する。既存単体PNGへのフォールバックを残して後方互換を保つ。
### 2-5. ミニマップの更新頻度削減
- ミニマップCanvasは移動のたびに全256×256を再描画せず、「新規訪問タイルが増えたとき」と「マップ切替時」のみ再描画する(`minimapDirty`フラグ)。
- プレイヤーカーソルのみ毎フレーム上書き描画する。
## 3. 既存機能との整合(壊さない点)
- 天候・時間帯エフェクト(雨・雪・霧・夕暮れ・夜)はオブジェクトレイヤー上に重ねて描画するため、地形キャッシュには含めない。`terrainDirty`フラグで天候変化時はキャッシュ再生成。
- NPC接触・宝箱開封・イベントタイル踏み込みのロジックはCanvas描画と分離されているため影響なし。
- セーブ/ロード・戦闘切替・サブマップ遷移時は `terrainDirty = true` を必ず立てて、キャッシュを確実に再生成する。
- スマホ/PCどちらでもrAFループは動作するため、スマホ対応に影響なし。
- PHPサーバーサイドの処理(シナリオ生成・DBアクセス)は一切変更しない。
## 4. 実装ファイルと変更範囲
- `pages/play.php` 内のインラインJS(またはインクルードされる `assets/js/game.js` 相当ファイル)の描画ループ部分のみ改修。
- `assets/tileset_world.png` / `assets/tileset_sub.png` を新規追加(スプライトシート化を採用する場合)。
- PHPファイル・DBスキーマ・既存アセットPNGへの変更なし。
💬 返信 (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