‹ Term

GPU 算繪效能基準

Term 的終端機算繪改用 EGL/GLES3 實例化算繪器 —— 在實機上實測的方法、數據與畫面。

5.3ms
GPU 幀時間 · 188 fps
2.7×
對比 CPU 路徑
0.2ms
GL 繪製 / 幀
結果

同一台實機(華為 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×
logFrameStats · 華為 Pura 70 · 3 MB ANSI-SGR + CJK 語料迴圈 · 2026-07

GPU 路徑的幀時間幾乎與捲動量無關 —— 每一幀都是一次完整重繪,而這對 GPU 來說很便宜。CPU 路徑對捲動行數敏感的問題就此消失。

GPU 幀構成

每幀約 1000 個實例化四邊形。字形只光柵化一次進入紋理圖集,之後每幀僅重新發射網格實例。

階段 平均 說明
build 2.15 ms CPU 側:遍歷網格 → 實例四邊形 + 光柵化新字形入圖集 + 上傳
draw 0.22 ms GL 實例化繪製
swap 2.95 ms eglSwapBuffers(呈現)
幀總計 5.32 ms ≈ 188 fps
2026-07-17 重測 · build 微優化後(ASCII 槽表、bg+glyph 合併遍歷、無分配圖集簽名)

消除兩次搬運 14 MB 的記憶體操作:不再有影子位圖的捲動位移(~6 ms),也不再有到 dmabuf 的複製(~5.6 ms)—— 這 ~11 ms 就是全部的節省。GPU 直接在 EGL 表面上原地光柵化。

實測畫面

語料是彩色 ANSI-SGR 混合中文、韓文與 ASCII,由基準腳本寫入工作階段 TTY,無需觸碰手機。

全螢幕捲動 firehose:滿螢幕彩色 ANSI + 中文/韓文/ASCII 連續捲動
P1 · 全螢幕捲動 —— 滿螢幕全損重繪的連續捲動。
閒置狀態:僅游標閃爍的部分呈現幀
P2 · 閒置 —— 僅游標閃爍,局部呈現。
單行更新:8 Hz 輸入,其餘行逐像素保留
P3 · 單行更新 —— 8 Hz 輸入,逐像素保留上方行。
基準腳本

腳本自動化三個階段(firehose 捲動/閒置閃爍/單行更新),透過向遠端主機上工作階段的 TTY 寫入實現 —— 手機端零互動。

gpubench.sh下載 ↓
# 語料:彩色 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
如何重現
  1. 開啟一個到目標主機的工作階段;把 gpubench.sh 複製到該主機,用 who -u 找到工作階段對應的 TTY。
  2. 執行 ./gpubench.sh /dev/ttysNNN(工作階段的 tty)。
  3. 擷取:hdc -t <target> shell hilog | grep "connrender: gpu" —— 每 60 幀輸出一條統計視窗。

注意:P2/P3 的統計視窗跑在低 DVFS 頻率下(每秒僅 2–9 次繪製,時鐘處於最低檔),與 firehose 數字不可直接比較 —— 只做同節奏對比。P1 的第一個視窗包含一次性的 CJK 字形光柵化爆發(屬正常)。