RFC-0174:Scaled in Flatland

RFC-0174:在 Flatland 中扩缩
状态已接受
领域
  • 显卡
说明

定义如何在 Flatland 中处理图形扩缩操作。

问题
  • 99312
Gerrit 更改
  • 686572
作者
审核人
提交日期(年-月-日)2022-06-02
审核日期(年-月-日)2022-07-01

总结

此 RFC 说明了在 Flatland 中如何处理图形扩缩操作。作为 Fuchsia 的系统合成器,Sensel 可以通过 Flatland 的 SetScale() 方法处理放大或缩小 Flatland 实例的输出。可使用浮点缩放比例,并保证生成的图像会避免子像素渲染。Flatland 实例只知道设备像素比值。除了比例设计之外,此 RFC 还定义了一些用于指代像素空间的常用术语。

设计初衷

作为完整的系统合成器,Flatland 应提供的许多界面功能通常都需要图形缩放操作。下面将详细介绍其中三种方法。

上采样

上采样会增加 Flatland 实例或图片的渲染大小。例如,考虑使用放大功能。您可以通过要求 Scenic 对 Flatland 客户端应用的输出进行上采样来完成放大操作。

下采样

降采样可以减小 Flatland 实例或图片的渲染大小。例如,请参考 GNOME 的 Activity 概览。图形系统 shell 可能希望让 Flatland 客户端应用继续以相同的分辨率进行渲染,但通过向 Views 请求将其内容输出缩小到较小的矩形。

设备像素比

定义了设备像素比,以便显示屏制造商能够提高其设备的分辨率,同时仍能在新屏幕上以相同尺寸显示专为较低分辨率设计的内容。例如,从远处看,4K 和 1080p 屏幕的笔记本电脑看起来完全相同,并且所有按钮和布局在物理上都相同。只有靠得更近,您才会知道 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
    • View 的全新 2D Composition API。
  • Gfx
    • 已弃用的 Views 的旧版 3D Composition API。
  • 查看
    • 图形内容的视觉区域。
    • 它具有坐标系、边界框以及通过视图树与其祖先实体定义的空间关系。
  • HiDPI
    • 每英寸的点数很多。
    • 用于显示将更多像素打包到同一物理区域中的行业术语。例如,240dpi 或更高级别的屏幕会被视为 HiDPI。
  • PP
    • 物理像素。
    • 显示屏的物理像素数。例如,如果同一款笔记本电脑的 4K 屏幕和 FHD 屏幕变体,4K 具有 3840x2160 物理像素,FHD 物理像素为 1920x1080,因此图标在两种笔记本电脑变体上的显示效果相同,但在 HiDPI 显示屏上会更清晰
  • DIP
    • 设备无关像素(又称为逻辑显示像素,又称为密度无关像素)。
    • 显示屏的逻辑像素数。例如,如果同一款笔记本电脑的 4K 屏幕和 FHD 屏幕变体,4K 和 FHD 屏幕很可能具有 1920x1080 设备独立像素。
  • DPR
    • 设备像素比。
    • 屏幕的物理像素与屏幕的设备独立像素之间的比率。
  • 语言包
    • 逻辑视图像素,又称为视图的设备无关像素
    • 视图的逻辑像素数。影响内容布局。
  • AP
    • 分配像素。
    • 视图的绘制缓冲区分配像素计数。
  • PSS
    • 父级设置的缩放,也称为累计缩放。
    • 将所有父级 SetScale() 值相乘。View 的 DIP 与屏幕的 DIP 之间的比率。

设计

为了适应“动机”部分中所述的所有用例,我们定义了一组关系,这些关系用于建立父视图可以对子级设置哪些值(由父级定义)、哪些值只能由 Flatland 设置(由系统定义),以及子级可以观察到哪些值(子级观察)。

设备像素比是针对单个显示屏上的所有视图统一定义的。DPR 由子级观察。

子视图的大小以 LP 为单位进行衡量。此大小由父项定义并由子项观察。如果视图 LP 的大小和对齐方式与用于渲染视图的区域的显示屏 DIP 精确匹配,则视图具有最佳分辨率视图应表现为具有最佳分辨率,其中 LP=DIP 的大小和对齐。不过,最佳分辨率不会观察到子级,而是可以被父视图刻意破坏(使用比例,见下文)以启用放大功能或 GNOME 的 Activity 概览等功能。

