Description
概要
user_island_imageのバイナリデータ保存をやめた
base_layout_json longtext COMMENT '島レイアウト情報(JSON)',
lv_layout_json longtext COMMENT '島レイアウト情報(レベル付きJSON)',
ALTER TABLE user_island_image
ADD COLUMN `base_layout_json` longtext NOT NULL COMMENT '島レイアウト情報(JSON)' AFTER `lv_image_blob`,
ADD COLUMN `lv_layout_json` longtext NOT NULL COMMENT '島レイアウト情報(レベル付きJSON)' AFTER `base_layout_json`;備考
- [x] キャッシュが効かなくなることで毎回描画する必要がありCPU負荷が上がる恐れがある
- [x] 現状は形式のみの変更ユーザー側でレンダリングする場合、環境により動作が怪しくなることが懸念
↓
- [x] フロント側で描画するように修正を反映
- [x] canvasは既存で使っているものであるので問題がないと判断
- [x] サーバー側でレンダリングするかはdefine_y,define_gesoten ENABLE_SERVER_ISLAND_IMAGE_GENERATIONでフラグ切り替え
- [x] 島画像の参照をpublic_httml/img/island_img以下に
対応詳細
概要
user_island_image テーブルに base_layout_json / lv_layout_json の 2 カラムを追加し、島レイアウトをバイナリ画像ではなく JSON で保存する方式へ移行しました。
これに伴い、サーバー側での JPEG 合成はフラグで制御しつつ、基本はフロントエンドの Canvas 描画へ切り替えています。
バックエンド側の対応
S_GetUserIslandLayoutDataEnsured() を新設し、JSON が無ければサーバーで再生成→再取得する安全網を作成。
各種 lib/public/* や lib/ajax/* の島関連レスポンスに island_layout(base / lv 両方)と updated_at を必ず含めるよう統一。
define_y.inc / define_gesoten.inc に ENABLE_SERVER_ISLAND_IMAGE_GENERATION を追加し、環境ごとにサーバー描画を ON/OFF 切り替え可能に。
画像参照パスを public_html/img/island_img/ 配下へ集約し、レガシー JPEG はフォールバック用途のみに整理。
フロントエンド側の対応
Main.tpl / Build.tpl / Friend.tpl など島を表示するテンプレートに <canvas> と island_layout JSON の埋め込み <script> を追加。初期ロード時点で Canvas 描画が走るように変更。
public_html/js/JOLLYROGER.js と jr_main.js に JRIslandLayout を利用した描画処理を実装。recordBundleSize → registerBundle → renderFromStore → renderToImage の流れで Canvas と静的画像を同期し、失敗時は showFallback で JPEG に退避。
フォールバック画像は data-legacy-src と JRIslandLayout.updateFallbackSource で管理し、AJAX 更新後も常に最新状態を維持。renderToImage で生成した data URL は従来の <img> 要素へ流し込み、ブラウザバック時も崩れないよう Promise 失敗ハンドリングを追加。
Canvas コンテナには aspect-ratio: 640 / 803 を付与し、旧 JPEG と同じアスペクト比でスケーリングするよう CSS を調整。