RFC-0174:扁平大地擴充

RFC-0174:Scale in Flatland
狀態已接受
區域
  • 圖形
說明

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

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2022-06-02
審查日期 (年-月-日)2022-07-01

摘要

本 RFC 說明 Flatland 如何處理圖形縮放作業。Scenic 是 Fuchsia 的系統合成器,可透過 Flatland 的 SetScale() 方法,處理 Flatland 執行個體輸出的放大或縮小作業。您可以使用浮點比例係數,保證產生的圖片不會出現子像素算繪問題。Flatland 執行個體只會知道裝置像素比例值。除了縮放比例的設計,這項 RFC 也定義了一些常用術語,用於指稱像素空間。

提振精神

許多 UI 功能通常都需要圖形比例作業,而 Flatland 做為完整的系統合成器,應提供這項作業。以下將詳細說明其中三項。

向上取樣

升頻是增加 Flatland 執行個體或圖片的算繪大小。 舉例來說,假設您要放大畫面,如要放大,可以要求 Scenic 將 Flatland 用戶端應用程式的輸出內容放大。

縮小取樣

降採樣會縮小 Flatland 執行個體或圖片的算繪大小。舉例來說,請參考 GNOME 的「活動總覽」。圖形系統殼層可能希望 Flatland 用戶端應用程式繼續以相同解析度算繪,但要求 Scenic 將內容輸出縮小至較小的矩形。

裝置像素比例

定義裝置像素比例後,螢幕製造商就能調高裝置解析度,同時在新螢幕上以相同大小顯示為較低解析度設計的內容。舉例來說,筆電的 4K 和 1080p 螢幕版本從遠處看來會一模一樣,所有按鈕和版面配置的實際大小都相同。只有在靠近時,你才能看出 4K 較為銳利,因為 4K 在與 1080p 相同的實體空間中,封裝的實體像素是 1080p 的 4 倍。

利害關係人

協助人員:neelsa@google.com

審查者:

  • 輸入:neelsa@google.com、quiche@google.com
  • 無障礙功能:lucasradaelli@google.com
  • Scenic:jaeheon@google.com、dworsham@google.com、jjosh@google.com

公共平台:

我們已在內部與 Scenic、Input 和無障礙功能團隊審查這項設計的詳細版本。我們也討論了替代解決方案。

詞彙解釋

  • Flatland
    • Scenic 的全新 2D 合成 API。
  • Gfx
    • Scenic 舊版 3D 合成 API,已淘汰。
  • 查看
    • 圖像內容的視覺區域。
    • 它具有座標系統、定界框,以及透過 View 樹狀結構定義的空間關係。
  • HiDPI
    • 高每英寸像素數。
    • 業界用語,指在相同實體區域中塞入更多像素的螢幕。舉例來說,螢幕的 DPI 至少為 240 時,即視為 HiDPI。
  • PP
    • 實體像素。
    • 螢幕的實際像素數量。舉例來說,如果同一部筆電有 4K 和 FHD 螢幕變種版本,4K 螢幕的實際像素為 3840x2160,FHD 螢幕的實際像素為 1920x1080,因此圖示在兩種筆電變種版本上會顯示相同大小,只是 HiDPI 螢幕上的圖示會更清晰
  • DIP
    • 裝置獨立像素,又稱邏輯顯示像素,或密度獨立像素。
    • 螢幕的邏輯像素數。也就是說,如果同一部筆電有 4K 和 FHD 螢幕變種版本,4K 和 FHD 最有可能都具有 1920x1080 的裝置獨立像素。
  • DPR
    • 裝置像素比例。
    • 螢幕的實際像素與裝置獨立像素之間的比例。
  • LP
    • 邏輯檢視像素,又稱檢視畫面與裝置無關的像素
    • View 的邏輯像素數。影響內容版面配置。
  • AP
    • 分配像素。
    • 檢視繪圖緩衝區分配的像素數量。
  • PSS
    • 家長設定的尺度,又稱累積尺度。
    • 所有父項 SetScale() 值相乘。檢視畫面 DIP 與螢幕 DIP 的比率。

設計

為配合「動機」一節所述的所有用途,我們定義了一組關係,用來建立父項檢視區塊可在子項上設定的值 (父項定義)、只能由 Flatland 設定的值 (系統定義),以及子項可觀察到的值 (子項觀察)。

裝置像素比例是由系統為單一螢幕上的所有檢視區塊統一定義。DPR 是孩子觀察到的。

子項檢視區塊的大小是以 LP 為單位。這個大小是由父項定義,子項則會觀察。如果檢視區塊的 LP 大小和對齊方式與用於算繪檢視區塊的區域顯示器 DIP 完全相符,則檢視區塊的解析度最佳。檢視區塊應以最佳解析度運作,也就是大小和對齊方式的 LP=DIP。不過,最佳解析度並非子項觀察到的解析度,且可由家長檢視模式 (使用縮放比例,請參閱下文) 刻意中斷,以啟用放大或 GNOME 的「活動總覽」等功能。

