🌀 陀螺專案 × AI 網頁遊戲完整報告站・2026-07

心智圖・完整細節版

整份報告,一張圖看完細節

三層全展開:分支 → 章節 → 每個細項。主節點可點跳到該頁。圖很大——放大縮小/左右捲動看。

陀螺專案
× AI 網頁遊戲
🧭 架構總覽
瀏覽器四種能力
DOM=選單/HUDCanvas 2D=2D繪圖/特效WebGL=3D/大量物件Web Audio=音效
瀏覽器五規則
單執行緒(卡50ms=頓50ms)沙箱(不能碰檔案/任意連網)自動播放限制分頁切走節流GC(每幀new物件=卡頓)
什麼是 WebGL
瀏覽器跟 GPU 說話的語言CPU=複雜少量・GPU=簡單海量GPU 五步流水線(shader 在第2/4步)Three.js=只拿渲染層的迷你Unity
七層架構
入口外殼→資源→遊戲邏輯→狀態映射→渲染→輸入→音效儲存邏輯與渲染分離=換渲染不動玩法
WebGL 困難點×10
看不見的失敗(不報錯)座標系數學透明排序效能剖析難(四嫌疑犯)裝置差異資源全手動shader不能console.log進階組合文件少兩世界橋接概念網缺角就卡
一幀之旅(16.7ms)
喚醒→讀輸入→更新邏輯→狀態映射→WebGL渲染→Canvas疊層→合成效能調優=找出超支那一步
🔁 Unity 對照前言
本質差異
Unity=編輯器中心(人操作工具)AI網頁=程式碼中心(AI改・人驗收)所見即所得→快速部屬循環
16 項生態對照
Editor↔瀏覽器C#↔TypeScriptAssetStore↔npmURP↔Three.jsUGUI↔HTML/CSSBuild↔3分鐘上線Profiler↔DevTools…全表見該頁
三個心態轉換
編輯器操作→對AI描述引擎保證品質→流程保證品質通用編輯器→AI造客製小工具
🗺 執行總藍圖(10章45項)
01 渲染與視覺
✅ 怪物/陀螺/場景3D化+20項修復🔵 衝擊波shader(待驗)🟡 依附特效(警示圈/旋風圈/護盾/光環)🟡 特殊粒子7種⚪ 斬擊/X斬/殘影評估🔵 透視調參(等回饋)⚪ 色調統一
02 效能
🟡 VAT怪物動畫(最大效能債)⚪ Draw call審計(現況健康勿過早優化)⚪ 載入瘦身⚪ 記憶體/洩漏soak⚪ 效能分級⚪ FPS遙測
03 內容製作管線
🟡 怪物配置表外部化(團隊試點)⚪ 怪物編輯面板⚪ 特效參數面板⚪ 關卡波次編輯⚪ 資產規範文件
04 UI/UX
⚪ 螢幕UI遷移HTML/CSS⚪ 流程畫面盤點⚪ 多語系⚪ 輸入裝置抽象
05 音效音樂
⚪ 音效觸發表⚪ 音量分軌/機台調校
06 穩定性品質
✅ WebGL context lost恢復⚪ 錯誤蒐集⚪ 測試擴充(錢相關優先)⚪ 相容矩陣⚪ 長跑soak
07 機台整合
🔵 機率水位(碼已落地)⚪ 投幣出票硬體介接⚪ 帳務稽核log⚪ 斷電恢復
08 部署維運
✅ 一鍵部屬+tag⚪ 環境分離dev/prod⚪ kiosk機台部署⚪ 發布checklist
09 團隊流程
✅ 規範R1-R12+wiki🟡 驗收制度化⚪ onboarding包⚪ 工單節奏
10 風險退路
單一依賴→知識全在repo效能誤判→目標機早測瀏覽器變動→鎖版本視覺回歸→R12+tag
📘 基礎篇
引擎做掉了什麼
9子系統對照表+AI難度標記代價=所見即所得換成AI改→人看循環賺到=AI全域可控/零安裝/git覆蓋一切
三種渲染路線
A Canvas2D=快但天花板低B WebGL=效能好門檻高C 混合=過渡務實但有兩張紙問題
特效專章
四種做法選型表衝擊波三改:8MB→256KB→零上傳兩張紙問題完整解釋頻寬紅線判斷準則
四大類避坑
座標系(±45°/粒子噴天)分層雙畫(漏接=消失)效能三來源視覺一致(12/20個坑屬此類)
AI 方法論
AI強:程序視覺/搬移/自查AI盲:視覺驗收/手感/真機效能四步工作流+三件基礎設施
📗 深入篇
特效/Shader解剖
資料流:邏輯發事件→渲染表現衝擊波shader白話拆解AI寫shader四步工作流
效能三問
Draw call現況30~60健康VAT=CPU骨骼歸零(我們是甜蜜點)UI效能已OK・重點是工作流
編輯工具
怪物=配置表+AI造面板美術特效=參數滑桿面板UI=Figma→AI一比一
團隊運作
角色分工+五階段流程四大擔憂正面回應
📋 問題報告(20項)
批次一 首輪6項
背景全黑(canvas不透明)怪物暗(自發光漏抄+死碼+anisotropy)死亡動畫沒演(整隻被跳過)撞擊播錯動作頭朝向(-45°座標換算)沒閃白(資料鏈斷)
批次二 盤點7項
演出全滅(狀態機只搬3態)Boss動畫取錯FBX檔黑殭屍走路=死亡物件雙畫gyro/box未搬(後已完成)尺寸疑縮錯(不動)紫光暈消失(已修)
批次三 實測6項
石頭消失(地面裝飾層漏接)星星消失(同因)對決UI消失雙數字特效錯位(shake三層不同步)打擊感(hit-stop 0.15s)
未解+教訓
⚠️ 撞飛旋風圈微偏(追蹤中)教訓:改死碼/照抄不換算/修進度沒修渲染資格
⚙️ 維護製程
維護的本質改變
知識放 repo 不放人腦養知識庫不是養人遊戲運行不依賴 AI
五大資產
repowiki+規範穩定 tag文件站自動測試AI=工具可替換
維護場景手冊
炸了→退tag(3分鐘)bug→描述→AI證根因數值/資產→不經AIAI中斷→換家/工程師憑文件接手新人→職能路徑腐化→架構盤點
人的最小技能
必備:描述/驗收/回退(半天)保留一位「能讀懂」的人不需要:徒手寫code
三道防線
規範擋重複坑強制知識外化定期架構盤點
開發循環+風險表
6步循環(新需求/bug共用)誠實風險表×5
角色分工
每職能直接對AI下需求排序+上正式=技術負責人拍板AI眼睛不準=視覺驗收鐵律歸人
三軌並行
A程式碼軌(AI)B配置軌(企劃)C資產軌(美術)部屬產線匯合
每日節奏
早15分過需求板白天AI生產下午茶批次驗收(趁熱迭代)收工狀態同步週五半小時回顧
驗收關卡
視覺=美術眼睛玩法=企劃實玩手感=提需求者效能=實機錢相關=測試+雙人核
版本制度
開發版網址/穩定tag/正式版三層commit=開發日誌
異常手冊
做錯方向→一句話打斷炸了→退tag(3分鐘)沒效→先證根因失憶→讀wiki接手
實測數據
高峰日10+工項小項30分鐘上線事故當日恢復20項報告+12規範沉澱
🕹 互動教學(外部)
7 課可玩範例
1 遊戲迴圈(彈跳球)2 操作(鍵盤/拖曳)3 碰撞手感(撞球+閃白)4 分層(誰蓋誰切換)5 粒子(點擊爆花)6 正交vs透視(柱子)7 專案地圖
📖 Unity 手冊(外部)
15 主題 C#↔TS 並排
技術棧地圖GameObject/生命週期/TransformPrefab/Material/Shader/AnimatorCoroutine/Input/UGUI/資源物理步長/Build/Debug/專案結構+4步上手路徑(半天)

狀態標記:✅ 完成|🔵 進行/待驗|🟡 下一波|⚪ 規劃中

架構總覽・看懂網頁遊戲的全貌

什麼是 WebGL?網頁遊戲整體長什麼樣?

四個問題講清楚:瀏覽器給了你什麼、WebGL 到底是什麼、一個網頁遊戲由哪些層組成、每一幀裡發生什麼。

一、瀏覽器給了你什麼:四種「畫面能力」+一台受控電腦

把瀏覽器想成「一台幫使用者把關的電腦」:你的遊戲跑在它的沙箱裡,它給你四種畫東西的能力,各有分工。

能力是什麼擅長陀螺專案怎麼用
DOM(HTML+CSS)網頁本體:按鈕、文字、排版選單、HUD、表單類 UI畫面外框、除錯面板(未來:全部螢幕 UI)
Canvas 2D一塊可程式化的 2D 畫布,用指令畫線/圓/圖2D 遊戲、程序化特效legacy 模式全部畫面;compat 模式的特效/UI 疊層
WebGL跟 GPU 直接對話的通道(見下節)3D、大量物件、高效能3D 怪物/陀螺/背景(compat 的下層)
Web Audio音效引擎:播放/混音/音量BGM、音效SoundSystem(受「使用者先互動才能播」的限制)

