Что может сделать Vulkan конкретно, чего не может OpenGL 4.6+? - PullRequest
2 голосов
/ 26 июня 2019

Я выясняю, лучше ли мне остаться с OpenGL или рассмотреть возможность миграции Vulkan для интенсивного рендеринга с узкими местами.

Однако я не хочу совершать прыжок без уведомления об этом. Я искал, какие преимущества предлагает мне Vulkan, но с большим количеством поисков я не смог найти точно , что дает повышение производительности. Люди будут разбрасывать такие термины, как «OpenGL медленный, Vulkan намного быстрее!» или "Низкое энергопотребление!" и больше ничего не говорите по этому вопросу.

Из-за этого мне трудно оценить, являются ли проблемы, с которыми я сталкиваюсь, чем-то, с чем Вулкан может мне помочь, или мои проблемы связаны с объемом и вычислениями (и Вулкан в таком случае не поможет мне очень).

Я предполагаю, что Vulkan волшебным образом не делает вещи в конвейере быстрее (поскольку в OpenGL и Vulkan затенение будет примерно одинаковым для тех же буферов, униформ и шейдеров). Я предполагаю, что все вещи с OpenGL, которые вызывают горе (например, изменения кадрового буфера и программы шейдеров), будут одинаково болезненными в любом API.

У меня в голове есть несколько вещей, которые, как мне кажется, предлагает Vulkan, основываясь на чтении бесчисленных вещей в Интернете (и я полагаю, что это, конечно, не все преимущества, или даже это правда):

  • Рендеринг текстур без [много? любое?] связывание (или, вернее, лучшая версия «текстур без привязки»), которые я заметил, когда переключился на текстуры без привязки, я получил значительное повышение производительности, но это, возможно, даже не стоит упоминать как точку, если текстуры без привязки эффективно делает это и поэтому не уверен, что Vulkan добавляет что-нибудь сюда

  • Уменьшена связь между процессором и графическим процессором благодаря составлению списка команд, который вы можете выполнять на графическом процессоре без необходимости отправлять много данных

  • Возможность многопоточного взаимодействия, которое OpenGL не может каким-либо образом

Однако я не знаю точно, в каких случаях люди сталкиваются в реальном мире, которые требуют этого, и как OpenGL ограничивает их. Все приведенные в Интернете примеры говорят: «Ты можешь бежать быстрее!» но я не видел как люди использовали его, чтобы бежать быстрее.

Где я могу найти информацию, которая отвечает на этот вопрос? Или вы знаете несколько реальных примеров, которые бы ответили на это для меня? Может быть, лучше задать вопрос: где типичные болевые точки, которые возникают у людей с OpenGL (или D3D), из-за которых Vulkan стал чем-то особенным?

Примером ответа, который не будет удовлетворительным, будет ответ типа

Вы можете многопоточность и отправлять вещи в Vulkan быстрее.

но ответ, который был бы более удовлетворительным, был бы что-то вроде

В Vulkan вы можете многопоточными вашими представлениями в GPU. В OpenGL вы не можете сделать это, потому что вы полагаетесь на реализацию, которая делает соответствующую блокировку и установку ограждений от вашего имени, что может в итоге создать узкое место. Коротким примером этого может быть [краткий пример здесь случая, когда OpenGL не вырезает его для ситуации X], а в Vulkan это решается с помощью [действие Y].

Последний абзац выше может быть неточным, но я пытался привести пример того, что я искал, не пытаясь написать что-то ужасно неправильное.

Ответы [ 2 ]

4 голосов
/ 26 июня 2019

Это рискует быть основанным на мнении.Полагаю, я просто повторю преимущества Vulkan, которые написаны на коробке, и, надеюсь, не оспариваются.

  • Вы можете отключить проверку в Vulkan.Очевидно, он использует меньше ресурсов процессора (или батареи \ питания \ шума).В некоторых случаях это может быть значительным.
  • OpenGL имеет плохо определенную многопоточность.Vulkan имеет четко определенную многопоточность в спецификации.Это означает, что вы не сразу же теряете разум, пытаясь кодировать с несколькими потоками, а также повышаете производительность, если в противном случае отдельный поток будет узким местом в ЦП.
  • Vulkan более явный;это не (или пытается не) выставлять большие волшебные черные ящики.Это означает, что, например, вы можете что-то делать с микротреморением, сцеплением и другими микрооптимизациями.
  • У Vulkan более чистый интерфейс для оконных систем.Нет больше странных контекстов и кадровых буферов по умолчанию.Vulkan даже не требует рисования окна (или он может достичь этого без странных взломов).
  • Vulkan - более чистый и более традиционный API.Для меня это означает, что легче учиться (несмотря на другие вещи) и более приятно использовать.
  • Vulkan использует двоичные шейдеры промежуточного кода.Пока OpenGL раньше не использовал.Это должно означать более быструю компиляцию такого кода.
  • Vulkan имеет мобильные графические процессоры в качестве первоклассного гражданина.Нет больше ES.
  • Vulkan имеет открытый исходный код и обычный (GitHub) публичный трекер.Это означает, что вы можете улучшить экосистему, не проходя через обручи.Например, вы можете улучшить \ внедрить проверку проверки на наличие ошибок, которая часто сбивает вас с толку.Или вы можете улучшить спецификацию, чтобы она имела смысл для людей, которые не являются инсайдерами.
