RFC-0174:扁平大地擴充

RFC-0174:在 Flatland 中縮放
狀態已接受
區域
  • 顯示卡
說明

定義在 Flatland 中處理圖形縮放作業的方式。

問題
  • 110
變更
作者
  • emircan@google.com
審查人員
提交日期 (年/月)2022-06-02
審查日期 (年/月)2022-07-01

摘要

這個 RFC 說明在 Flatland 中處理圖形資源調度作業的方式。風景如 Fuchsia 的系統合成器,可透過 Flatland 的 SetScale() 方法,處理向上或縮減 Flatland 執行個體的輸出內容。可使用浮點縮放比例係數,並保證產生的圖片可避免子像素轉譯。Flatland 執行個體只會得知裝置像素比率值。除了規模設計之外,這個 RFC 定義了參照像素空間的一些常見術語。

提振精神

一般的系統合成器 (Flatland) 應該提供許多 UI 功能,因此通常都會需要圖形縮放作業。以下提供三組詳細說明。

向上取樣

提高取樣功能會增加 Flatland 執行個體或圖片的算繪大小。例如,請考慮放大功能。您可以要求 Scenic 對 Flatland 用戶端應用程式的輸出進行取樣,藉此進行放大。

縮小取樣

降低取樣會減少 Flatland 執行個體或映像檔的算繪大小。例如,考慮使用 GNOME 的活動總覽。圖形系統殼層可能想要讓 Flatland 用戶端應用程式以相同解析度繼續算繪,但是會要求 View 將其內容輸出縮減為較小的矩形。

裝置 Pixel 顯示比例

根據裝置像素比例的定義,顯示製造商可以提高裝置的解析度,同時仍能在新螢幕上以相同大小的解析度顯示內容。舉例來說,4K 和 1080p 的筆記型電腦外觀與距離相同,但所有按鈕和版面配置的實體大小都相同。只有靠近時才會分辨 4K 清晰無比,因為 4K 可在和 1080p 相同的實體空間中封裝 4 倍的實體像素。

相關人員

講師:neelsa@google.com

審查者:

  • 輸入:neelsa@google.com, quiche@google.com
  • 無障礙工具:lucasradaelli@google.com
  • 風景:jaeheon@google.com、dworsham@google.com、jjosh@google.com

社群媒體化:

此設計的詳細版本在內部,由風景、輸入和無障礙團隊進行內部審查。此外,我們也探討了替代解決方案

詞彙解釋

  • Flatland
    • 風景區的全新 2D 組合 API。
  • Gfx
    • View 的舊版 3D 組合 API 已淘汰。
  • 檢視
    • 圖像內容的視覺化區域。
    • 它具備座標系統、定界框,以及透過 View 樹狀結構與祖系定義的空間關係。
  • HiDPI
    • 每英寸高點。
    • 這個產業字詞用於顯示同一實體區域中封裝更多像素的像素。舉例來說,系統會將 240 dpi 以上的螢幕視為 HiDPI。
  • PP
    • 實體像素。
    • 螢幕的實際像素數量。也就是說,在同一部筆記型電腦上,如果同時有 4K 和 FHD 螢幕變化版本,4K 則為 3840x2160 實體像素,FHD 則擁有 1920x1080 實體像素,因此兩個筆記型電腦的子類上會顯示相同的圖示,在 HiDPI 螢幕上也能更清晰地顯示。
  • DIP
    • 裝置獨立像素 a.k.a. 邏輯顯示像素 a.k.a. 密度獨立像素。
    • 螢幕的邏輯像素數量。也就是說,如果同一部筆電有 4K 和 FHD 螢幕變體,那麼 4K 和 FHD 兩種螢幕很可能都有 1920x1080 的裝置獨立像素。
  • DPR
    • 裝置像素比例。
    • 螢幕的實體像素與螢幕裝置獨立像素之間的比率。
  • LP
    • 邏輯檢視像素 (a.k.a. View 的裝置獨立像素)
    • 檢視畫面的邏輯像素數量。影響內容版面配置。
  • AP
    • 分配像素。
    • 檢視畫面的繪製緩衝區分配像素數量。
  • PSS
    • 母親設定縮放 a.k.a。累計體重計。
    • 所有父項 SetScale() 值相乘。檢視畫面的 DIP 與螢幕 DIP 之間的比率。

設計

為因應「動機」一節所述的所有用途,我們定義了一組關係,其中定義了可在子項 (父項定義) 上可設定的值、僅限 Flatland (系統定義) 設定的值,以及子項可觀察的值 (兒童觀察)。