瀏覽器同時是「規則制定者」,這些規則 Unity Player 沒有,要記住:

  • 單執行緒:邏輯、渲染指令、UI 全在一條線上跑——某段程式卡 50ms,整個畫面就頓 50ms(沒有背景執行緒可躲)
  • 沙箱:不能碰使用者的檔案系統、不能自由連任意網路(跨域限制)——存檔用 localStorage、對外連線要伺服器允許
  • 自動播放政策:使用者沒點過頁面前,聲音播不出來(我們遊戲開頭要先點一下就是這原因)
  • 分頁切走會節流:切到別的分頁,rAF 停跑——回來時 deltaTime 會爆大,要設上限(對照手冊第 12 題)
  • 記憶體由 GC 管理:跟 C# 一樣有垃圾回收——每幀 new 物件會造成 GC 卡頓(我們的渲染碼都用「重用暫存物件」的寫法)

二、什麼是 WebGL(白話版)

一句話:WebGL 是瀏覽器裡「跟顯示卡(GPU)說話」的標準語言。它不是引擎、不是函式庫——它是一組很低階的指令,讓網頁能命令 GPU 畫三角形。

為什麼需要 GPU?CPU 擅長「複雜但少量」的運算(遊戲邏輯),GPU 擅長「簡單但海量」的運算——螢幕有 200 萬個像素,每個像素每幀都要算顏色,這種「同一件事做 200 萬次」的工作只有 GPU 做得動。Canvas 2D 慢就是因為它主要靠 CPU;我們把怪物搬到 WebGL 就是把這批海量工作交還給 GPU。

GPU 畫一個東西的流水線(理解 shader 在哪裡用)

1 幾何CPU 把「頂點」交給 GPU(模型=一堆三角形的角點)
2 頂點著色器你寫的小程式:算每個頂點最終在螢幕哪裡(位移/旋轉/骨骼/VAT 都在這)
3 光柵化GPU 自動:把三角形攤成一顆顆像素
4 片段著色器你寫的小程式:算每顆像素的顏色(貼圖/光照/我們的衝擊波圓環公式都在這)
5 合成混合透明度、深度測試(誰擋住誰),輸出到畫面

「shader」就是第 2、4 步那兩個你能自己寫的小程式(用 GLSL 語言)。Three.js 的角色:直接用 WebGL 寫遊戲太累(畫一個三角形要 50 行),Three.js 把它包裝成「場景/相機/材質/模型」的人話 API——你可以把 Three.js 理解成「只拿渲染層的迷你 Unity」。

一個判斷準則(本專案反覆用到) 東西要不要進 WebGL,看兩件事:量大嗎?每幀都在變嗎?量大(百隻怪)→ GPU instancing;高頻變化的特效 → shader 公式;量少變化慢(UI、偶爾的特效)→ 留 Canvas/DOM 就好。用錯邊就是我們踩過的「FPS 崩到 20」。

三、一個網頁遊戲的完整架構(以陀螺專案為例)

從上到下七層——右側標注陀螺專案對應的程式碼位置。任何網頁遊戲都是這七層,差別只在各層選什麼技術。

入口與外殼index.html 載入 → React 起畫面外框、選單、畫面狀態機(12 個畫面)index.html / App.tsx
資源層載模型(FBX)、貼圖、音效;載入順序與進度管理public/ + zombieModelLoader
遊戲邏輯層主迴圈+所有玩法:移動/碰撞/AI/技能/計分/機率水位——跟渲染完全分離,是換渲染方式不用動邏輯的原因GameEngine / physics / systems/
狀態映射層翻譯官:把遊戲狀態轉成渲染層要的資料(哪隻怪在哪、播哪段動畫)stateMapper.ts
渲染層三條路:Canvas 2D(legacy)/WebGL 3D(Three.js)/混合(compat)——本專案三條都有,可切換renderers/ + render-pipeline/
輸入層鍵盤/觸控/(未來機台按鈕)→ 統一成按鍵狀態給邏輯層讀App.tsx 鍵盤層
音效層+儲存層事件觸發音效;localStorage 存設定SoundSystem

Unity 對照:這七層就是 Unity 幫你「裝好」的東西攤開來——入口外殼≈啟動場景、資源層≈Assets 匯入、邏輯層≈你的 Scripts、渲染層≈引擎渲染管線、輸入層≈Input System。不用引擎=這七層都看得到、AI 都改得到

四、一幀之內發生什麼(1/60 秒的旅程)

把上面的架構串起來動態看——每秒跑 60 次的完整旅程:

0. 瀏覽器喚醒requestAnimationFrame 叫醒遊戲:「該畫下一格了」(附上時間戳 → 算 deltaTime)
1. 讀輸入看按鍵狀態表:誰按著方向鍵、誰按了技能
2. 更新邏輯GameEngine.update(dt):所有怪移動、碰撞解算、技能計時、特效資料更新、計分——純資料運算,還沒有任何「畫」
3. 狀態映射stateMapper:遊戲狀態 → 渲染資料(這隻怪在 (x,y)、播死亡動畫第 0.3 秒、要閃白)
4a. WebGL 渲染更新 3D 場景(instance 矩陣/骨骼/shader 參數)→ 一批 draw call → GPU 跑五步流水線畫出 3D 層
4b. Canvas 疊層透明畫布上畫特效/血條/數字(CPU 畫圖指令)
5. 瀏覽器合成把 WebGL 層、Canvas 層、DOM UI 按疊放順序合成到螢幕——「兩張紙」的疊放就發生在這一步

整趟必須在 16.7ms 內完成(60fps 的預算)。哪一步超支哪裡就掉幀:第 2 步超支=邏輯太重(怪太多 → 空間分格優化)、第 4a=GPU 或上傳太重(我們的貼圖上傳教訓)、第 4b=CPU 畫太多(特效 3D 化的動機)。效能調優=找出超支的那一步,DevTools Performance 面板就是量這個的。

五、做 WebGL 的困難點(每一條都附我們的對策)

誠實清單——WebGL 難的不是 API,是下面這十件事。全部是本專案親身踩過或正面遭遇的,附上實例與對策,讓困難「可管理」。

困難點難在哪本專案實例對策
1 看不見的失敗(最痛)WebGL 錯了通常不報錯——畫面黑掉/空白/長歪,沒有錯誤訊息可查背景全黑查了一整天(根因只是一個 canvas 不透明設定);頭傾斜「套了沒反應」對照實驗法(改一個變數看差異)+凍結對比+自建除錯面板;規範 R10「先證明程式碼有在跑」
2 座標系與數學軸向慣例(Y-up/Z-up)、弧度制、旋轉疊加順序——錯了畫面「怪但說不出哪怪」頭朝向要 −45° 不是 +45°(座標系共軛換算);粒子噴到天上(把遊戲 Y 當高度)規範 R4:空間數值搬移必先推導、禁照抄;定案的座標慣例寫進 wiki
3 透明與排序半透明物件誰蓋誰是永恆難題(深度寫入×混合×繪製順序三者交互)整個「特效蓋在怪物頭上」問題;renderOrder 5/6/10/20 的分層設計明確的 renderOrder 分層表(規範 R5);透明物件關 depthWrite
4 效能剖析難掉幀嫌疑犯有四個:CPU 準備、GPU 填充、上傳頻寬、GC——要分開量,且瀏覽器看不到 GPU 內部FPS 崩 20 的真兇是「每幀 8MB 貼圖上傳」——DevTools 火焰圖上不直觀判斷準則入規範(高頻變化→shader、不走貼圖上傳);效能只認實機
5 裝置差異不同 GPU/驅動行為不同(精度/擴展/軟渲染 vs 真卡);行動端限制更嚴AI 驗證環境(軟渲染)看不準 3D 細節——視覺驗收必須人眼真機目標機早期實測;機台鎖瀏覽器版本;AI 盲區交人眼(製程鐵律)
6 資源管理全手動貼圖參數(mipmap/anisotropy/色彩空間)、dispose 釋放、context lost——Unity 匯入器做掉的事全要自己來漏設 anisotropy → 貼圖又糊又暗(查很久);ErrorRecovery 處理 context lost資產載入統一走 loader 函式(參數集中設);長跑 soak 測洩漏
7 Shader 除錯原始GLSL 不能 console.log、不能下斷點——只能把中間值「畫成顏色」看;編譯錯誤訊息晦澀衝擊波 4 種變體的公式對齊靠公式推導+人眼對照收斂AI 寫 shader 很快,人眼當 debugger(1~2 輪收斂);複雜效果先拆最小版驗證
8 進階組合題文件少skinning+instancing、VAT 這類組合在 Three.js 生態是邊緣區——官方文件沒有,要讀函式庫源碼bug4 頭傾斜沒生效,最後是讀了 instanced-mesh 函式庫的 setBonesAt 源碼才定位AI 讀源碼能力強(這正是 AI 的主場);結論寫進 wiki 防重查
9 兩個世界的橋接(混合模式特有)WebGL 層與 Canvas/DOM 層的相機、震動、座標、時序要完全同步,差一點就錯位特效跟怪錯位(shake 三層各搖各的);透視開啟後平面特效在邊緣對不上共用同一份相機/震動數值(規範 R6);地面特效搬進 3D 世界治本
10 概念網缺角就卡場景/相機/投影/材質/光照/UV 是一張網——不像 2D 可以邊做邊學,3D 缺一角整個畫面就不對「亮度」一題橫跨材質自發光+貼圖過濾+色彩空間三個概念才修完Unity 團隊有大半概念(本站前言對照補齊語彙);讓 AI 講解+文件站補課
總結給決策者 WebGL 的困難集中在「除錯不可見+細節全手動」,而不是寫不出來。我們的應對已經制度化:規範擋已知坑(R1-R12)、AI 讀源碼與寫實作、人眼當最終 debugger、實機當效能法官——20 個問題全數解決就是這套打法的驗證。

