SpinningTop・板上效能・收官交付

上機 60fps 判決書

2026-08-13|一天一夜、26+ 輪板上量測、三套獨立儀器互證|環境:RK3576/Mali-G52/WebView 116/1920×1080
判決:在目前的渲染路徑上,60fps 不可達——不是「哪個功能太貴」,是兩道天花板疊在一起。
①主執行緒每幀 14.5ms 的 CPU 工作(60fps 預算的 87%)——是遊戲自己每幀做的事(選單時只 2.85ms):降解析度碰不到它(砍 16 倍像素只動 0.16),要省只能從「每幀做多少事」下手,而它塗抹在數百條路徑上、無單刀大戶;②像素側真 GPU 滿載(全解析度每幀多等 GPU 4.4ms)。而把內容剝到最乾淨(9 個 draw call、6 千三角形)仍要 16.95ms ≈ 預算的 101%(2 輪、內容指紋逐輪釘死)——空畫面剛好卡在門檻上,但遊戲內容一放回去就是 29ms 上下。「靠關功能到不了 60」的主要依據是主執行緒 14.5ms 那條獨立證據。要到 60,必須動路徑本身;或重談目標。

證據鏈(四步,全部可重現)

  1. 砍 CPU 沒反應。把骨骼計算砍掉 84–96%(預烘骨骼 A/B,三對同號)→ 幀時間 +0.26ms,零收益。
  2. 剝光內容後的下界=16.95ms(終版,2 輪、指紋齊)。過程有兩次修正:最早的「19.4 雙路徑三角驗證」在內容指紋補齊後發現兩路徑場面不同、且重跑後兩路徑差 3.08ms 不收斂——「三角驗證的硬地板」整條撤回,那次收斂是內容沒釘死造成的巧合。站得住的是:剝到 9 draw call/6 千三角形仍要 16.95ms=預算 101%。教訓:三角驗證前提=內容指紋逐輪釘死,「條件字串相同≠場面相同」。
  3. 主執行緒 14.5ms,三儀器互證,且定性完成。頁面內取樣器(JS 11.9)+系統排程(14.5,含瀏覽器內部 2.6);像素砍 16 倍它不動(−0.16)、但選單時只剩 2.85 ⇒ 它是遊戲每幀的工作,不是瀏覽器固定開銷——塗抹在數百條小路徑上,無單刀大戶。選單→戰鬥的差分同時排除了「卡系統合成」(surfaceflinger +0.32 不動),幀成長 92% 來自 CPU 工作變多、34% 伴隨 GPU 等待。
  4. 像素側坐實 GPU 滿載。全解析度下每幀 GPU 阻塞等待 +4.4ms;系統合成端每幀處理一張固定 1920×984 的表面(平均 19.7ms)——遊戲內降解析度縮不到這一層,它在網頁權限之外

整體:一幀 29.6ms 長什麼樣(總圖)

下面這條橫條就是一幀:從左到右是時間,從「開始畫這一幀」(0ms)走到「開始畫下一幀」(29.6ms)。紅色虛線是 60fps 的預算線(16.7ms)——一幀必須在虛線前結束才有 60fps,現在明顯超過:

60fps 預算線 16.7ms
①在做事 14.5ms
②在等 15.1ms
0ms(這一幀開始)29.6ms(下一幀開始)

同一條橫條,把兩段再切細(每小格是什麼,對應下面細分 A、B):

16.7ms
長尾 4.6
雜項 3.2
提交 2.8
瀏覽器 2.6
骨 0.9
等 GPU 4.4
接力+排隊+換幀 ~10.7
0ms29.6ms
暖色=①在做事(細節見細分 A) 冷色=②在等(細節見細分 B)

一幀的順序是這樣走的(為什麼兩塊要相加):

  1. 做事(14.5ms):主執行緒跑遊戲程式——更新每隻怪的位置、算 UI、把「這幀要畫什麼」打包丟給顯示卡。
  2. 等(15.1ms):丟出去之後,顯示卡在畫、佇列在排、螢幕在等換頁節拍——主執行緒想開始下一幀但還不能,只能等。
  3. 等到了,才開始下一幀的「做事」。

所以「一幀多長」=做事+等待,兩段是接續發生在同一條時間軸上的,所以相加。(實際上兩者會交錯進行,但每幀的總量就是這兩個數字。)

比方:廚師做一道菜 15 分鐘,但出餐口塞住、每道要再等 15 分鐘才出得去——客人感受到的上菜間隔就是 30 分鐘。要縮短間隔只有兩招:廚師做快一點(①),或把出餐口疏通(②)。下面把兩塊各自拆開,最後一張圖是「哪些開關能省多少」。

細分 A:「①在做事」的 14.5ms 是什麼

長尾聚合(數百條小路徑)
4.6 ms
雜項(疊層繪製 1.1+陀螺 0.7+UI/迴圈 1.4)
3.2 ms
渲染提交(叫 three.js 畫)
2.8 ms
瀏覽器內部(版面/GC/IPC)
2.6 ms
骨骼/姿勢(舊主嫌)
0.9 ms

重點:沒有一格大到「砍一刀就贏」——都是小錢加總。這 14.5 與解析度無關(像素砍 16 倍它不動),但與遊戲內容有關(回到選單只剩 2.9)。

細分 B:「②在等」的 15.1ms 在等什麼

等顯示卡做完(實測,全解析度)
4.4 ms
管線接力+排隊+等換幀(推算)
~10.7 ms