「裝置像素比率」是指系統針對單一螢幕上的所有檢視畫面統一定義。DPR 受兒童觀察。

並以 LP 測量子檢視畫面的大小。這個大小是由父項定義,以及由子項定義。如果檢視畫面的 LP 大小和對齊方式完全符合螢幕用於顯示檢視畫面的區域的 DIP,檢視畫面就會顯示「最佳解析度」。當檢視畫面有最佳解析度時,就應發揮 LP=DIP 的大小和對齊方式。不過,最佳解析度「不是」兒童觀察範圍,且可刻意由上層檢視畫面損毀 (使用「比例尺」,請參閱下文),以便支援放大或 GNOME 的活動總覽等功能。

比例是以浮點值的形式導入。這是父項定義,但不是子項觀察到的情況!父項檢視畫面的縮放比例,是該子項所有祖系檢視畫面導入的所有縮放倍數。PSS 會說明子項檢視畫面的 LP 和螢幕 DIP 的比例。隱藏 PSS 後,Flatland 仍可控制子項檢視畫面在螢幕上佔用的實體像素數量,而無需強制子項在增強或降低取樣時重新分配或重新呈現。

我們針對配置像素進行了進一步區別,分配像素是用來呈現要顯示的內容的緩衝區大小。這是用戶端實作的詳細說明,但為避免造成混淆,我們將說明此元素與其他像素空間的關係:

  • HiDPI 感知的客戶會希望畫面銳利,並能控制內容大小。其分配像素是邏輯 View 像素乘以 DPR。
  • 面對 DPR 的高階客戶,他們希望只呈現一種尺寸的內容。這類物件會忽略 DPR,且分配像素等於邏輯檢視畫面像素。
  • 自訂配置用戶端有會強制執行配置像素的內容,例如影片播放器或 WebCanvas。這些用戶端會定義分配像素與邏輯檢視畫面像素之間的關係。

平地對應:

  • PP螢幕 = DIP螢幕* DPR
  • PPView = LPView * PSS * DPR
  • 從 AP View 到 LPView 其實是客戶的業務。
    • APView = LPView * 適用於 HiDPI 感知的用戶端,建議使用 DPR。

上述的像素空間關係如圖 1 所示。

圖 1 - 平地 這張圖顯示了像素空間關係。

提議的變更是以下列 FIDL 程式碼片段表示:

type LayoutInfo = table {
    /// The layout size of a View in logical pixels, defined by the parent's call to
    /// [`SetViewportProperties`]. Clients should re-layout their content when this value changes.
    1: logical_size fuchsia.math.SizeU;

    /// The ratio from physical display pixels to the display's device independent pixels.
    /// Clients should not necessarily re-layout their content when this value changes. Clients may
    /// accommodate by reallocating their Image buffers that are adjusted by [`device_pixel_ratio`].
    /// HiDPI-aware clients that want to avoid sampling artifacts should render onto a buffer with
    /// at least the size round([`logical_size`] * [`device_pixel_ratio`]).
    /// Note that rounding is not C-style float-to-int truncation. The floating-point product should
    /// be converted to the nearest integer.
    2: device_pixel_ratio fuchsia.math.VecF;
};

protocol Flatland {

/// Sets the scale on a Transform. The order of geometric attribute application is addressed
/// in the documentation for SetTranslation().
/// Note that if there is a Viewport set on this Transform, the child Flatland will not be notified
/// about the changes made here. This method should only be used if the intention is to upsample or
/// downsample the Viewport's output. Use [`SetViewportProperties`] if the intention is to resize or
/// relayout the Viewport.
SetScale(struct {
        transform_id TransformId;
        scale fuchsia.math.VecF;
    });
}

在算繪圖像或將圖像傳送至螢幕前,系統會先對每張圖像套用 DPR。如果客戶想要支援 HiDPI,應使用指定的 LP 來配置內容,但使用回報的 DPR 來反轉 View 縮放的影響,藉此分配較大的緩衝區。

PSS 不會傳達給子項。這表示透過 Flatland 放大可能會導致畫面模糊不清。不過,這比較偏好強制用戶端重新分配及傳回資料,例如緩衝區大小會因為規模因子的增加,而 OOM 的風險也會增加。

我們最終採用非整數像素的浮點值。如果以一致的方式附加至鄰近的整數像素值(圓形),我們就不會產生構件。

Flatland 用戶端可能希望從邏輯像素轉換為實體像素,因此除了 DPR 以外,還需要瞭解 PSS。不過,只有在輸入時才需要這麼做,因此這項設計會將轉換資訊推送至 fuchsia.ui.pointer API。