3 голосов
/ 26 июня 2019

Vulkan действительно имеет четыре основных преимущества с точки зрения поведения во время выполнения:

  • Снижение загрузки процессора
  • Прогнозируемая загрузка процессора
  • Улучшение интерфейсов памяти
  • Предсказуемая загрузка памяти

Особенно низкая загрузка графического процессора не является одним из преимуществ;один и тот же контент, использующий те же функции графического процессора, будет иметь очень сходную производительность графического процессора с обоими API.

По моему мнению, у этого также есть много преимуществ с точки зрения юзабилити разработчиков - модель программиста намного чище, чем OpenGL, но есть более крутая кривая обучения, чтобы добраться до стадии «что-то работает правильно».

Давайте рассмотрим каждое из преимуществ более подробно:

Более низкая загрузка процессора

Более низкая загрузка процессора в Vulkan происходит из нескольких областей, но основные из них:

  • API поощряет предварительное построение дескрипторов, поэтому вы не перестраиваете состояние на основе отрисовки.
  • API является асинхронным и поэтому может выполнять некоторые обязанности, напримеркак отслеживание зависимостей ресурса, для приложения.Наивная реализация приложения здесь будет такой же медленной, как OpenGL, но у приложения больше возможностей для применения алгоритмической оптимизации высокого уровня, потому что она может знать, как используются ресурсы и как они связаны со структурой сцены.
  • APIпереносит проверку ошибок на драйверы слоев, поэтому драйверы релизов настолько просты, насколько это возможно.
  • API поддерживает многопоточность, что всегда является большим выигрышем (особенно на мобильных устройствах, где, например, четыре медленно работающих потока будут потреблять намного меньше)энергии быстрее, чем один поток).

Предсказуемая нагрузка на процессор

Драйверы OpenGL совершают различные "магические" действия либо для повышения производительности (специализируются на шейдерах, основанных на состоянии, известном только на момент рисованияили поддерживать иллюзию синхронного рендеринга (создание призраков ресурсов на лету, чтобы избежать остановки конвейера, когда приложение изменяет ресурс, на который все еще ссылается ожидающая команда).

Философия дизайна Vulkan - это "нет магии ".Вы получаете то, что просите, когда просите об этом.Надеюсь, это означает отсутствие случайных замедлений, потому что водитель делает то, что вы не ожидали в фоновом режиме.Недостатком является то, что приложение берет на себя ответственность за правильные действия;)

Улучшенные интерфейсы памяти

Многие части конструкции OpenGL основаны на различных пулах памяти ЦП и ГП, которые требуютмодель программирования, которая дает драйверу достаточно информации для синхронизации.Большинство современных аппаратных средств могут работать лучше с протоколами когерентности с аппаратной поддержкой, поэтому Vulkan включает модель, в которой вы можете просто один раз отобразить буфер, а затем изменить его ad hoc и гарантировать, что «другой процесс» увидит изменения.Больше нет накладных расходов «map» / «unmap» / «invalidate» (при условии, что платформа поддерживает когерентные буферы, конечно, она все еще не универсальна).

Во-вторых, Vulkan разделяет концепцию выделения памяти и то, как эта памятьиспользуется (вид памяти).Это позволяет повторно использовать одну и ту же память для разных вещей в конвейере кадров, уменьшая объем промежуточного хранилища, которое вам нужно выделить.

Предсказуемая загрузка памяти

В связи с комментарием «без магии» для производительности процессора, Vulkan не будет генерировать случайные ресурсы (например, призрачные текстуры) на лету, чтобы скрыть проблемы приложения.Больше нет случайных колебаний в ресурсной памяти, но опять же приложение должно взять на себя ответственность за правильные действия.

...