系統追蹤看到的形狀:七條執行緒各自半忙(沒有一條滿載),一幀要依序走完每一站,時間耗在「交棒」上;佇列塞住(Buffer Stuffing 佔 50% 的幀)是這個的症狀。降解析度能縮「等顯示卡」那格(所以降到 1/4 省 6.8ms),但縮不掉接力本身。

細分 C:哪些開關能省多少(實測)

⚠️ 這些不可相加——大多在搶同一塊(像素池):

關 UI/特效疊層
−6.1~7.2 ms
解析度降到 1/4 像素
−6.8 ms
怪 26 隻全拿掉(0.19/隻)
−4.9 ms
關即時陰影
−3.2 ms
砍 95% 骨骼計算
≈0

疊層數字說明:同一實驗跨 session 量到 −6.11 與 −7.20(差值在雜訊邊緣),故標區間;其內部拆分=繪製+raster 5.89/純合成≈0(同 session 一組)。全部一起拿掉(=幾乎空畫面)也只到 ~17.0ms——剛好卡在 60fps 預算的門檻上(101%)。搭配「主執行緒 14.5ms 與內容無關地存在」那條,就是「關功能到不了 60」的完整依據。

與 8/6 分析的對照(為什麼結論不一樣)

8/6 的分析今天的實測差異原因
頭號嫌疑殭屍骨骼計算(標 7.15ms)骨骼實測僅 0.88ms當時的量法把整段混在一起;直接取樣後拆開了
CPU or GPU?CPU-bound(等 GPU 只 4%)兩道天花板:主執行緒 14.5+GPU 阻塞 4.4遊戲變了:當時每幀 70 次繪製命令,優化後剩 23——瓶頸搬家(考古實驗證實,兩次都沒量錯)
降解析度有沒有用沒用(1/16 只換 0.25-1.1ms)有用(−6.8ms)同上:提交端讓位後,像素浮上主導
少畫怪有沒有用沒用(fps 不變)有用(0.19ms/隻)同上
UI 疊層沒被列為嫌疑最大單一可拆項 −7.2ms當時的儀器只看 WebGL 內部,疊層合成在視野外
建議方向Worker+WASM(搬 CPU 工作)路徑手術/容器降解析度/重談目標共享記憶體在 WebView 板上實測不存在;搬 CPU 的單一槓桿全部低於可測門檻

一句話:8/6 沒有量錯——它量的是三百多顆 commit 之前的另一個遊戲;而它的原始量測檔已滅失、部分結論的儀器視野有限。今天的每個數字都有雙份原始檔+指紋,之後不會再發生「說不清當時量的是什麼」。

三條路(可組合,選路是你的決定)

路 A渲染路徑手術——打那 14.5ms

重構主執行緒的提交與同步方式(渲染提交收攏、UI 疊層併層、塗抹成本集中化;系統面首條線索=drm-compositor 搶佔已定位待量)。唯一能把 CPU 天花板壓下去的路。

工作量 週級(架構手術)風險 高(動渲染核心)不確定性 能壓到多少未知,需原型60fps 配合路 B 才有機會

路 B容器級降解析度——打 GPU 半邊

最終版跑在 Unity+UniWebView 裡,容器有權把 WebView 顯示表面設成 720p——網頁搆不到的那層。⚠️ 08-13 午後新增重要保留:B 的收益未實測,且最新數據對它不利——遊戲自己的畫布大小是網頁自己設的、不隨容器表面縮;容器縮的「最終合成」那一步實測接近 0;真正有效的解析度旋鈕(遊戲內 renderScale,實測 −7.4ms)是網頁側現成的,不需要容器。一個 10 分鐘的模擬實驗可定案,結果出來之前不建議選 B。

工作量 低-中(容器設定+驗證)風險 中(畫質、需真外殼驗)前置 Unity 外殼到手預估 單獨做 → 穩 45-50fps 區間(需實測)

路 C重談幀率目標——數據上現路徑可及的版本

你裁過「不能只有 30」。數據顯示現路徑+已知修復(關疊層工程版/貼圖預載消頓挫/resize bug 修復)可做到穩定 40–45fps、無頓挫——比現在的「34fps 且抖」體感提升明顯。60 留給 A+B 落地之後。

工作量 最低(多為已知修法)風險 代價 接受非 60 的中期目標

已實測排除,不要再投入的

邊界與未涵蓋(誠實條款)

品質紀錄

本判決書的每個數字至少 2 輪實測+對象指紋。過程中 8 個數字被撤回(9fps/2.98MB 上傳/自動遊玩不殺怪/JS 2.1ms/選單取樣/容量假說/19.4 地板/三角驗證)——全部在團隊內部抓出(六次由量測自身的對照機制、兩次由審查者的質疑觸發),零次由團隊外部發現。後兩次的教訓比前六次深:自檢的覆蓋範圍有洞時,洞裡的錯誤自檢永遠抓不到——所以量測與審查必須是兩雙眼睛。撤回後存活的數字,才進了這份文件。

需要你決定的一題:選路(可組合,建議 B+C 先行、A 開原型評估)。選定後由負責人排程,效能線出驗收標準。

原始證據:F:\tmp\spin-evidence-20260812\(fingerprint+雙份備份)|研究底稿:上機效能優化候選研究(artifact,已標歷史)|三儀器:beacon 幀時間/JS Self-Profiling/atrace 系統排程