| 遊戲物件 | 渲染技術 | Adapter / Renderer | Draw Call | 說明 |
|---|---|---|---|---|
| 殭屍 (Zombie) 6 種類型,最多 200 隻 |
GPU Instanced SkinnedMesh | ZombieAdapter + InstancedMesh2 (@three.ez/instanced-mesh) |
6(每 type 1 call) | FBX 模型 + 骨骼動畫,每 instance 獨立 pose via setBonesAt() |
| 陀螺 (Top) 玩家角色 |
Canvas 2D Sprite | EntityRenderer (legacy) EntitySpriteAdapter (WebGL WIP) |
每隻 1 (legacy) | 預生成 sprite → drawImage,每幀位置/旋轉更新 |
| 場景背景 多張拼接地圖 |
WebGL BackgroundTechnique | ArenaAdapter + BackgroundTechnique | 1-2 | 靜態貼圖 plane,cover/partial 顯示模式,已整合至 WebGL 管線 |
| 障礙物 (Barrel) | Canvas 2D Sprite | EntityRenderer | 每個 1 | 炸彈桶 sprite + 警示燈 gradient |
| 混凝土方塊 | Canvas 2D Shape | EntityRenderer | 每個 1 | fillRect + strokeRect + 螺絲細節,靜態物件 |
| 票券 (Ticket) | Canvas 2D Shape+Text | EntityRenderer | 每個 1 | 彩虹 gradient 背景 + 數字文字,旋轉動畫 |
| 粒子特效 8 種子型別 |
Canvas 2D Path | EffectRenderer | 每粒子 1 | 電弧 / 爪痕 / 電鋸火花 / 星形爆炸 等 |
| 衝擊波 (Shockwave) | Canvas 2D Arc | EffectRenderer | 每個 1 | 動態半徑 circle stroke |
| 斬擊線 / X斬 | Canvas 2D Path | EffectRenderer | 每個 1 | 路徑線段 stroke |
| 投射物 (Projectile) | Canvas 2D Shape | EffectRenderer | 每個 1 | 能量彈 / 彩虹光束 |
| Boss 預警區域 8 種型態 |
Canvas 2D Shape | EntityRenderer | 每個 1 | 衝刺通道(rect) / 炸彈圈(circle) / 地震圈 / 瞄準十字 |
| 浮動文字 | Canvas 2D fillText | EffectRenderer | 每個 1 | 傷害數字、狀態提示(TextComponent 策略已就緒) |
| UI(血條/計分) | HTML/CSS Overlay | UIRenderer (Canvas 2D) 未來遷移至 HTML DOM |
— | 不在 WebGL 場景中 |
| Layer | Order | 內容 | Blending |
|---|---|---|---|
| background | 0 | 場景背景圖、裝飾石頭 | Opaque |
| entities | 10 | 殭屍 (InstancedMesh) + 陀螺/障礙物/票券 (Sprite) | Opaque |
| effects | 20 | 粒子、衝擊波、斬擊線 | Transparent / Additive |
| UI | — | 血條、文字、計時器 | Canvas 2D / HTML overlay |
| 技術 / Library | 版本 | 用途 |
|---|---|---|
| Three.js | r185 | WebGL 渲染核心、Scene/Camera/Light |
| @three.ez/instanced-mesh | v0.3.15 | InstancedMesh2:GPU Instancing + 骨骼動畫 per instance |
| Vite | — | Build tool + Dev server + HMR |
| React | — | UI 層(PerfPanel 等設定面板) |
| FBXLoader | Three.js 內建 | 載入 FBX 3D 模型(殭屍) |
| Canvas 2D | 原生 | Legacy 渲染路徑(除殭屍外大部分物件) |
| 指標 | 當前實際 | 目標值 | 說明 |
|---|---|---|---|
| WebGL render call / 幀 | 1 | 1 | ✅ 已達成 |
| Draw Calls 總計 | 6 (殭屍) + legacy | < 15 | 殭屍已優化,其餘仍在 Canvas 2D |
| Frame Time | 25-33ms (多人時) | < 8ms | 目標設備:中低階 Android |
| FPS(單人) | 30-40 | ≥ 60 | 當前偏低 |
| FPS(多人) | 20-30 | ≥ 30 | 多位玩家加入後下降明顯 |
@three.ez/instanced-mesh (InstancedMesh2) 處理 SkinnedMesh 的 batch 功能three-instanced-animation 依賴 three@0.159,與專案使用的 r185 不相容determinantAffine 方法缺失@three.ez/instanced-mesh@three.ez/instanced-mesh 的 import 路徑(three/addons/)需要 Vite alias 才能解析web/src/game/configs/enemies/ 等設定檔結構規劃,但尚未完全落實checkCollision、resolveCircleBoxCollision 等方法MeshStandardMaterial 搭配 Three.js 內建燈光系統,與 Canvas 2D 直接貼圖的視覺效果不同| 階段 | 內容 | 狀態 | 備註 |
|---|---|---|---|
| Pipeline Core | WebGLRenderer + LayerSystem + CameraSystem | ✅ 完成 | render loop / 分層 / 排序 / resize |
| Zombie Instanced Mesh | 6 種殭屍 GPU Instancing + 骨骼動畫 | ✅ 完成 | 6 draw calls 畫完全部殭屍 |
| DisplaySystem 框架 | Sprite/Shape/Text Component + Strategy 模式 | ⚠️ 框架完成但未接線 | _createStrategy 回傳 null |
| Background (WebGL) | ArenaAdapter + BackgroundTechnique | ✅ 完成 | 背景 plane 已整合至 WebGL pipeline |
| Top Sprite (WebGL) | EntitySpriteAdapter 玩家陀螺 | ❌ 未完成 | 仍用 Canvas 2D |
| Effects (WebGL) | 粒子/衝擊波/斬擊線 | ❌ 未完成 | 仍用 Canvas 2D |
| UI 遷移 | HP bars / Timer / Score | ❌ 未完成 | 計畫改為 HTML overlay |
| 資料與邏輯分離 | JSON 設定檔抽離(enemies / scenes / entities) | ❌ 未落實 | 結構已設計,尚未全面套用 |
1. 碰撞效能調查:Profile 碰撞系統,確認是否為 O(N²) 問題,優先加入 Spatial Hash Grid
2. 碰撞卡頓修正:檢查碰撞響應的位移修正邏輯,可能需要 lerp 過渡
3. 色彩一致性:統一 WebGL 與 Canvas 2D 的色彩空間設定
1. 資料分離:將怪物、場景、物件設定全部抽為 JSON 設定檔
2. 完成 DisplaySystem 接線:讓 SpriteComponent / ShapeComponent 的策略生效
3. 遷移 P0 物件(Top sprite、Barrel sprite、PhantomClone、Afterimage)到 WebGL
1. 完成所有渲染物件到 WebGL 管線的遷移
2. 移除 Canvas 2D legacy 渲染路徑(UI 除外)
3. 建立架構規範文件,確保 Google AI Studio 和其他 AI 工具修改時遵守分層原則