前言・給 Unity 背景的團隊

從 Unity 視角看「AI 直接開發網頁遊戲」

團隊都熟 Unity——這頁把兩種開發方式逐項對照,先建立座標系,後面的報告就好讀了。

一句話講差異的本質 Unity 是「編輯器中心」:人操作編輯器,所見即所得,程式碼只是其中一環。AI 網頁開發是「程式碼中心」:一切都是程式碼與設定檔,AI 直接改、3 分鐘部屬上線、人負責看結果。「所見即所得」被換成「快速部屬+人眼驗收」的循環——工具沒了的部分,用 AI 自建小工具補回來。

逐項對照表

Unity 的做法AI 網頁的做法差異點/注意
Scene 場景編輯器+HierarchyThree.js 場景由程式碼建構;佈局寫在配置或程式裡沒有拖拉擺場景——場景「編輯」要嘛改配置、要嘛叫 AI 做預覽面板
Prefab配置表(JSON)+工廠函式概念相同:資料驅動生成。差在沒有視覺化編輯,見「內容製作管線」章
Inspector 調參數改 JSON/自建網頁參數面板面板由 AI 現做,規格自訂——比 Inspector 更客製但要先做
MonoBehaviour Update()/FixedUpdate()requestAnimationFrame 主迴圈+deltaTime(自寫,已建)單執行緒;邏輯/渲染分離要自己守(我們已分)
Animator 動畫狀態機Three.js AnimationMixer+自寫狀態機沒有視覺化狀態機——我們踩過「狀態機只搬 3 態」的坑(問題報告 #7)
Particle System(視覺化編輯)四種做法選型(CPU畫圖/GPU粒子/shader/貼圖烘焙)特效是最大差異點——見「特效專章」,選錯做法會吃效能(衝擊波三改的教訓)
Material/Shader GraphThree.js 材質+手寫 GLSL(AI 寫)沒有節點圖,但 AI 寫 shader 很快;視覺對齊靠人眼迭代 1-2 輪
UGUI/FairyGUIHTML/CSS(DOM 疊在遊戲畫布上)網頁的主場優勢:UI 生態全球最成熟、美術可直接調
Asset Store/Package Managernpm 生態(Three.js、instanced-mesh 等)選庫由 AI 評估;版本鎖定進 package.json
Build 出包(分鐘~小時)網頁 build+部屬 3 分鐘上線(publish_cf.bat 已建)迭代速度差一個量級——這是 AI 快速開發成立的基礎
Editor Play Mode 即按即測瀏覽器重新整理即測;正式版=網址體感相同;多人同時測=多開網址,不用裝環境
Profiler/Frame Debugger瀏覽器 DevTools+自建 PERF 面板(已建:FPS/切渲染模式/凍結)夠用;FPS 遙測要自建(藍圖 02 章)
C#+組件生命週期TypeScript+模組AI 對兩者都熟;TS 生態的型別檢查已在 CI 流程(tsc)
場景檔/Prefab 的 merge 衝突全部是文字檔,git 完整覆蓋多人/多 AI 協作衝突大幅減少;每步可回退(已建 tag 機制)
授權費+安裝環境零授權;瀏覽器就是執行環境機台部署=kiosk 瀏覽器(藍圖 08 章)
引擎升級風險瀏覽器/函式庫升級風險本質相同;機台鎖版本可控(藍圖 10 章)

對 Unity 團隊的三個心態轉換

1「編輯器操作」→「對 AI 描述」

過去在 Inspector 拖數值、在 Timeline 擺動畫,現在是「跟 AI 說要什麼+給參考」。描述得越像規格,AI 一次到位率越高——這是新的核心技能。

2「引擎保證的品質」→「流程保證的品質」

Unity 幫你把渲染/動畫/物理做對;現在正確性靠:規範(R1-R12)+人眼驗收(凍結對比)+版本保護(tag)。流程就是新的引擎。

3「美術企劃用編輯器」→「美術企劃用 AI 造的小工具」

怪物編輯、特效調參、關卡波次——引擎給的通用編輯器,換成 AI 按你們工作習慣客製的網頁面板(一兩天一個)。工具缺什麼、叫 AI 做什麼。

怎麼讀這份報告 看完本前言 → 讀「執行總藍圖」建立全貌(10 章 45 工項,點開看細節)→ 對哪塊有疑問再進「基礎篇/深入篇」看原理 → 「問題報告」是 20 個實戰坑的存檔,動手前查坑用。

SpinningTop / AI 網頁遊戲

專案執行總藍圖

十個篇章、可逐層展開(點章節 → 點工項看細節)。含你點名的項目+我補上的「你還沒想到的」(標 ✚)。每個工項標狀態/負責/規模。

已完成 進行中 下一波(建議) 規劃中/待排
01渲染與視覺7 項・進行中

把畫面做對做穩——目前主戰場。

怪物/陀螺/場景 3D 化+20 項問題修復

已完成並部屬。完整記錄見 wiki 問題報告+規範 R1-R12。

狀態:完成(tag: stable-fx2d 保護)

特效 3D 化:衝擊波(GPU shader)

4 種變體 shader 程序化、零貼圖上傳。已部屬。

狀態:待你驗 FPS+視覺|負責:AI|驗收:你/美術

特效 3D 化:依附特效(警示圈/旋風圈/Boss 護盾/光環)

技術選型按頻率:變化慢→貼圖烘焙;幾何規則→shader。逐項凍結對比驗收(R12 視覺零改變)。

規模:中(每種 0.5~1 天迭代)|負責:AI+你當眼睛

特效 3D 化:特殊粒子 7 種(星爆/電弧/抓痕/鏈鋸/星火/火花線/三角)

各有專屬 canvas 畫法。billboard 貼圖或 shader 逐型重現,不降級。

規模:中|依賴:依附特效做完的經驗

斬擊/X斬/殘影(空中類)評估

空中特效蓋怪可能是合理的——先評估哪些真的需要進 3D,不盲搬。

規模:小(評估)+中(實作)

透視強度調參

現為輕透視(20)。你回饋「要更立體/更平」,改一個常數即可。

等你回饋一句話

色調統一(木乃伊/猩猩偏亮金)

你排後面的。材質參數微調對齊 2D。

規模:小

02效能6 項・含最大效能債

機台要長時間穩 60fps——效能是驗收條件不是加分項。

VAT:怪物動畫烘進頂點貼圖(最大效能債)

現況「GPU 合批、CPU 逐隻擺骨架」→ CPU 隨怪數線性。VAT 把動畫烘成貼圖、頂點 shader 查表 → CPU 歸零。我們的怪是甜蜜點(動畫段固定、不需混合)。

規模:中型工項(烘焙工具+shader+逐型驗)|負責:AI|建議排效能第一波

Draw call 審計+圖集合併

現況估 30~60/幀(健康)。需要時:特效 quad 改 instanced、貼圖 atlas。別過早優化

觸發條件:實測掉幀且定位到 draw call 時才做

✚ 載入時間與資產瘦身

你沒點名但機台/玩家都有感:FBX/貼圖壓縮(KTX2/Draco)、按需載入、loading 進度畫面。現況首載較肥。

規模:中|量測先行(先看現在載多久多大)

✚ 記憶體預算與洩漏檢查

機台長時間運行(幾天不關)——貼圖/幾何釋放、事件解綁、長跑 soak test(開 24 小時看記憶體曲線)。引擎幫你管的,現在要自己管。

規模:小工具+定期跑

✚ 效能分級(低階機策略)

renderScale 降階已有開關;補「自動偵測掉幀→降級」與機型測試矩陣。

依賴:目標機規格確定

✚ FPS 遙測

正式運轉時回報 FPS/卡頓事件(本地 log 或後端),讓效能退化「被看見」而不是等客訴。

規模:小

03內容製作管線(企劃/美術工具)5 項・團隊化關鍵

沒有引擎編輯器 → 用「配置表+AI 自建面板」補。這章做完,非工程師才進得來。

怪物配置表外部化(建議的團隊試點)

模型/血量/速度/動畫段/票數抽成 JSON——企劃改表即生效,不碰 code。這是驗證「AI 造工具給團隊用」模式的第一步。

規模:小~中|負責:AI 做、企劃用

怪物編輯面板(配置表的圖形介面)

網頁面板:左改參數、右即時預覽(轉視角/播動畫)、存檔寫回 JSON。

規模:中|依賴:配置表先行

特效參數面板(美術用)

顏色/大小/速度/曲線滑桿+即時預覽。美術自調不經工程。

規模:小~中(AI 一兩天)

✚ 關卡/波次編輯

出怪波次、時間軸、場地事件——同樣配置表→面板兩步走。

依賴:怪物配置表模式驗證後複製

✚ 資產規範文件

美術出 FBX/貼圖的規格(軸向/尺寸/命名/目錄/動畫幀段登記表)——我們踩過的「動畫段切錯檔」「軸向搞反」就是沒規範的代價。

規模:小(半天文件)但省未來大量坑

04UI / UX4 項
螢幕 UI 遷移到 HTML/CSS

HUD/選單/計分走 DOM:瀏覽器渲染、美術可直接調、多語系容易。世界內 UI(血條/頭上數字)留遊戲層。

規模:中|收益:美術工作流+維護性

✚ 遊戲流程畫面盤點

標題/選人/結算/待機吸引模式(attract mode,機台必備)——現有 12 個畫面狀態,逐一驗收完成度。

規模:盤點小、補做依結果

✚ 多語系框架

文案抽字串表。走 HTML UI 後這件事變容易。

依賴:出海/多地需求確認

✚ 輸入裝置抽象

鍵盤(現況)/機台按鈕/搖桿的輸入層統一——機台部署前必做。

規模:小~中

05音效音樂 ✚2 項・你沒點到

現有 SoundSystem 能播;缺管理面。

音效資產管理與觸發表

哪個事件配哪個音、音量/優先級/同時發聲上限——配置表模式(同怪物表)。瀏覽器自動播放限制已處理。

規模:小~中

音量分軌與機台環境調校

BGM/SFX 分軌音量、機台喇叭實地調校流程。

依賴:機台部署

06穩定性與品質 ✚5 項・機台級要求

營業機台的標準:當機=停業。引擎不會幫你,全要自建(部分已有)。

WebGL context lost 自動恢復

已有 ErrorRecovery(context 掉了自動回退 legacy 渲染)。

狀態:已有,機台前補實測

前端錯誤蒐集

window.onerror/unhandledrejection 上報(本地檔或後端)——營運中「畫面怪怪的」要有 log 可查。

規模:小

自動化測試擴充

現有 vitest(渲染管線有測試,相機 11 條剛更新過)。補:機率水位計算、碰撞規則等「錢相關」邏輯的測試。

原則:業務邏輯優先,畫面靠人眼

瀏覽器/機種相容矩陣

目標環境定清單(機台用哪個瀏覽器內核鎖版本),避免「瀏覽器自動更新弄壞遊戲」。

依賴:機台環境確定

長跑穩定測試(soak test)

連跑 24-72 小時:記憶體曲線、FPS 衰減、自動重啟機制(看門狗)。

依賴:接近上機時

07後端與機台整合 ✚4 項・彩票機命脈

這是彩票機生意的命脈章節——網頁遊戲只是「前端」,投幣出票對帳才是產品。

機率水位系統(ProbabilityManager)

已搬入並接上票數顯示。待:水位參數的營運調整介面+與後端同步機制確認。

狀態:程式碼已落地|營運面待定義

投幣/出票硬體介接

網頁 ↔ 機台 IO(投幣訊號、票口)——WebSocket/串口橋接服務。既有專案(瓢蟲等)有可參考實作。

規模:中|依賴:機台硬體規格

帳務與稽核 log

投幣/出票/中獎流水必須可稽核、斷電不遺失——本地持久化+回傳。

法規/稽核相關,優先級由業務定

斷線/斷電恢復

遊戲中斷電重開後的狀態恢復策略(吃幣未出票=客訴)。

依賴:帳務設計

08部署與維運 ✚4 項
一鍵部屬(publish_cf.bat)+版本保護(tag)

已建:3 分鐘上線、穩定點 tag 可回退。

狀態:完成

環境分離(dev/測試/正式)

現在只有一個網址=你測的就是最新開發版。上機前要分:開發版隨便炸、正式版只上驗過的 tag。

規模:小(Cloudflare 多環境)

機台端部署形態

kiosk 全螢幕瀏覽器、開機自啟、離線快取(斷網可玩)、遠端更新策略。

依賴:機台環境

版本發布流程(release checklist)

驗收清單→打 tag→部正式環境→現場抽驗。一頁文件。

規模:小

09團隊與流程4 項

深入篇⑤的落地工項化。

AI 協作規範+知識庫(R1-R12 / wiki / 問題報告)

已建立並實測(AI 換模型接手成功)。

狀態:持續維護

驗收流程制度化

把「凍結對比/實機效能/手感回饋」寫成 checklist,美術/企劃加入後照表驗收——不再只靠你一個人當眼睛。

規模:小(半天文件)|時機:團隊成員加入前

成員 onboarding 包

新成員(人或 AI)第一天讀什麼:wiki index→規範→總藍圖(本頁)→自己跑起專案。

材料都有,整理半天

需求→驗收的工單節奏

正式化「一句話需求+參考→AI 方案→部屬→驗收→沉澱」循環:用什麼追(看板/表格)、多久一批。

你定節奏,工具不拘

10風險與退路 ✚4 項
單一 AI/單一人依賴

緩解:知識全在 repo(wiki/規範/commit)——已驗證換 AI 可接手;人的部分靠 onboarding 包。

效能天花板誤判

緩解:目標機早期實測(別等做完);VAT 等大工項做之前先在目標機量基線。

瀏覽器環境變動

緩解:機台鎖瀏覽器版本;web 版訂相容矩陣定期跑。

視覺品質回歸

緩解:R12+凍結對比已制度化;重大改版前打 tag(已在做)。

✚ = 你未點名、我補上的面向・ 細節文件:通盤指南(基礎篇/深入篇 Artifact)・wiki 問題報告與規範 R1-R12・ 特效進度 stages/perf-migration/effects-3d-phase/plan.md・2026-07-10

SpinningTop 實戰教材版

不用遊戲引擎,用 AI 開發網頁遊戲

以陀螺專案 2D→3D 搬移的真實過程為教材:引擎做掉了什麼、網頁怎麼自己做、特效為什麼難、AI 的強項與盲區。給決策者的通盤認知地圖。

① 遊戲引擎到底幫你做掉了什麼

Unity/Cocos 不是「一個工具」,是十幾個子系統的集合。不用引擎,這些全部要自己做(或用零散的網頁函式庫拼)。好消息:每一項 AI 都寫得出來;差別在有些一次就對、有些要跟人來回迭代。

子系統引擎給你的網頁上自己做AI 開發難度
遊戲迴圈Update()/FixedUpdate() 框架requestAnimationFrame + deltaTime + 邏輯/渲染分離容易・一次寫對
渲染管線場景圖、相機、材質、光照全包Canvas 2D 自己畫,或 Three.js 自組場景/相機/材質中等・見②
資產載入拖進編輯器就能用自寫 loader(FBX/貼圖/音效)+載入順序管理容易
骨骼動畫Animator 狀態機、動畫混合Three.js AnimationMixer + 自寫狀態機(哪個狀態播哪段)中等・狀態機是坑(見④)
物理/碰撞物理引擎內建自寫(我們的專案就是自寫圓形碰撞+反彈)中等・手感靠特例調
粒子/特效Particle System 視覺化編輯四種做法自己選(見③)難・本報告重點
UI 系統UGUI/FairyGUIHTML/CSS 疊在遊戲畫布上(反而比引擎好做)容易・網頁的主場
除錯工具編輯器內建 Inspector/Profiler自建除錯面板(我們的 PERF 面板:切渲染模式/凍結畫面/FPS)容易・但要記得做
跨裝置適配解析度方案內建自己處理縮放/DPR/效能分級中等
關鍵認知 不用引擎的真正代價不是「寫不出來」——AI 都寫得出來。代價是:引擎裡「所見即所得」的部分(特效外觀、動畫手感、視覺調校),變成要用「AI 改 → 人看 → 回饋 → 再改」的迭代循環來完成。所以「人當眼睛」的驗收流程是不用引擎開發的核心環節,不是輔助環節。

反過來說:不用引擎賺到什麼

  • AI 可以直接改到每一行——引擎的黑盒子(序列化場景、二進位資產、編輯器操作)AI 碰不到;純程式碼專案 AI 全域可控,這正是「AI 快速開發」成立的前提
  • 零安裝、即點即玩、部屬即上線——我們每次修完 3 分鐘就部屬到網址給你玩,引擎專案做不到這個節奏
  • 版本控制覆蓋一切——所有狀態都在 git 裡(我們的 20+ commits、隨時可退的 tag),引擎的場景檔衝突地獄不存在

② 網頁遊戲的三種渲染路線

我們的專案三種都有(PERF 面板可切),是活教材。

路線 A:Canvas 2D(陀螺專案的原點)

CPU 每幀用畫圖指令(畫線/畫圓/貼圖片)把整個畫面重畫一次。AI 最擅長的路線——所有視覺都是一行行看得懂的畫圖程式。

  • ✅ 開發最快、AI 生成視覺效果的成功率最高、除錯直觀
  • ✅ 「先後順序決定誰蓋誰」——分層直觀(一張紙原理)
  • ❌ 效能天花板:所有東西 CPU 逐幀畫,怪物一多就掉幀(這正是專案要 3D 化的原因)
  • ❌ 沒有真 3D:立體感要靠「離線烘焙」假裝(陀螺專案把 FBX 模型拍成 2D 圖片再播放)

路線 B:WebGL 3D(Three.js)

把模型/材質/燈光放進 3D 場景,GPU 負責畫。效能好、真立體,但要理解 3D 概念。

  • ✅ 效能:100 隻怪 = GPU 一批畫完(我們用 instanced rendering,殭屍再多都一次繪製)
  • ✅ 真 3D:透視、遮擋、光影自然正確
  • ❌ 概念門檻:場景/相機/材質/座標系/骨骼——AI 會寫但「寫錯了人看不出原因」(我們的頭朝向 ±45° 坑,AI 第一次也搬錯)
  • ❌ 視覺調校變抽象:2D 改一行畫圖碼就變,3D 要動材質參數/shader,迭代慢一些

路線 C:混合模式(我們的現況 compat)

3D 場景(背景/怪物/陀螺)+透明 2D 畫布(特效/UI)疊在上面。移轉期的務實選擇,但有結構性代價

  • ✅ 可以漸進搬移:先搬吃效能的(怪物),特效之後慢慢搬
  • 「兩張紙」問題:上層畫布永遠蓋住下層 3D——特效壓在怪物頭上(你抓到的問題),詳見③
  • 分工邊界要人工管理:每個視覺元素只能一邊畫,漏了=消失、兩邊都畫=重複(我們踩過 5 次)
  • ❌ 兩層的相機/震動要同步(踩過:特效跟怪錯位)
給決策者的判斷 新專案若一開始就選「純 WebGL(路線B)+ HTML UI」,就沒有兩張紙問題和分工邊界問題——我們的痛大半來自「從 A 遷移到 B 的過渡期」。但若追求「AI 生成視覺的最快迭代」,A 仍是起步最快的。先 A 後 B 是合理路徑,但要有心理準備:遷移成本 ≈ 重寫渲染層(我們正在付這筆帳,好處是付完就懂了)。

③ 特效專章:四種做法與「兩張紙」問題

特效是「不用引擎」最難的部分——引擎的粒子編輯器幫美術做掉的事,網頁上要在四種技術方案裡選對的用。

四種做法(成本與適用)

做法原理適用代價
1. CPU 程序畫圖
(2D canvas)
每幀用程式畫線/圓/漸層 形狀複雜、變化快、數量少的(星形爆炸、電弧、對決 UI) 吃 CPU;在混合模式下永遠蓋最上層
2. GPU 粒子系統 發射一批粒子,GPU 自己算軌跡 大量小顆粒(打擊碎屑、火花雨) 每顆粒子只能是簡單形狀(點/小貼圖)
3. GPU shader 程序化 用數學公式在顯卡上「算」出圖形 幾何規則+高頻變化的(衝擊波圓環、光圈、虛線圈) 要寫 shader(AI 擅長,但視覺對齊要迭代)
4. 貼圖烘焙
(canvas→texture)
用 2D 畫法畫進小圖,貼到 3D 面片 視覺要求 100% 一致+變化慢的(警示圈) ⚠️ 每幀上傳貼圖有頻寬紅線(見下)

實戰案例:衝擊波的三次改版(頻寬紅線的由來)

V1・全螢幕烘焙整個畫面畫進大貼圖每幀上傳 GPU。每幀 8MB → FPS 崩到 20
V2・局部小貼圖每個特效一張 256px 小圖。上傳量降 30 倍,但高頻變化仍掉 10fps
V3・shader 程序化圓環用數學公式 GPU 直算,每幀只傳幾個數字。零上傳、零掉幀
效能紅線(用 FPS 換來的教訓) 「CPU 畫好的圖每幀送給 GPU」是混合模式的頭號效能殺手。判斷準則:特效「每幀都在變」→ 必須用 GPU 粒子或 shader(做法 2/3);特效「一秒才變一點」→ 才可以用烘焙(做法 4)。這條判斷直接決定特效搬移的技術選型。

「兩張紙」問題:為什麼特效會蓋住怪物

混合模式 = 兩張獨立畫布疊放:下層 WebGL(3D 世界)、上層 Canvas(特效/UI)。同一張紙上可以自由決定先畫誰後畫誰;兩張紙疊著,上面永遠蓋住下面——這是瀏覽器的物理疊放,沒有商量餘地。

所以「特效蓋在怪物頭上」不是 bug,是混合架構的結構性代價。治本 = 把特效搬進 3D 世界內(它就有了「深度」,怪物可以站在特效上面)——這正是我們現在做的事,也是為什麼要一種一種搬(每種特效要按上面四種做法選型重做)。

該留在上層的:資訊類(血條、傷害數字、頭上票數、對決 UI)——這些本來就該蓋在一切之上,是合理的最上層。

④ 我們踩過的坑:四大類避坑地圖

20+ 個實際問題(完整清單見 wiki 問題報告)歸納成四類。新專案或新功能,先對照這四類做設計檢查。

類型一:座標系(最陰險,錯了畫面「怪但說不出哪怪」)

  • 2D 的「Y 往下」vs 3D 的「Y 是高度」——粒子座標照抄直接噴到天上(踩過)
  • 旋轉的疊加順序:同一個「頭上仰 45°」,在模型旋轉之前套要用 −45°(踩過:照抄正 45° 變低頭)
  • 模型自身的中心點偏移:旋轉時身體「繞圈偏擺」(踩過:撞飛時特效對不上怪)
  • 對策:任何空間數值跨系統搬移,要求 AI 先寫出座標系轉換的推導,不准照抄數字

類型二:分層與雙畫(混合模式特有)

  • 每個視覺元素必須「只有一邊畫」——漏接=整層消失(石頭/星星/對決UI 踩過)、兩邊都畫=雙重(頭上數字出現兩個、物件雙畫浪費效能,踩過)
  • 對策:維護一張「誰畫什麼」的分工表(我們的規範 R5),每次新增/搬移視覺元素必登記+凍結對比驗收

類型三:效能(掉幀的三大來源)

  • 貼圖每幀上傳(見③紅線)
  • CPU 逐個畫 vs GPU 批次:大量同類物體必須 instanced(我們的百隻殭屍一次繪製)
  • 隱藏的重複工作:雙畫、每幀 new 物件、每幀重建 canvas(分身特效踩過)
  • 對策:效能問題「只能實機驗」(模擬環境雜訊大於訊號);保留 FPS 顯示;改動後跑一輪真機

類型四:視覺一致性(搬移類工作的最大坑)

  • 「好看」藏在細節調校裡:材質自發光數值、貼圖過濾參數、動畫的哪一段、打擊停頓 0.15 秒——搬架構時這些細節不會自己跟過來(我們 20 個問題裡 12 個屬此類)
  • 對策一:指定「視覺真相源」——舊版能看的地方就是標準答案,AI 必須並排比對而不是憑感覺重做(規範 R1)
  • 對策二:「視覺零改變」原則——搬移不是改風格的機會(規範 R12,你定調的)
  • 對策三:凍結畫面 A/B 對比的驗收流程(規範 R8)

⑤ 用 AI 開發遊戲的方法論

從我們這幾天實際合作模式提煉——這套流程已經在陀螺專案上驗證過一輪。

AI 的強項與盲區(分工的依據)

項目說明
AI 強寫程序化視覺畫圖碼、shader、粒子——給參考就能寫出來
AI 強架構搬移、批次修改狀態機重寫 150 行一次到位、20 項問題逐一根因修復
AI 強自我排查並排讀兩版程式碼找差異、量測數據定位根因(身體偏移 10-30px 是量出來的)
AI 盲視覺驗收AI 的驗證環境看不準 3D 細節(頭朝向那次 AI 自以為修了)——人眼是唯一標準
AI 盲手感打擊感「停一拍」這種東西 AI 不會主動感知——要人描述(你說了 AI 才能對齊)
AI 盲真機效能AI 環境的 FPS 沒參考價值——掉幀只有你玩得出來

已驗證的工作流

1・根因先行不准 AI 猜著改——先並排比對/量測,根因用證據定死再動手(我們前期兩次「改了沒效」都是猜的)
2・小批部屬每批改動獨立 commit+3 分鐘部屬上線→你實機驗→回饋→下一批
3・人眼驗收視覺/手感/效能三件事只認你的實機回饋;你一句話(「旋轉向外移動時偏」)常常就是定位根因的關鍵
4・版本保護穩定點打 tag(stable-fx2d)——AI 可以大膽迭代,玩壞就退

讓 AI 不失憶的三件基礎設施(已建立)

  • 知識庫 wiki——系統知識+問題總報告:新的 AI session 接手先讀,不用重新摸索(wiki/decisions/2d-to-3d-migration-issues.md
  • 規範 R1-R12——踩過的坑變成規則:AI 每次動手前對照,同樣的坑不踩第二次(wiki/conventions/webgl-3d-rendering-rules.md
  • git 紀錄——每個 commit 寫「改了什麼+為什麼」:AI 和人都能考古
總結:AI 快速開發的成立條件 「用 AI 不用引擎」是成立的,我們正在做的就是證明——但它成立的條件不是「AI 很會寫 code」,而是:①人負責眼睛和手感、AI 負責手;②每一個教訓都沉澱成規範讓 AI 遵守;③小批快速部屬讓迭代循環轉起來;④版本保護讓試錯無風險。這四件事我們都已經建好了,後續新功能(或新遊戲)直接沿用這套框架。
教材來源:SpinningTop feat/perf-migration 分支的實戰過程(2026-07)・ 問題總報告 wiki/decisions/2d-to-3d-migration-issues.md・ 規範 wiki/conventions/webgl-3d-rendering-rules.md・ 特效 Phase 進度 stages/perf-migration/effects-3d-phase/plan.md

通盤指南・深入篇

特效與 Shader 的做法、效能手段、編輯工具、團隊運作

回答八個具體問題:特效現況/Shader 怎麼做/待辦盤點/UI 合併/Draw call/怪物合併與 VAT/怪物編輯/美術工作流——最後收斂到「團隊怎麼運作」。

① 現在特效怎麼做(含 Shader 實例解剖)

特效 = 「遊戲邏輯發事件」+「渲染層表現」兩件事。前者從沒變過,我們一直在改的只是後者。

資料流(所有特效共通)

遊戲邏輯層在事件發生時往陣列丟一筆資料,例如撞擊時:shockwaves.push({ x, y, radius, thickness, life, color })。渲染層每幀讀這些陣列去「表現」。改渲染方式完全不動玩法邏輯——這是我們敢一直換渲染做法的原因。

Shader 是什麼(用衝擊波實例講)

Shader 是「跑在顯示卡上的小程式」,分兩段:頂點著色器(決定形狀擺哪)+片段著色器(決定每個像素什麼顏色)。衝擊波的片段著色器核心邏輯翻成白話:

對畫面上這個像素:
1. 算它離特效中心多遠(d)
2. 「離中心的距離」跟「衝擊波當前半徑」差多少?
   差距 < 線寬的一半 → 這個像素在圓環上 → 上色
   否則 → 透明
3. 顏色 = 遊戲傳來的顏色;透明度 = 剩餘壽命比例
(彩虹版:顏色改用「時間 → 色相」的公式流動)
(虛線版:多算「沿著圓弧走了多遠」,每 28px 亮 16px 暗 12px)

每幀 CPU 只要告訴 GPU 幾個數字(中心/半徑/透明度/顏色),幾百萬個像素的判斷全部 GPU 平行算——這就是為什麼 shader 版零掉幀。

「用 AI 寫 shader」的實際工作流(已跑通)

步驟誰做內容
1 指定標準「跟 2D 版一樣」+指出 2D 的繪製程式碼位置(視覺真相源)
2 翻譯成公式AI把 2D 畫圖邏輯(漸層節點、虛線間距、淡出曲線)逐項翻成 shader 數學
3 實機對比2D/3D 切換對比,指出「哪一種長歪了」
4 調參收斂AI只動公式常數,通常 1-2 輪收斂

② 待辦盤點:接下來要做的事

依「玩家看得到的完成度」→「效能」→「團隊工具」排序。進行中下一波規劃中

類別項目做法狀態
特效 3D 化 衝擊波 4 種GPU shader 程序化已上線待驗
依附特效(警示圈/旋風圈/Boss 護盾/光環)變化慢的→貼圖烘焙;幾何規則的→shader下一波
特殊粒子 7 種(星爆/電弧/抓痕/鏈鋸…)逐型:billboard 貼圖或 shader下一波
斬擊/X斬/殘影(空中類)評估:蓋怪合理→可留上層;要 3D→billboard規劃中
效能 怪物骨骼 CPU 成本(VAT 化)見③——目前最大的效能債規劃中・建議排入
Draw call 審計+圖集合併見③規劃中
手機效能分級測試低階機實測+renderScale 自動降級規劃中
團隊工具 怪物配置表外部化(JSON)見④——企劃可自改規劃中・建議先做
特效參數調整面板見④——美術可自調規劃中
UI 走 HTML/CSS 的遷移評估見③④規劃中
收尾 透視強度調參你回饋一個感覺,改一個常數等你回饋
木乃伊/猩猩色調微調你排到後面的已排隊

③ 效能三問:UI 合併/Draw call/怪物合併與 VAT

Draw call 現況與怎麼減少

先講現況(compat 模式一幀):背景 1~2、殭屍每型 1~3(已 instancing:同型 100 隻=1 次)、陀螺/箱子每個 1~3、特效 quad 池每個活躍特效 1、粒子每型 1、canvas 疊層合成 1。總計估 30~60,對 WebGL 來說很健康(手機安全線約 100~300)。

  • 已做:InstancedMesh2(同型怪合批)、粒子系統批次
  • 可再做(需要時才做):特效 quad 池改 instanced(全部衝擊波 1 次 draw)、貼圖合併圖集(減材質切換)、UI 圖集
  • 判斷:draw call 目前不是瓶頸,別過早優化——真正的效能債在下面這條

怪物怎麼合併/VAT(你問到重點了)

誠實的現況評估 現在的怪物是「GPU 合批、CPU 逐隻擺骨架」:繪製只要每型 1 次,但每幀每隻怪都要 CPU 算一次骨骼姿勢再上傳。CPU 成本隨怪數線性成長——百隻內沒事(現在 60fps),怪再多或低階機就會見底。這是目前最大的一筆效能債。

VAT(頂點動畫貼圖)就是正解,你的直覺完全對:把每段動畫的每一幀「每個頂點在哪」預先烘進一張貼圖 → 遊戲時頂點著色器直接查表 → CPU 骨骼計算完全歸零,且與 instancing 完美相容(每隻怪只要一個「播放進度」數字)。

現況(即時骨骼)VAT
CPU/幀隨怪數線性(每隻 pose+上傳)≈0(只更新播放進度)
記憶體每型每動畫一張貼圖(可控,動畫段固定)
動畫混合可(mixer)難(通常直切,我們的怪本來就直切)
工作量烘焙工具(AI 寫)+頂點 shader+驗證,約一個中型工項

我們的怪剛好是 VAT 甜蜜點:動畫段固定(走/死/攻/受擊)、不需混合、量大。建議排進效能下一波

UI 要怎麼合併

「合併」分兩個問題:

  • 效能面:UI 現在畫在 canvas 疊層=瀏覽器合成 1 層,效能上已經是「合併」狀態,不是瓶頸
  • 工作流面(更重要):建議把「螢幕 UI」(HUD/計分/選單)逐步改 HTML/CSS——瀏覽器渲染、不佔遊戲迴圈、而且美術可以直接用網頁工具調(見④)。「世界內 UI」(怪頭上血條/數字)留在遊戲渲染層(跟著鏡頭走的必須在裡面)

④ 編輯工具:怪物怎麼編、美術怎麼調

這是「不用引擎」最需要正面回答的問題:引擎的編輯器沒了,非工程師怎麼工作?答案:配置外部化+AI 快速自建小工具。網頁的優勢是「編輯器本身就是網頁」,AI 一兩天能做一個。

怪物編輯(企劃的工作流)

現況(不理想):怪物的模型/血量/速度/動畫段/掉落全部寫死在程式碼裡——只有工程師或 AI 能改。

目標做法(業界標準=配置驅動)

  • 第一步:把怪物參數抽成 JSON 配置表(一隻怪一筆:用哪個模型/多少血/走多快/放什麼技能/動畫用哪幾段/掉多少票)——企劃改表存檔重新整理就生效,不碰程式碼
  • 第二步(可選):AI 做一個網頁編輯面板——左邊改參數、右邊即時預覽那隻怪(轉視角/播動畫),存檔直接寫回 JSON。這就是你自己的「怪物編輯器」,規格由你們定

美術怎麼調整特效

特效類型美術的介入方式
貼圖類(火花/光暈圖)美術直接出圖(PNG/序列幀),丟進資源夾即生效——跟引擎流程一樣
程序/shader 類(衝擊波/光圈)特效參數面板(顏色/大小/速度/淡出曲線滑桿+即時預覽)——美術拉滑桿調到滿意,參數存檔。AI 一天能做這面板
全新特效美術給參考(別的遊戲截圖/影片/手繪示意)→ AI 實作 → 美術驗收迭代——跟我們現在「你當眼睛」的模式相同,美術取代你當眼睛

美術怎麼調整 UI

UI 走 HTML/CSS 之後,美術的調整方式跟「調網頁」一樣:改字級/色彩/間距/圖片都是標準網頁技能(或美術出 Figma 稿 → AI 一比一實作,這條 AI 極快且準)。這是網頁遊戲相對引擎的一大優勢——UI 人才與工具生態全世界最成熟

⑤ 團隊運作模式(回應你的擔憂)

你的擔憂合理:沒有引擎=沒有現成的協作介面。解法是把「協作介面」換成三樣東西:配置表、小工具、規範文件。角色都在,只是介面變了。

角色分工(建議)

企劃
改配置表(怪物/關卡/數值)+玩法驗收。介面:JSON 表或編輯面板。不碰程式碼
美術
出圖/出參考+用參數面板調特效+CSS 調 UI+視覺驗收(當眼睛)。不碰遊戲邏輯
技術負責人
(現在=你)
領導 AI:定需求優先序、審 AI 的方案、把踩坑沉澱成規範、管版本(tag/回退決策)
AI
全部實作:玩法/渲染/shader/工具面板/文件。也負責「造工具給其他角色用」——這是關鍵:編輯器缺什麼就叫 AI 做什麼

一個功能的標準流程(已在陀螺專案驗證)

階段動作陀螺專案的實例
1 需求人用「一句話+參考」描述「怪物頭要朝螢幕上方,像 2D 那樣」
2 根因/方案AI 先比對分析再動手,附證據並排讀兩版程式碼,推導出 −45° 座標換算
3 實作+部屬AI 改、commit、3 分鐘上線預覽網址每批修正都是當天上線
4 人眼驗收實機玩、對比、一句話回饋「旋轉向外移動時偏掉」→ 直接命中根因
5 沉澱坑寫進規範、知識進 wiki、穩定點打 tagR1-R12 規範、20 項問題報告、stable-fx2d tag

對你擔憂的直接回應

  • 「AI 做的東西會不會失控」→ 版本保護(每步 commit+穩定 tag)讓任何失敗都可退;規範讓同樣的坑不踩兩次。這幾天特效玩壞過兩次(FPS 崩),都在當天修復或可回退
  • 「沒人懂內部怎麼辦」→ wiki+規範+commit 說明就是「可考古的專案記憶」,任何新的 AI session 或新工程師都能接手(我們已實測過 AI 換模型接手)
  • 「美術企劃沒工具」→ 工具由 AI 現造,且規格完全按你們的工作習慣定——這反而是引擎給不了的客製化
  • 「品質怎麼保證」→ 人眼驗收是唯一標準(AI 盲區),流程上把它制度化:每批部屬必驗、凍結對比、真機效能實測
建議的下一步(如果你認可這個方向) ①先把特效 3D 化收尾(進行中)→ ②做「怪物配置表外部化」當團隊協作的第一個試點(讓企劃真的用起來,驗證這套模式)→ ③VAT 排入效能波次 → ④特效參數面板給美術。每一步都是獨立可驗收的小工項。
通盤指南第一部(引擎/渲染路線/特效概念/避坑地圖/AI 方法論)見前一份報告・ 教材來源:SpinningTop feat/perf-migration 實戰(2026-07)

SpinningTop / feat-perf-migration

2D→3D 渲染搬移問題報告

Canvas2D → WebGL 即時 3D(compat 模式)搬移過程的全部問題、根因與修法

日期 2026-07-10 記錄 20 項 規範 R1–R11(wiki/conventions) 線上 spinningtop.pages.dev
20問題總數
16已修復並部屬
3排程中/待確認
1未解・追蹤中

核心認知:為什麼會有這批問題

2D 版其實是「離線烘焙的 3D」。烘焙器(Zombie3DRenderer)在載入時把 FBX 模型透過一個調校好的 3D 場景——燈光、材質、相機、頭骨角度、動畫姿勢——逐幀拍成 2D 圖片,遊戲再播放這些圖片。所有「2D 好看」的原因都藏在烘焙器的調校細節裡。

3D 即時管線是照「架構」重寫的新路徑,烘焙器的調校沒有被逐條核對搬移,於是逐項露餡。每一個問題的修法本質都是:把烘焙器的某個調校,正確地重現到即時管線。

批次一・首輪實測

#1–6

部屬後第一輪遊玩發現的 6 個問題。

#1

整個背景全黑

已修復
根因遊戲 canvas 設了不透明(alpha:false),整層蓋住下面的 WebGL 畫面。
修法改為透明(alpha:true),WebGL 3D 層透出來。
#2

怪物太暗

已修復
根因三重:①設定表漏抄烘焙器的「自發光」(5 種怪全漏、狗抄錯值)②第一次修復改在死碼上 ③貼圖漏設各向異性過濾,俯視斜角下被過度模糊變暗。
修法逐型對照烘焙器補齊自發光;man 改用 Lambert 材質;anisotropy=16。
#3

炸彈怪死亡動畫沒演出

已修復
根因血量歸零被標成「不存活」,渲染器第一行就跳過不畫——死亡中的怪整隻消失,動畫進度修得再對也沒用。
修法死亡「演出中」照常渲染;播放進度改用「秒 ÷ 動畫實際長度」對齊烘焙器語義。
#4

撞擊時怪播怪異動作

已修復
根因擊退狀態被誤映射到「死亡動畫」;2D 擊退時根本不切換動作。
修法刪除錯誤映射,擊退維持原動作+身體旋轉。
#5

頭朝向錯(露後腦勺)

已修復
根因烘焙器把頭骨上仰 45° 是在模型旋轉 180° 之後的世界空間套的;即時管線的骨骼在旋轉之前——座標系換算後等效角度是 −45°。第一次照抄 +45° 等於往下低頭,更看不到臉。
修法數學推導共軛換算,改 −45°(蔡實測確認 OK)。
#6

受擊沒閃白

已修復
根因資料鏈斷在源頭——3D 的資料結構根本沒有 flashTimer 欄位;後補的「顏色過曝」又只影響受光部分,蓋不掉自發光,白不徹底。
修法欄位接上+shader 級純白覆蓋(無條件輸出純白,對齊 2D 白剪影)。

批次二・全面盤點

#7–13

agent 全檔掃描 2D 渲染器+烘焙器逐項比對、架構級項目人工二次驗證。

#7

受擊抽動/攻擊/蓄力/挑釁/中獎失敗演出全滅

已修復
根因3D 動畫狀態機只搬了 3 種動畫(走路/死亡/衝刺),2D 支援 4 個維度的演出判定。
修法狀態機重寫,完整對齊 2D 逐型判定(約 150 行)+補載受擊與特殊動畫。
#8

Boss(猩猩)死亡/攻擊動畫壞掉

已修復
根因烘焙器從 3 個 FBX 檔各取動畫;3D 只載走路檔,卻拿其他檔的幀號去切——切到錯的動畫。
修法支援「指定動畫來源檔」,幀號屬於哪個檔就從哪個檔切。
#9

黑殭屍走路=死亡同一段動畫

已修復
根因Monkey.fbx 是「具名動畫」格式,3D 卻對三個動作全切同一段 [0,30]。
修法支援名稱查找(walk/dead/jump_in/intimidate)。
#10

場上物件雙重繪製(效能浪費)

已修復
根因compat 模式下陀螺清單有清空、物件清單忘了清——WebGL 和 Canvas 各畫一次(上層蓋住看不出,純浪費)。
修法物件清單比照清空,一邊只畫一次。
#11

3D 陀螺/空投箱未搬進 WebGL

排程中
現況仍走舊烘焙路徑(畫面看得到、無缺陷),屬搬移未完成項。
計畫後續補進 WebGL 模型清單。
#12

木乃伊/猩猩尺寸疑似縮錯

待實測確認
證據其他怪的烘焙器→3D 縮放換算全部一致(×0.833),只有這兩隻不一樣(×0.4/×0.694)。
下一步實機確認是否明顯偏小,確認後修。
#13

黑殭屍紫色光暈消失

排程中
根因2D 的光暈是套在 2D 身體圖上的;身體改由 WebGL 畫之後,光暈失去載體。
計畫3D 端補紫色光暈(或 Canvas 補畫貼地光圈)。

批次三・實測追加

#14–20

蔡實機遊玩回報的追加問題(含手感層級)。

#14

場邊石頭消失

已修復
根因compat 模式漏接了整個地面裝飾層——石頭、彈射區、警示區、引導箭頭、地面軌跡、尖刺全都沒人畫。
修法地面裝飾層接回 Canvas 疊層(底圖仍由 WebGL 畫),一次全補。
#15

彈射區星星消失

已修復
根因同 #14——星星是彈射區地標,在同一個漏接的裝飾層裡。
修法同 #14 一併回歸。
#16

對決 QTE 介面消失

已修復
根因compat 漏呼叫世界層 UI(drawUIWorld)——對決拉鋸條這批全沒畫。
修法補上呼叫。
#17

怪頭上出現兩個數字、數值還不同

已修復
根因舊渲染器內建的「寫死票數」和機率系統的「水位票數」兩份都在畫。
修法只留機率水位版(正確的業務數字)。
#18

打怪時特效與怪錯位

已修復
根因螢幕震動三層不同步:WebGL 相機有震、Canvas 疊層沒震、地面裝飾自己亂震。
修法三層共用同一份震動數值。
#19

打擊感不足(2D 會「停一拍」再演)

已修復
根因2D 純白剪影期間動畫視覺上是凍住的(hit-stop);3D 被打立即演出,少了那一拍停頓。
修法受擊與死亡都加 0.15 秒動畫凍結,凍完才開始演出。
#20

撞飛時旋風圈仍與怪對不上

未解・追蹤中
已排除震動同步(#18 已修)、渲染順序(確認同幀無延遲)。
下一步剩兩個嫌疑:3D 模型中心點偏移、或貼圖更新慢半拍。實機觀察「圈圈固定偏一邊=中心點問題;落後怪半拍=幀延遲」即可定位。

修錯過的地方

供警惕

這三個失誤都導致「修了但你看沒變」,已寫入規範避免重犯。

改到死碼——亮度第一次修在一支「有被建立、但從未被渲染使用」的舊檔上。 → 規範 R10:改之前先驗證那條路徑真的在跑。
照抄不換算——頭傾斜第一次照抄烘焙器的 +45°,但兩邊座標系差 180° 旋轉,符號要反。 → 規範 R4:空間變換搬移必先推導座標系差異。
修進度、沒修渲染資格——死亡動畫第一次修「播放進度」,但那隻怪根本沒被畫。 → 規範 R9:先確認「有沒有畫」,再修「畫得對不對」。

製作規範 R1–R11

wiki/conventions/webgl-3d-rendering-rules

從 20 項根因提煉,後續所有渲染開發照此走。

規範內容對應問題
R1烘焙器是視覺真相源——任何視覺問題先並排比對,禁止試錯調參全部
R2材質規格逐型對照(材質類型/自發光/各向異性/色彩空間)#2
R3動畫三種來源(幀號/具名/跨檔)+兩種播放語義(停最後幀/循環),一律以秒為源#3 #7 #8 #9
R4空間變換搬移必做座標系換算,禁止照抄數字#5
R5compat 分工邊界:每個視覺元素只能一邊畫,新增必登記#10 #14–17
R6相機/震動三層共用同一份數值#18
R7打擊感標準:受擊/死亡 hit-stop 0.15 秒#19
R8驗收方法:凍結畫面 Canvas2D ↔ Compat 切換逐項對比全部
R9渲染資格與演出分離:血量歸零 ≠ 不渲染#3
R10禁改死碼:動手前先驗證該路徑在跑#2
R11資料鏈完整性:遊戲狀態→映射→渲染逐欄檢查#6
完整版(含程式碼位置與檔案引用):wiki/decisions/2d-to-3d-migration-issues.md・ 規範全文:wiki/conventions/webgl-3d-rendering-rules.md・ 過程存檔:stages/perf-migration/・ 分支 feat/perf-migration 已 push

維護製程・全 AI 開發的系統,人怎麼維護

程式碼全是 AI 寫的——團隊維護什麼、怎麼維護

正面回答核心焦慮:沒有人逐行寫過這些程式碼,出事誰扛?AI 斷了怎麼辦?知識在哪裡?答案的骨架:系統運行不依賴 AI;知識不放人腦、放 repo;人維護的是知識庫、驗收體系和決策——不是程式碼本身。

一、先破題:AI 開發改變了「維護」的本質

傳統開發全 AI 開發
知識放哪工程師腦裡(人走=知識走)repo 裡(wiki/規範/commit 史/文件站)——強制外化,否則 AI 下個 session 自己都接不了手
誰改程式碼工程師AI(人下需求、人驗收)
維護的資產養人(留住資深工程師)養知識庫(讓任何 AI/任何人能憑文件接手)
單點風險核心工程師離職AI 服務中斷(見場景手冊——其實比人離職好處理)
最重要的一件事 遊戲的「運行」完全不依賴 AI。AI 只是開發工具——部屬出去的是純網頁程式,玩家/機台跑的東西跟 AI 一點關係都沒有。AI 全部消失,遊戲照常營運;受影響的只是「改東西的速度」。

二、資產清單:維護就是保護這五樣東西

資產是什麼維護動作
1 repo(git)程式碼+全部歷史+每個 commit 的「改了什麼為什麼」——專案唯一真資產異地備份;commit 紀律不放鬆
2 知識庫(wiki+規範)系統怎麼設計、20 個坑、R1-R12 規範——「人腦」的替代品AI 每次踩坑/決策即時寫入(制度化,不是想到才寫)
3 穩定 tag隨時可退的存檔點每個大階段驗收過就打;正式版只從 tag 部署
4 文件站(本站)人的訓練教材——新人/新 AI 的入口內容跟著專案演進更新(AI 負責)
5 自動化測試錢相關邏輯(機率/票數)的自動守衛——不靠任何人的記憶錢邏輯改動必附測試

AI 不在資產清單裡——AI 是可替換的工具。這正是這套體系的安全性來源:知識在 repo,換哪家 AI、哪個模型,讀完文件就能接手(本專案已實測:換 AI 當天恢復全速)。

三、維護場景手冊(出事了照這個做)

場景第一時間(人做,不需要 AI)後續(AI 做,人驗收)
營運中炸了(機台當機/畫面異常)回退到上一個穩定 tag 重新部署(3 分鐘、一條指令,值班的誰都能做)→ 營運恢復AI 讀錯誤 log 診斷根因 → 修復 → 驗收 → 補上新 tag
發現 bug截圖+一句話描述現象(「撞飛時圈圈偏掉」等級的描述就夠)記進需求板AI 先證明根因再修(規範禁止猜著改)→ 部屬 → 發現者驗收
要改數值/怪物/關卡企劃自己改配置表——這類日常維護根本不經過 AI
要換圖/換音效美術照資產規格出檔丟資源夾——同上,不經 AI
AI 服務中斷短期:遊戲照營運(運行不依賴 AI);數值/資產維護照常(上兩行)中期:換一家 AI 讀文件接手(已實測可行);最壞:任何 TS 工程師憑文件站+wiki 接手——程式碼有型別、有註解、有規範,不是黑盒
核心成員離職/新人加入新人走職能入口的閱讀路徑(程式半天/企劃美術一小時)AI 陪跑答疑(「帶我看懂 XX 系統」)
懷疑程式碼在腐化(越改越亂)技術負責人排「架構盤點」工項AI 自查:雙畫/死碼/規範違反/重複邏輯 → 出報告 → 決策要不要重構(本專案的 20 項盤點就是一次實例)

四、人的最小技能組合(維護這系統需要會什麼)

層級技能誰需要學習成本
必備①會具體描述問題(截圖+現象一句話)②會驗收(開網址對照)③會回退(一條指令退 tag)團隊每個人半天內
日常維護改配置表(企劃)/照規格出資產(美術)——不碰程式碼的維護企劃/美術一小時+工具面板
把關層看得懂七層架構、能用 R1-R12 審 AI 的方案、能判斷優先序技術負責人+至少一名程式文件站程式路徑,約 1-2 天
不需要徒手寫遊戲程式碼、精通 Three.js/shader這是 AI 的工作
關鍵配置建議 團隊裡保留至少一位「能讀懂」程式碼的人(不需要能寫)——他是 AI 的把關者和最壞情況的保險絲。這個角色現在是你,之後可以是任何照著 Unity 對照手冊上手的工程師。

五、品質不腐化的三道防線(讓系統十年後還能維護)

防線 1・規範擋重複坑:R1-R12 每條都是真坑換來的,AI 每次動手前對照——同樣的錯不犯第二次。新坑→新條目(規範是活的)。
防線 2・強制知識外化:AI 的每個 commit 寫「為什麼」、每個決策進 wiki、每個階段更新總藍圖——「沒寫下來=沒發生」是鐵律,這保證任何時點的接手可能性。
防線 3・定期架構盤點:每個大 Phase 結束,AI 自查一輪(死碼/雙畫/違規/該重構的),出報告由人決策——避免「一直加功能從不整理」的腐化曲線。

六、開發循環(新需求與 bug 修復共用)

維護中的「改東西」都走這個循環——這是引擎,上面五節是保養手冊。

1 提需求/報 bug一句話+參考任何人
2 排序定優先、定驗收人技術負責人
3 AI 分析先證根因,禁猜著改AI
4 實作部屬commit→3 分鐘預覽AI
5 驗收視覺=美術/玩法=企劃/效能=實機對應職能
6 沉澱坑→規範、知識→wiki、穩→tagAI+負責人把關

七、誠實的風險表(這套體系哪裡會痛)

風險什麼情況會發生緩解(已建或建議)
AI 搞不定的深度 bug極罕見的環境相依問題(特定機器/驅動)把關層的「能讀懂的人」介入+社群/原廠支援;先回退 tag 保營運
知識外化偷懶趕進度時 AI/人略過沉澱步驟 → 半年後沒人知道為什麼把「沉澱」放進循環第 6 步(不是可選項);負責人抽查
驗收疲乏「AI 通常是對的」→ 放水 → 回歸累積驗收 checklist 制度化;錢邏輯用自動測試不靠人
AI 成本上升訂價變動知識在 repo → 隨時可換供應商/模型(已實測換模型無痛)
文件與程式碼漂移改了碼沒改文件 → 文件變謊言文件更新是工項驗收條件之一;定期盤點對帳
一句話總結 全 AI 開發的維護學=「把過去放在人腦裡的東西,制度化地放進 repo」。人不維護程式碼,人維護三樣:知識庫的完整、驗收的嚴格、決策的方向。做到這三件,AI 是誰、換不換,都不影響這個專案活多久。