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 为止。