客戶可以透過這個 API,按照自己的步調回應 DPR 的變化。這些變更都會同時收到有關這些變更的訊息,因此沒有串聯延遲卡頓模式。

客戶應一律接受單一 DPR 值。當我們日後支援多個螢幕時,我們可以回報包含多個螢幕的單一 DPR 值,或這些螢幕所在的螢幕的 DPR 值。

與舊版對比

請注意,在 Gfx(Legacy 3D API) 中,DPR 和 PSS 會乘以單一值並回報給子項。因此,大規模操控會導致用戶端程式碼發生分配的副作用,進而造成 OOM 和其他非預期的副作用,包括大規模架構解決方法來達成放大和混淆 DPR 的效果。這個 Flatland 設計的建議,其建議子項只需要瞭解 DPR,以便使用圖形。

Gfx 對應:

  • PPView = LPView * pixel_scale
    • pixel_scale = PSS * DPR
    • pixel_scale 是 Gfx 唯一傳回的指標。

實作

這項設計涉及 fuchsia.ui.composition/Flatland API 的變更。導入作業將透過以下三個主要步驟完成:

  • 移除使用即將淘汰的 pixel_scale 欄位 (已淘汰、樹狀結構內和樹狀結構外)。
  • 完成樹狀結構內變更。根據螢幕回報的內容傳送 DPR 資訊。
  • 變更樹狀結構內和樹狀結構外用戶端程式碼,以使用 DPR 資訊調整 AP。

效能

相較於 Gfx API,本提案可降低 DPI 感知用戶端的記憶體用量。在 Gfx 中,DPR 和 PSS 會乘以單一值並回報給子項。具 DPI 的用戶端會回應所有規模的累計。 舉例來說,如果父項的縮放比例為 5,而其套用的 DPR 為 2,則會收到 10 的 pixel_scale,並分配較大的緩衝區為 10 倍。本提案會區分 DPR 和 PSS,因此不必要的分配作業會消失。

本提案減少了用戶端重新分配及重新版面配置的期望。我們可以執行更順暢的向上取樣和向下取樣作業,因為我們不再依賴 Flatland 用戶端來回應規模變更。

安全性考量

本提案不會影響 Flatland API 的安全性模型。此 API 保證有其他圖形作業 (例如限制接收檢視畫面區域的輸入限制) 仍適用於調整後的內容。

本提案減少傳送至 Flatland 檢視畫面的資訊範圍。在 Gfx 中,DPR 和 PSS 會乘以單一值,並回報給子項。本提案僅回報 DPR 資訊。子項 Flatland 執行個體沒有指示其父項 Flatland 執行個體會如何決定顯示內容、縮放與否,以及無法回應縮放變更。

隱私權注意事項

本提案建議將 DPR 資訊傳送給 Flatland 客戶。裝置 Pixel 比率取自顯示裝置的實體和技術屬性。雖然這是非常具體的資訊,但此屬性和比率可能重複,也可能橫跨多個硬體,因此不適合用於數位指紋採集。此外,DPR 也是準備高品質圖像輸出的必備條件。

測試

Flatland API 已通過分層式測試,縮放功能如下所示:

  • View 程式碼集中的單元測試。
  • /src/ui/tests 中的 UI 整合測試,測試了 Flatland API 的合約。
  • 系統測試會從 DPR 值以外的裝置擷取輸出像素。
  • Chromium 和 Flutter 等執行階段會寫入整合測試,以便針對 SetScale() 和不同 DPR 值的使用情形進行測試。

說明文件

部分 Flatland 說明文件會依照這個 RFC 更新,以說明 HiDPI 感知的用戶端行為和資源調度運作方式。

缺點、替代方案和未知

導入這項提案的成本不會高昂。本提案建議採用無論使用何種顯示硬體,皆能正常運作的 DPR 解決方案。此外,如果有多個螢幕使用情境,可能也會擴充該值。

這種設計時,可以選擇幾種替代方案。

  • 在部分 Chromium 設定中,DPR 已新增為可設定的靜態值。而且該元件無法跨不同應用程式擴充。
  • 為避免發生捨入問題,我們僅允許整數縮放比例係數。不過,部分 DPR 設定中仍有例外狀況。
  • 如果有浮點值,我們就可能會發生慢速子像素算繪路徑。但是,並沒有足夠的理由,而且不會允許效能將緩衝區直接傳遞至螢幕,進而拖慢效能。

先前的圖片和參考資料