openjdk.ruOpenJDK на русском

JEP 382: New macOS Rendering Pipeline

Новый конвейер рендеринга для macOS

ОтветственныйPhilip Race
ТипFeature
ОбластьJDK
СтатусClosed / Delivered
Выпуск17
Компонентclient-libs / 2d
Обсуждениеlanai dash dev at openjdk dot java dot net
РецензентыAjit Ghaisas, Alexey Ushakov, Iris Clark, Jayathirth D V, Kevin Rushforth, Sergey Bylokhov
ОдобренKevin Rushforth
Создан2020/01/31 21:40
Обновлён2022/04/05 17:26
Задача8238361

Аннотация

Реализовать внутренний конвейер рендеринга Java 2D для macOS на основе Apple Metal API как альтернативу существующему конвейеру, который использует Apple OpenGL API в статусе Deprecated (устаревший).

Цели

  • Предоставить полнофункциональный конвейер рендеринга для Java 2D API, использующий фреймворк macOS Metal.

  • Быть готовыми к тому, что Apple удалит OpenGL API в статусе Deprecated из будущей версии macOS.

  • Обеспечить прозрачность нового конвейера для Java-приложений.

  • Обеспечить функциональный паритет реализации с существующим конвейером OpenGL.

  • Обеспечить производительность не хуже, чем у конвейера OpenGL, или лучше на отдельных реальных приложениях и бенчмарках.

  • Создать чистую архитектуру, которая вписывается в существующую модель конвейеров Java 2D.

  • Сосуществовать с конвейером OpenGL, пока он не устареет окончательно.

Что не является целью

  • Удаление или отключение существующего конвейера OpenGL не является целью.

  • Добавление каких-либо новых API Java или JDK не является целью. Всё это внутренняя реализация.

Мотивация

Появление нового конвейера рендеринга на основе Metal в macOS обусловлено двумя основными факторами:

Описание

Большинство графических Java-приложений написано с помощью инструментария пользовательского интерфейса Swing, который выполняет рендеринг через Java 2D API. Внутри Java 2D может использовать программный рендеринг с последующим копированием (blit) на экран или платформенный API, например X11/Xrender в Linux, Direct3D в Windows или OpenGL в macOS. Такие платформенные API обычно дают гораздо более высокую производительность, чем программный рендеринг, и, как правило, разгружают CPU. Metal — новый платформенный API macOS для такого рендеринга, заменяющий OpenGL API в статусе Deprecated. (Название никак не связано с оформлением Swing «Metal» Look and Feel; это просто совпадение.)

Мы написали значительный объём нового кода внутренней реализации для использования фреймворка Metal, так же как это уже было сделано для других платформенных API. Новый код легко вписывается в существующий фреймворк, но при этом использует графическое оборудование гораздо более современным способом: вместо конвейера с фиксированными функциями применяются шейдеры. Изменения ограничены кодом, специфичным для macOS, и даже в нём обновлён лишь минимальный объём кода, общего для Metal и OpenGL. Мы не добавили новых Java API и не изменили ни одного существующего API.

Конвейер Metal может сосуществовать с конвейером OpenGL. При запуске графического приложения выбирается один из них. Пока по умолчанию остаётся OpenGL. Metal используется, только если он указан при запуске или если инициализация OpenGL завершилась ошибкой, как произошло бы в будущей версии macOS без поддержки OpenGL.

На момент интеграции этого JEP Apple ещё не удалила OpenGL. До тех пор приложение может включить Metal, указав -Dsun.java2d.metal=true в командной строке java. Мы сделаем конвейер рендеринга Metal конвейером по умолчанию в одном из будущих выпусков.

До интеграции в JDK работа над этим JEP велась в Project Lanai.

Тестирование

Для тестирования функциональности нового конвейера не потребовалось разрабатывать новые функциональные тесты, поскольку ни один API Java 2D не изменился. Достаточно было существующих тестов и реальных приложений. В их числе:

  • регрессионные тесты JDK на jtreg,
  • тесты JCK,
  • демонстрационные программы Java 2D и Swing, а также
  • IDE, такие как Intellij IDEA и Netbeans, как примеры крупных реальных приложений.

Для тестирования производительности мы использовали:

  • J2DBench — приложение для бенчмаркинга Java 2D, входящее в JDK,
  • RenderPerfTest — разработанный в Project Lanai специальный стресс-тест, который рендерит множество объектов одного примитивного типа и измеряет число кадров в секунду (FPS), и
  • производительность IDE IntelliJ IDEA.

Результаты измерения производительности для последнего запланированного выпуска Early Access (ранний доступ) приведены здесь.

Для дополнительной проверки нового конвейера мы использовали инструменты анализа macOS Xcode, чтобы искать утечки и проверять корректность использования Metal API.

Риски и допущения

  • Мы тестировали на разном оборудовании и версиях macOS, которые предположительно являются репрезентативными, но доступны были не все сочетания. Поскольку учесть все сценарии мы не могли, возможно, ограничения производительности сохраняются.

  • Мы провели очень ограниченное (базовое) тестирование текущих бинарных файлов x64 на Apple Silicon. Порта JDK на Apple Silicon, который позволил бы проводить нативное тестирование, пока нет.

  • Metal не поддерживает операцию XOR, поэтому в этом узком случае нам пришлось смириться с более низкой производительностью. Скорее всего, так и останется, пока Metal не обеспечит прямую поддержку XOR.