RFC-0174:Scaled in Flatland

RFC-0174:在 Flatland 中扩展
状态已接受
领域
  • 图形
说明

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

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

摘要

本 RFC 介绍了在 Google Cloud 控制台中如何处理图形扩缩操作, Flatland。作为 Fuchsia 的系统合成器,风景优美, 通过 Flatland 的 SetScale() 方法。可以使用浮点缩放比例,并保证 以确保生成的图像可避免亚像素渲染。仅限 Flatland 实例 了解设备像素比值。除了规模的设计之外 此 RFC 定义了一些用于指代像素空间的常用术语。

设计初衷

许多界面功能通常需要图形缩放操作, Flatland 作为完整的系统合成器应提供。其中三个是 下文对此进行了详细介绍。

升采样

上采样会增加 Flatland 实例或图像的渲染大小。 以放大功能为例。说出指令即可进行放大 用于对 Flatland 客户端应用的输出进行上采样的景观。

下采样

降采样是指减小 Flatland 实例或 图片。以下面的代码为例 GNOME 的活动概览。 图形系统 Shell 可能需要使 Flatland 客户端应用继续 以相同的分辨率进行渲染,但将其内容输出缩小为 来创建一个矩形

设备像素比

定义设备像素比是为了方便显示屏制造商 同时仍能显示内容、 专为较低分辨率而设计,在新屏幕上以相同尺寸显示。作为 例如,笔记本电脑的 4K 和 1080p 版本与 距离,所有按钮和布局的物理尺寸都相同。仅当您 那么就会分辨出 4K 更清晰, 与 1080p 在同一物理空间中的物理像素数的乘积。

利益相关方

教员:neelsa@google.com

审核者

  • 输入:neelsa@google.com、quiche@google.com
  • 无障碍服务:lucasradaelli@google.com
  • 风景:jaeheon@google.com、dworsham@google.com、jjosh@google.com

社交化

该设计的详细版本已在内部与风景、输入团队和 和无障碍团队沟通此外,我们还讨论了其他解决方案。

术语库

  • Flatland <ph type="x-smartling-placeholder">
      </ph>
    • Anthos 新增的 2D 构图 API。
  • Gfx <ph type="x-smartling-placeholder">
      </ph>
    • 已弃用的风景秀丽的旧版 3D 构图 API。
  • 查看 <ph type="x-smartling-placeholder">
      </ph>
    • 图形内容的可视区域。
    • 它具有坐标系、边界框和定义的空间, 视图树与其祖先实体之间的关系。
  • HiDPI <ph type="x-smartling-placeholder">
      </ph>
    • 每英寸的点高。
    • 这个行业术语是指显示屏在相同区域内封装更多像素 例如,对于 240dpi 或更高级别的屏幕 HiDPI。
  • PP <ph type="x-smartling-placeholder">
      </ph>
    • 物理像素。
    • 显示屏的物理像素数。例如,如果我们有 4K 和 FHD 屏幕 4K 物理像素为 3840x2160,全高清 1920x1080 物理像素,因此图标在 笔记本电脑规格,在 HiDPI 显示屏上更清晰
  • 低谷期 <ph type="x-smartling-placeholder">
      </ph>
    • 与设备无关的像素(又称为逻辑显示屏像素,又称为密度) 独立的像素。
    • 显示屏的逻辑像素数。例如,如果我们有 4K 和 FHD 屏幕变体 同一台笔记本电脑上,4K 和 FHD 的设备很可能是 1920x1080 的设备 独立的像素。
  • DPR <ph type="x-smartling-placeholder">
      </ph>
    • 设备像素比。
    • 显示屏的物理像素与显示屏设备之间的比率 独立的像素。
  • LP <ph type="x-smartling-placeholder">
      </ph>
    • 逻辑视图像素(也称为视图的设备无关像素)
    • 视图的逻辑像素数。此设置会影响内容布局。
  • 备用 <ph type="x-smartling-placeholder">
      </ph>
    • 分配像素。
    • 视图的绘制缓冲区分配像素计数。
  • PSS <ph type="x-smartling-placeholder">
      </ph>
    • 父级设置缩放,也称为累计缩放。
    • 将所有父级 SetScale() 值相乘。View 的 DIP 与 显示屏的 DIP

设计

为了纳入“动机”部分中描述的所有用例,我们定义了 一组关系,用于指定父视图可设置的值 子节点(由父定义)的节点,哪些值只能由 Flatland 设置 (由系统定义),以及子元素可以观察到的值(子元素观察的值)。

设备像素比由系统统一定义,适用于单个视频上的所有观看 。DPR 是儿童观察的。

