Term 的終端機算繪改用 EGL/GLES3 實例化算繪器 —— 在實機上實測的方法、數據與畫面。
同一台實機(華為 Pura 70)、同一份語料,透過內建的 Log frame stats 開發者開關,將 GPU 路徑與 CPU 基線做 A/B 對比。
| 工作負載 | CPU 路徑 | GPU 路徑 | 提速 |
|---|---|---|---|
| 全螢幕捲動(firehose) | 14.6 ms · 68 fps | 5.3 ms · 188 fps | 2.7× |
| 慢速捲動(~5 行/幀) | 12.8 ms · 76 fps | 6.0 ms · 167 fps | 2.1× |
GPU 路徑的幀時間幾乎與捲動量無關 —— 每一幀都是一次完整重繪,而這對 GPU 來說很便宜。CPU 路徑對捲動行數敏感的問題就此消失。
每幀約 1000 個實例化四邊形。字形只光柵化一次進入紋理圖集,之後每幀僅重新發射網格實例。
| 階段 | 平均 | 說明 |
|---|---|---|
| build | 2.15 ms | CPU 側:遍歷網格 → 實例四邊形 + 光柵化新字形入圖集 + 上傳 |
| draw | 0.22 ms | GL 實例化繪製 |
| swap | 2.95 ms | eglSwapBuffers(呈現) |
| 幀總計 | 5.32 ms | ≈ 188 fps |
消除兩次搬運 14 MB 的記憶體操作:不再有影子位圖的捲動位移(~6 ms),也不再有到 dmabuf 的複製(~5.6 ms)—— 這 ~11 ms 就是全部的節省。GPU 直接在 EGL 表面上原地光柵化。
語料是彩色 ANSI-SGR 混合中文、韓文與 ASCII,由基準腳本寫入工作階段 TTY,無需觸碰手機。
腳本自動化三個階段(firehose 捲動/閒置閃爍/單行更新),透過向遠端主機上工作階段的 TTY 寫入實現 —— 手機端零互動。
# 語料:彩色 ANSI-SGR + 中文/韓文/ASCII,400 行 corpus() { i=0 while [ $i -lt 400 ]; do printf "\033[3%dm%04d 端末描画性能測定 中文渲染基准 가나다라마 \033[1mBOLD\033[0m ascii-abcdefghijklmnop %05d\n" \ $((i % 8)) $i $((i * 37)) i=$((i + 1)) done } C="$(corpus)" # P1 firehose 捲動 30s(滿幀全損) end=$((SECONDS + 30)) while [ $SECONDS -lt $end ]; do printf "%s\n" "$C" > "$T"; done # P2 閒置 60s(僅閃爍 → 局部呈現幀) sleep 60 # P3 單行更新 20s(~8 Hz,輸入形狀的局部幀) end=$((SECONDS + 20)) while [ $SECONDS -lt $end ]; do printf "\rtyping simulation %06d" $n > "$T"; n=$((n + 1)); sleep 0.12 done
gpubench.sh 複製到該主機,用 who -u 找到工作階段對應的 TTY。./gpubench.sh /dev/ttysNNN(工作階段的 tty)。hdc -t <target> shell hilog | grep "connrender: gpu" —— 每 60 幀輸出一條統計視窗。注意:P2/P3 的統計視窗跑在低 DVFS 頻率下(每秒僅 2–9 次繪製,時鐘處於最低檔),與 firehose 數字不可直接比較 —— 只做同節奏對比。P1 的第一個視窗包含一次性的 CJK 字形光柵化爆發(屬正常)。