Skip to content

JEP 382: New macOS Rendering Pipeline | 新的 macOS 渲染管道

摘要

为 macOS 实现一个基于 Apple Metal API 的 Java 2D 内部渲染管道,以替代当前使用已弃用的 Apple OpenGL API 的管道。

目标

  • 为 Java 2D API 提供一个使用 macOS Metal 框架的完全功能性的渲染管道。

  • 为苹果在未来版本的 macOS 中移除已弃用的 OpenGL API 做好准备。

  • 确保新管道对 Java 应用程序的透明性。

  • 确保实现的功能与现有 OpenGL 管道保持一致。

  • 在选定的实际应用程序和基准测试中,提供与 OpenGL 管道相同或更好的性能。

  • 创建一个符合现有 Java 2D 管道模型的清晰架构。

  • 与 OpenGL 管道共存,直到其过时。

非目标

  • 非目标不是移除或禁用现有的 OpenGL 管道。

  • 非目标不是添加任何新的 Java 或 JDK API。这完全是内部实现。

动机

在 macOS 上引入新的基于 Metal 的渲染管道主要有两大动因:

  • 苹果在 2018 年 9 月的 macOS 10.14 中弃用了 OpenGL 渲染库。macOS 上的 Java 2D 完全依赖于 OpenGL 作为其内部渲染管道,因此需要实现新的管道。

  • 苹果声称其替代 OpenGL 的 Metal 框架 具有更优的性能。对于 Java 2D API 而言,这通常是正确的,但也存在一些例外。

描述

大多数图形 Java 应用程序都使用 Swing UI 工具包编写,该工具包通过 Java 2D API 进行渲染。在内部,Java 2D 可以使用软件渲染加上屏幕上的位块传输(blit),或者可以使用特定于平台的 API,如 Linux 上的 X11/Xrender、Windows 上的 Direct3D 或 macOS 上的 OpenGL。这些特定于平台的 API 通常比软件渲染提供更好的性能,并且通常能够减轻 CPU 的负担。Metal 是 macOS 上用于此类渲染的新平台 API,取代了已弃用的 OpenGL API。(请注意,此名称与 Swing 的“Metal”外观和感觉无关,这只是一个巧合。)

我们创建了大量的新内部实现代码来使用 Metal 框架,正如我们之前为其他特定于平台的 API 所做的那样。新代码虽然很容易融入现有框架,但在图形硬件的使用上更加现代化,它使用了着色器而不是固定功能管道。这些更改仅限于 macOS 特定的代码,并且在 Metal 和 OpenGL 之间共享的代码量也极少。我们没有引入任何新的 Java API,也没有更改任何现有 API。

Metal 管道可以与 OpenGL 管道共存。当图形应用程序启动时,会选择其中一个。目前,OpenGL 仍然是默认选项。只有在启动时指定使用 Metal,或者在未来的 macOS 版本中 OpenGL 初始化失败(如不支持 OpenGL 的版本)时,才会使用 Metal。

在整合此 JEP 时,苹果尚未移除 OpenGL。在此之前,应用程序可以通过在 java 命令行上指定 -Dsun.java2d.metal=true 来选择使用 Metal。我们将在未来的版本中使 Metal 渲染管道成为默认选项。

在将此 JEP 整合到 JDK 之前,我们在 Project Lanai 上进行了相关工作。

测试

由于未更改任何 Java 2D API,因此测试新管道的功能不需要开发新的功能测试。现有的测试和实际应用已足够。这些包括:

  • JDK jtreg 回归测试,
  • JCK 测试,
  • Java 2D 和 Swing 演示,以及
  • 作为大规模实际应用的示例,包括 Intellij IDEA 和 Netbeans 等 IDE。

为了测试性能,我们使用了以下工具:

  • J2DBench,JDK 中包含的 Java 2D 基准测试应用程序,
  • RenderPerfTest,一个自定义的压力测试,用于渲染相同基本类型的多个对象并测量每秒帧数(FPS),该测试在 Project Lanai 中开发,
  • IntelliJ IDEA IDE 性能。

最终计划的早期访问版本的性能结果 在此

为了进一步验证新管道,我们使用了 macOS Xcode 的仪器工具来检查内存泄漏和 Metal API 的正确使用情况。

风险和假设

  • 我们在各种硬件和 macOS 版本上进行了测试,这些版本被认为是具有代表性的,但并非所有组合都可用。由于我们无法涵盖所有场景,因此可能存在性能限制。

  • 我们在 Apple Silicon 上对当前的 x64 二进制文件进行了非常有限的(合理性)测试。目前尚未提供 JDK 到 Apple Silicon 的移植版本以支持本机测试。

  • Metal 不支持 XOR 操作,因此我们不得不在这种特定情况下接受较低的性能。这种情况可能会一直持续到 Metal 直接支持 XOR 为止。

Page Layout Max Width

Adjust the exact value of the page width of VitePress layout to adapt to different reading needs and screens.

Adjust the maximum width of the page layout
A ranged slider for user to choose and customize their desired width of the maximum width of the page layout can go.

Content Layout Max Width

Adjust the exact value of the document content width of VitePress layout to adapt to different reading needs and screens.

Adjust the maximum width of the content layout
A ranged slider for user to choose and customize their desired width of the maximum width of the content layout can go.