子视图的大小以语言包为单位。此尺寸由父级定义, 作为可观察对象。如果视图的大小和对齐方式如下所示,则该视图具有最佳分辨率 对于用于修改此视图的区域,该视图的语言包与显示屏的 DIP 完全匹配 呈现视图。视图应表现为具有最佳分辨率,其中 LP=DIP 的尺寸和对齐方式。不过,最佳分辨率不是 可被父视图(使用 Scale、 (如下所示)以允许使用放大功能或 GNOME 的 Activity 等功能 概览。

缩放以浮点值的形式引入。它由父级定义,但不属于 是儿童所观察到的!子视图的父级设置缩放是所有视图相乘, 该子视图的所有祖先视图引入的缩放比例。PSS 描述了 子视图的 LP 与显示屏的 DIP 之间的比率。通过隐藏 PSS, Flatland 控制子视图的物理像素数量 不强制孩子重新分配或展示 。

我们进一步区分了分配像素,即分配像素的大小, 缓冲区,用于呈现要显示的内容。这是客户端实现 但为了避免混淆,我们要说明它与其他像素的关系 空格:

  • 支持 HiDPI 的客户希望清晰呈现,并且可以控制 内容。它们的分配像素是逻辑视图像素与 共和党
  • 关注朝鲜的客户希望仅以一种尺寸来呈现内容。他们忽略 DPR 及其分配像素等于其逻辑视图像素。
  • 自定义分配客户端具有强制实施其分配像素的内容, 即视频播放器或 WebCanvas这些客户端将定义自己的 分配像素和 Logical View 像素之间的关系。

平面地图绘制:

  • PPDisplay = DIPDisplay* DPR
  • PPView = LPView * PSS * DPR
  • 从 APView 到 LPView 实际上是客户自己的商家。
    • APView = LPView * 对于 HiDPI 感知型设备,建议采用 DPR 客户。

上述像素空间关系如图 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;
    });
}

在风景渲染或将图片发送到 显示屏上。如果客户想要支持 HiDPI,他们需要采用 并使用指定的 LP 分配较大的缓冲区,但使用 报告了朝鲜民主共和国风景秀丽的比例缩放比例所带来的影响。

子节点不传递 PSS。这意味着 可能会导致伪影。不过,此方法优于强制客户端 例如,由于缓冲区大小会随着 以及 OOM 的风险。

最终,我们可能会得到具有浮点数的非整数像素。如果我们有一个 以一致的方式附加到邻近的整数像素值(圆角), 最终不应包含制品。

Flatland 客户端可能需要将逻辑像素转换为物理像素, 除了 DPR 之外,还要了解 PSS不过,只有 因此本设计会将此转化信息 fuchsia.ui.pointer API。

客户可以使用此 API 按照自己的节奏响应 DPR 变化。他们 同时会收到关于这些更改的信号 级联延迟卡顿模式。

客户端应始终使用单个 DPR 值。当我们 将来支持多个显示屏,我们可以报告单个 DPR 值 或这些显示屏的 DPR 值

与旧版相对

请注意,在 Gfx(旧版 3D API)中,DPR 和 PSS 会乘以一个值 并将其报告给孩子因此,规模操纵导致了分配 造成 OOM 和其他意外副作用; 包括大规模的架构解决方法,以实现 放大和对 DPR 感到困惑。《Flatland》的设计与众不同, 表明孩子只需了解 DPR 即可处理图片。

Gfx 映射:

  • PPView = LP View * pixel_scale <ph type="x-smartling-placeholder">
      </ph>
    • 像素比例 = PSS * DPR
    • pixel_scale 是 Gfx 返回的唯一指标。

实现

此设计涉及 fuchsia.ui.composition/Flatland API。实现过程主要分为以下三个步骤:

  • 在树内移除 pixel_scale 字段的使用,该字段将被弃用 和树外。
  • 完成树内更改。根据从以下来源的报道内容发送 DPR 信息: 显示屏上。
  • 更改树内和树外客户端代码,以便利用 DPR 信息 调整 AP。

性能

相较于 Gfx API。在 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 信息。设备 像素比由 。虽然信息非常具体,但该属性和比例 不唯一,并且可能在多个硬件中都很常见,因此不是很有用 用于数字“指纹”收集。此外,在准备和实施 高质量的图形输出

测试

Flatland API 已经过分层方法测试,其扩展功能 关注:

  • Anthos 代码库中的单元测试。
  • /src/ui/tests 中的界面集成测试,用于执行 有关 Flatland API 的合同。
  • 用于从具有 DPR 值的设备捕获输出像素的系统测试 并不相同。
  • Chromium 和 Flutter 等运行时会编写集成测试以进行测试 使用 SetScale() 和不同的 DPR 值。

文档

在此之后,我们会更新部分 Flatland 文档, RFC,描述 HiDPI 感知型客户端行为以及扩缩的工作原理。

缺点、替代方案和未知问题

实施此提案不会产生高昂的费用。此提案 推荐了一个无论选择哪一种显示硬件都适用的 DPR 解决方案 。也可以针对多显示屏用例进行扩展。

此设计考虑了几种替代方案。

  • 在某些 Chromium 配置中,DPR 是作为可配置的静态值添加的。 这显然无法跨应用进行扩展。
  • 为避免舍入问题,我们考虑只允许整数缩放比例。 不过,在某些 DPR 配置中,也存在例外情况。
  • 我们可能遇到过慢的子像素渲染路径, 浮点值。不过,这样做没有令人信服的理由,并且 因为不允许性能传递缓冲区会降低性能 直接投放到显示屏

先验技术和参考资料