Scale 以浮点值的形式引入。它由父项定义,但未由子项观察!子视图的父视图设置的缩放比例是该子视图的所有祖先视图引入的所有缩放的乘积。PSS 描述了从子视图的 LP 到显示屏的 DIP 的比率。通过隐藏 PSS,Flatland 可以控制子视图在屏幕上占据的物理像素数量,而不会在上采样或降采样时强制子视图重新分配或表示。

我们对分配像素进行了进一步区分,分配像素是用于呈现要显示的内容的缓冲区的大小。这是客户端实现细节。为避免混淆,我们在此介绍它与其他像素空间的关系:

  • 可感知 HiDPI 的客户端希望看起来很清晰,并且能够控制其内容的大小。其分配像素是 Logical View 像素与 DPR 的乘积。
  • 不依赖 DPR 的客户希望仅以一种尺寸呈现内容。它们会忽略 DPR,并且它们的分配像素等于其 Logical View 像素。
  • 自定义分配客户端具有强制执行其分配像素的内容,例如视频播放器或 WebCanvas。这些客户端将定义自己的分配像素和 Logical View 像素之间的关系。

Flatland 映射:

  • PPDisplay = DIPDisplay* DPR
  • PP 观看次数 = LP 观看次数 * PSS * DPR
  • APView 到 LP View 实际上是客户自己的业务。
    • APView = LPView * DPR 建议用于能够感知 HiDPI 的客户端。

上述像素空间关系如图 1 所示。

图 1 - Flatland 此图显示了像素空间关系。

建议的更改用以下 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;
    });
}

在 View 渲染或将其发送到显示屏之前,DPR 会作为刻度应用于每张图片。如果客户端想要支持 HiDPI,则应使用给定语言包来布置其内容,但使用报告的 DPR 来分配更大的缓冲区,以逆转景观缩放的效果。

系统不会将 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 并应用 DPR 2,则会收到值为 10 的 pixel_scale,并且为其分配的缓冲区大小是原来的 10 倍。此方案区分了 DPR 和 PSS,因此不必要的分配都消失了。

此方案可以减少客户端对重新分配和重新布局的期望。我们可以实现更顺畅的上采样和降采样操作,因为我们不再依赖 Flatland 客户端来响应缩放变化。

安全注意事项

此方案不会影响 Flatland API 的安全模型。该 API 保证的其他图形操作(例如,限制 View 的输入接收区域的裁剪)仍然适用于缩放后的内容。

此方案可减少传递到 Flatland 视图的信息范围。在 Gfx 中,DPR 和 PSS 相乘为单个值,并报告给子级。此提案仅报告 DPR 信息。子级 Flatland 实例不会指示其父级 Flatland 实例如何决定如何显示其内容(是否缩放),并且无法响应缩放变化。

隐私注意事项

此方案建议向 Flatland 客户端发送 DPR 信息。设备像素比取决于显示屏的物理和技术属性。虽然这一信息非常具体,但此属性和比率不是唯一的,并且可能在多个硬件中很常见,因此对数字“指纹”收集不是很有用。此外,DPR 对于准备高质量的图形输出来说必不可少。

测试

Flatland API 已采用分层方法进行测试,相应的扩展功能将遵循以下原则:

  • 风景优美的代码库中的单元测试。
  • /src/ui/tests 中的界面集成测试,用于执行有关 Flatland API 的协定。
  • 从 DPR 值不 1 的设备捕获输出像素的系统测试。
  • Chromium 和 Flutter 等运行时会编写集成测试,以测试 SetScale() 和不同 DPR 值的使用情况。

文档

部分 Flatland 文档将按照此 RFC 更新,以描述 HiDPI 感知的客户端行为以及扩缩的工作原理。

缺点、替代方案和未知情况

实施此方案不会产生高额费用。此方案建议一种 DPR 解决方案,无论使用哪种显示硬件,该解决方案都有效。它还会针对多显示屏用例进行扩展。

针对这种设计,我们考虑了几种备选方案。

  • 在某些 Chromium 配置中将 DPR 添加为可配置的静态值。这显然无法跨不同的应用进行扩缩。
  • 为了避免舍入问题,我们考虑仅允许整数缩放比例。不过,在某些 DPR 配置中,也存在例外情况。
  • 当存在浮点值时,我们可能会遇到子像素渲染速度缓慢的路径。不过,没有什么说服力的理由这样做,而且因为不允许性能将缓冲区直接传递到显示屏,因此会降低性能。

早期技术和参考资料