問題比喻: 期末考交卷,老師改了一次,然後又把同一份考卷從頭改一遍——浪費時間,結果也不對。
實際問題: 每個粒子在主迴圈算一次適應值,進入 stepPSO() 又算一次,CPU 做了兩倍的無用功。
修正: 每個粒子每輪只評估一次:先移動位置,再算一次適應值,結束。
問題比喻: 班上50個同學互相比較成績,每個人都要跟其他49人比——人數越多,比較次數爆炸性成長。
實際問題: 每隔80毫秒,程式就對多達500個解做「誰支配誰」的兩兩比較,瀏覽器因此卡頓。
修正: 解的歷史記錄上限設為150筆,且每5輪才重算一次 Pareto 前緣,大幅降低運算量。
問題比喻: 每次想換一個燈泡的顏色,卻把整棟大樓的電路圖重新翻一遍,才找到那顆燈泡。
實際問題: applyOptFeedback() 每80毫秒就用 traverse() 掃描所有 Three.js 網格子物件,非常耗時。
修正: 場景建立時,一次性把所有需要變色的材質存進陣列。之後每幀只更新一個 0~1 的數字(emissiveTarget),渲染迴圈負責平滑插值,完全不需要重新掃描。
問題比喻: 每次黑板上的數字變動,老師就把整個班級重新點名一次——根本不需要這樣做。
實際問題: 優化迴圈每80毫秒觸發8個以上的 setState(),每個都造成 React 重新渲染整個畫面。
修正: 優化器所有的「計算狀態」改存在 useRef(不觸發渲染)。只有畫面需要更新時,每4輪才呼叫一次 setSnap() 批次更新 UI。
問題比喻: 一邊跑百米,一邊做數學題——兩件事都做不好。
實際問題: 80毫秒的間隔對 GA / Adam 梯度計算來說太短,佔用了 Three.js 的渲染時間,畫面因此卡頓。
修正: 間隔放寬到140毫秒;PSO 粒子數 20→12,GA 族群數 24→16,運算和渲染兩者都順暢了。
問題比喻: 印一張 A4 傳單,卻用印刷雜誌的600 DPI 解析度——眼睛看不出差異,但印表機累死了。
實際問題: 在高解析度螢幕(Retina)上,devicePixelRatio 可能是2或3,導致 GPU 渲染3倍像素量。
修正: 上限設為1.5,視覺上仍然清晰,GPU 負擔大幅減少。
PAE(功率附加效率) 是指「輸出的 RF 功率」除以「從電源消耗的總功率」,數值越高代表電路越省電。
| 效率等級 | 說明 |
|---|---|
| 88% | Class F 理論極限,現實中不可能達到 |
| 55–62% | 世界頂尖的 GaN Doherty 設計 |
| 40–55% | 優良的商業產品水準 |
| < 38% | 偏壓或匹配網路出了問題 |
比喻: 就像說「汽油引擎熱效率100%」——卡諾定理告訴我們這不可能,總有損失。
修正: PAE 上限從88%降到62%,反映真實 GaN 製程的物理極限。
增益(Gain) 表示訊號被放大了多少倍。38 dB 代表功率放大了 6300倍以上。
問題在哪裡?
一個 38 dB 增益的放大器,只要有任何微小的寄生回授(例如:bonding wire 的電感、基板耦合),就會自激振盪——變成一個震盪器,不再是放大器。
| 電路級別 | 典型增益 | 設計優先考量 |
|---|---|---|
| LNA(低雜訊放大器) | 15–22 dB | 盡量高增益,壓低雜訊指數 |
| PA Driver(單級) | 10–14 dB | 線性度、PAE、穩定性優先 |
| PA Driver(兩級串接) | 18–22 dB 合計 | 每級仍需穩定性分析 |
LNA vs PA Driver 的根本差異:
修正: Gain 上限從38 dB降到16 dB,符合單一級 GaN PA driver 的實際設計範圍。
問題: 深色背景配上幾乎是黑色的文字(#334455),在螢幕上幾乎看不清楚。
修正: 建立一個統一的顏色常數物件 C:
C.label = "#9bbccc" → 主要標籤(亮)C.sublbl = "#6a9ab0" → 次要說明、單位(中等亮度)光看數字不夠——要知道這個數字「好不好」。系統根據實際 PA driver 規格自動上色:
| 指標 | PASS(綠) | MARG(黃) | FAIL(紅) |
|---|---|---|---|
| PAE | ≥ 48% | ≥ 38% | < 38% |
| EVM | ≤ 2.5% | ≤ 4.5% | > 4.5% |
| ACPR | ≤ −45 dBc | ≤ −38 dBc | > −38 dBc |
| Gain | ≥ 12 dB | ≥ 10 dB | < 10 dB |
| Pout | ≥ 40 dBm | ≥ 36 dBm | < 36 dBm |
設計哲學: 把規格書「燒進」介面裡,工程師不需要每次對照 datasheet,一眼就能判斷設計是否達標。
setState 都會觸發 Virtual DOM 比較與重新渲染。在高頻迴圈中,應該用 useRef 存計算中間值,只在需要更新畫面時才呼叫 setState。