TGFX-跨平臺 2D 繪圖引擎

1、項目簡介

TGFX(Tencent Graphics) 是一個跨平臺的純 GPU 繪圖引擎,提供了完備的圖片,矢量和文本的 2D 繪製能力,目前已支持:iOS, Android, macOS, Windows, Linux, 以及 Web 等平臺。它最初是從 PAG 動效開源項目中孵化而來,作爲谷歌 Skia 繪圖引擎的輕量化替代方案,以僅 400K 左右的包體大小實現了 Skia 近2M 包體的絕大部分功能,併爲 PAG 4.0 版本帶來了約 65% 的包體降低以及 60% 的矢量渲染性能提升。截止 2023 年 10月,藉助 PAG 項目,TGFX 已經實際運行在了1500+ 的頭部業務場景中,如微信,手Q,王者榮耀,小紅書,知乎,Bilibili等,穩定性也經過了 10 億+ 用戶設備的持續驗證。除了 PAG 外,TGFX 目前也獨立在部分音視頻編輯框架,Hippy動態化框架以及騰訊文檔中作爲底層的繪圖引擎使用。

PAG 動效:https://github.com/Tencent/libpag

Hippy動態化框架:https://github.com/Tencent/Hippy

 

2、誕生背景

 

谷歌的 Skia 是一個非常優秀的 2D 繪圖引擎,目前依然是行業裏在繪圖引擎領域的事實標杆。但 Skia 主要還是服務於谷歌系產品相關的常見訴求,對於其他產品的特殊需求場景可能難以完全覆蓋。例如我們在 PAG 動效項目裏就存在極致的包體精簡,以及對可預測的時間軸渲染進一步優化的訴求。行業裏目前也缺少性能與 Skia 匹配但更加輕量的其他解決方案。爲了繼續突破包體和性能的限制,我們從 2021 年開始投入研發了一套輕量的純 GPU 繪圖引擎 TGFX,最終以 400K 左右的包體完成了對 Skia 的輕量化替代,並帶來了 PAG 4.0 版本矢量渲染性能 60% 的提升,騰訊文檔在接入使用後也獲得了約 50% 的內存佔用降低。接下來我們會以這個精簡的版本爲基礎持續完善,爭取爲行業補充 Skia 之外的另一個輕量化選項。

 

3、架構設計

包體優化

TGFX 最終以 400K 左右的大小覆蓋了 Skia 近 2M 包體的絕大部分功能。

核心優化策略主要有兩點:

 

徹底拋棄傳統的 CPU 渲染管線:現代的硬件已經幾乎不存在沒有 GPU 的設備,即使像服務器端這種特殊的場景,通過 Swiftshader 來模擬 GPU 也可以得到很不錯的性能。但 Skia 由於歷史原因一直同時包含了 CPU 和 GPU 的兩條渲染管線,並且由於它的 GPU 渲染管線重度依賴 CPU 的部分,導致沒法單獨使用它的 GPU 渲染管線。我們在 TGFX 中徹底解決了這個耦合的問題,打造出了一個純 GPU 的繪圖引擎,這裏就節省了大概一半的包體。

最大化的利用平臺端內置的所有能力:例如圖片解碼,字體解析,矢量柵格化等等,這些都會優先使用系統原生的接口替代內置第三方庫的策略。以文本和矢量的柵格化爲例,在 iOS 上我們直接使用了系統提供的 CoreGraphics,文本方面則利用起 CoreText 等。而在其他平臺才嵌入了 Freetype。雖然增加了不同平臺適配的工作量,但是包體確實也獲得了極致的優化。

調度優化

TGFX 並不只是做 Skia 的簡化,還把一些在業務上調用起來非常複雜的通用性流程進行了抽象封裝:

 

Skia 雖然提供了 GPU 的渲染管線,但只實現了跨平臺渲染的部分,所有跟平臺相關的視圖橋接以及上下文的初始化都需要用戶自己處理。這會導致用戶正常用起來 Skia 的 GPU 模式需要對每個平臺寫大量的適配代碼。除了工作量大外這部分還是兼容性的重災區,要處理很多類似 iOS 中退到後臺執行 OpenGL 的特殊情況,以及線程安全問題。

爲了避免每個業務都要重新經歷一遍這些兼容性問題和坑點,我們在設計 TGFX 的調用流程時,在頭尾補充上了 Skia 沒有的 Device & Window 系統,並把在各個平臺積累的GPU適配經驗都沉澱到了這個模塊中:

藉助TGFX 提供的 Device & Window 系統,業務只要按照統一的模式進行調用,所有平臺相關的複雜度都可以不用關心,並且從 API 上限制了你必須以線程安全的方式進行調用。即使沒有非常資深的 GPU 渲染經驗也可以很輕鬆上手使用。

其他優化

在性能和架構方面,還做了這些額外的優化:

● 默認開啓了 HardwareBuffer 的支持,來全面加速紋理的提交,包括 Android 端。

● 暴露了引擎內部 Path 對應的 GPU 高速緩存,避免矢量繪製充分進行三角剖分操作。

● GPU 對象支持在任意線程釋放,等關聯的上下文激活時才清理,避免隨機 Crash 問題。

● 約束圖片解碼完會盡可能只緩存 GPU 的紋理部分,理論上全局可以降低一半的內存佔用。

● 將絕大部分緩存都交給了上層業務精確管理,避免隨機繪製的緩存持續佔用額外的內存。

● 在全平臺都實現了默認字體的讀取能力,包括瀏覽器,避免下載上百兆 CJK 字體的壓力。

● 增加了對各種硬解視頻幀格式的直接繪製能力,可以一次性上屏無需通過 CPU 轉換格式。

● 放棄了 SKSL 的統一 Shader 語言設計,更加符合原生接口調用習慣,既節省了包體,也減少了 GPU Program 的編譯耗時。

 

4、項目規劃

TGFX 項目未來的部分規劃:

● 全面的指令化渲染,最大化併發準備 GPU 數據。

● Vulkan 和 Metal 等渲染後端的支持。

● Picture 回放類的支持。

● 全鏈路廣色域渲染支持。

● 打印支持,支持渲染輸出 PDF。

● 3D 矩陣變換能力從 PAG 下沉到 TGFX。

● 完善的運行時性能數據統計和調試接口。

 

5、項目地址

https://github.com/Tencent/tgfx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章