比例會以浮點值表示。這是由父項定義,但子項並未觀察到!孩童檢視模式的父項設定比例,是該孩童檢視模式所有上層檢視區塊所導入的所有比例相乘的結果。PSS 是指子檢視區塊的 LP 與螢幕的 DIP 之間的比例。隱藏 PSS 後,Flatland 仍可控制子項檢視畫面在螢幕上佔用的實體像素數量,不必在升採樣或降採樣時強制子項重新分配或重新呈現。

我們還會使用配置像素進一步區分,這是用來向螢幕顯示內容的緩衝區大小。這是用戶端實作詳細資料,但為避免混淆,我們將說明其與其他像素空間的關係:

  • HiDPI 感知的用戶端希望呈現清晰的內容,並可控制內容大小。配置像素是邏輯檢視區塊像素乘以 DPR。
  • 不瞭解 DPR 的用戶只想以一種大小呈現內容。它們會忽略 DPR,且其配置像素等於邏輯檢視像素。
  • 自訂分配客戶的內容會強制執行分配像素,即影片播放器或 WebCanvas。這些用戶端會自行定義分配像素和邏輯檢視像素之間的關係。

Flatland 對應:

  • PPDisplay = DIPDisplay* DPR
  • PPView = LPView * PSS * DPR
  • AP檢視至 LP檢視實際上是客戶自己的商家。
    • 建議 HiDPI 感知型用戶端使用 APView = LPView * 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;
    });
}

Scenic 會在算繪或傳送圖片至螢幕前,將 DPR 套用為每張圖片的比例。如果用戶端想支援 HiDPI,應使用指定的 LP 配置內容,但要使用回報的 DPR 分配較大的緩衝區,以抵銷 Scenic 的縮放效果。

PSS 不會與孩子溝通。也就是說,透過 Flatland 放大圖片可能會導致模糊的構件。不過,相較於強制用戶重新分配及重新呈現 (例如緩衝區空間會因縮放比例係數而增加,並有 OOM 風險),這還是比較好的做法。

我們可能會得到浮點數比例的非整數像素。如果我們以一致的方式附加至附近的整數像素值(四捨五入),就不會產生構件。

Flatland 用戶可能想從邏輯像素轉換為實體像素,這時除了 DPR,還需要知道 PSS。不過,這項資訊僅供輸入,因此這項設計會將轉換資訊推送至 fuchsia.ui.pointer API。

用戶端可使用這個 API,按照自己的步調回應 DPR 異動。系統會同時向所有信號發出這些異動的通知,因此不會出現延遲的連鎖式卡頓模式。

用戶端應一律預期會使用單一 DPR 值。日後支援多個螢幕時,我們可以回報來自多個螢幕的單一 DPR 值,或是顯示器上的 DPR 值。

與舊版比較

請注意,在 Gfx(舊版 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,且套用 2 的 DPR,則子項會收到 pixel_scale 10,並分配到 10 倍大的緩衝區。這項提案會區分 DPR 和 PSS,因此不必要的分配作業將會消失。

這項提案可降低用戶對重新配置和重新排版的期望。我們不再需要 Flatland 用戶端回應縮放比例變更,因此可實作更順暢的升採樣和降採樣作業。

安全性考量

這項提案不會影響 Flatland API 的安全模型。API 保證的其他圖形作業 (例如限制 View 的輸入接收區域) 仍適用於縮放內容。

這項提案會減少傳遞至 Flatland 檢視區塊的資訊量。在 Gfx 中,DPR 和 PSS 會相乘為單一值,並回報給子項。本提案僅回報 DPR 資訊。子項 Flatland 執行個體不會顯示父項 Flatland 執行個體如何決定呈現內容 (是否縮放),也無法對縮放變更做出反應。

隱私權注意事項

這項提案建議將 DPR 資訊傳送給 Flatland 客戶。裝置像素比例是根據螢幕單元的實體和技術屬性計算而來。雖然這項資訊非常具體,但這項屬性和比例並非獨一無二,可能在多個硬體上都很常見,因此對於數位指紋採集來說不太實用。此外,準備高品質的圖像輸出內容時,絕對需要 DPR。

測試

Flatland API 採用分層方式測試,因此縮放功能會遵循下列做法:

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

說明文件

這項 RFC 發布後,部分 Flatland 文件將會更新,說明支援 HiDPI 的用戶端行為和縮放運作方式。

缺點、替代方案和未知事項

實作這項提案不會產生高昂的費用。這項提案建議的 DPR 解決方案適用於任何顯示器硬體。也可以擴充,用於多螢幕用途。

這個設計有幾個替代方案。

  • 在部分 Chromium 設定中,DPR 已新增為可設定的靜態值。這顯然無法在不同應用程式之間擴充。
  • 為避免四捨五入問題,我們考慮只允許整數比例因子。 不過,在某些 DPR 設定中,這項規則不適用。
  • 如果我們有浮點值,可能會進入緩慢的子像素算繪路徑。不過,沒有充分的理由這麼做,而且不允許將效能傳遞緩衝區直接傳遞至螢幕,會阻礙效能。

既有技術和參考資料