| RFC-0174:在 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
- 高每英寸像素數。
- 這個產業術語是指在相同實體區域中,螢幕可容納更多像素。舉例來說,螢幕密度為 240 dpi 以上的螢幕視為 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 設定中,這項規則不適用。
- 如果我們有浮點值,可能會進入緩慢的子像素算繪路徑。不過,沒有充分的理由這麼做,而且不允許將效能傳遞緩衝區直接傳遞至螢幕,會阻礙效能。
既有技術和參考資料
- RFC-0162:Flatland
- RFC-0147:查看系統
- RFC-0166:單一 UI 堆疊
- Flatland 與 Wayland 通訊協定在架構上有些相似之處,兩者處理高密度表面的方式與建議設計類似。