Зачем мне нужны ресурсы для каждого изображения swapchain? - PullRequest
0 голосов
/ 14 января 2019

Я следую различным учебным пособиям, и я не понимаю, почему мне нужны ресурсы на изображение swapchain, а не на кадр в полете.

Этот урок: https://vulkan -tutorial.com / Uniform_buffers

имеет единый буфер для каждого изображения подкачки. Зачем мне это нужно, если разные изображения не находятся в полете одновременно? Могу ли я не начать переписывание, если предыдущий кадр завершен?

Также лунный учебник по буферам глубины говорит:

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

Это ничего не объясняет, оно в основном говорит, что вы можете, потому что вы можете. Так почему я могу повторно использовать буфер глубины, но не другие ресурсы?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Это сводит к минимуму синхронизацию в случае простого приложения Hello Cube.

Допустим, ваша форма меняет каждый кадр. Это означает, что основной цикл выглядит примерно так:

  1. Опрос (или симуляция)
  2. Обновление (например, ваша форма)
  3. Draw
  4. Повторите

Если у шага № 2 не было собственной униформы, то нужно написать униформу, которую читает предыдущий кадр. Это означает, что он должен синхронизироваться с забором. Это означало бы, что предыдущий кадр больше не считается "в полете".

0 голосов
/ 14 января 2019

Все зависит от того, как вы используете свои ресурсы и производительности, которую вы хотите достичь.

Если после каждого кадра Вы готовы ждать окончания рендеринга и все еще довольны конечным исполнением, Вы можете использовать только одну копию каждого ресурса. Ожидание - это самая простая синхронизация. Вы уверены, что ресурсы больше не используются, поэтому вы можете использовать их для следующего кадра. Но если вы хотите эффективно использовать мощность как CPU, так и GPU и не хотите ждать после каждого кадра, то вам нужно посмотреть, как используется каждый ресурс.

Буфер глубины обычно используется только временно. Если вы не выполняете никакой постобработки, если в вашей настройке прохода рендеринга используются данные глубины только для внутреннего использования (вы не указываете STORE для storeOp), то вы можете все время использовать только один буфер глубины (изображение глубины). Это потому, что когда рендеринг завершен, данные о глубине больше не используются, их можно безопасно отбросить. Это относится ко всем другим ресурсам, которые не должны сохраняться между кадрами.

Но если для каждого кадра необходимо использовать разные данные или если в следующем кадре используются сгенерированные данные, то обычно вам требуется еще одна копия данного ресурса. Обновление данных требует синхронизации - чтобы избежать ожидания в таких ситуациях, вам необходимо иметь копию ресурса. Таким образом, в случае единообразных буферов, вы обновляете данные в данном буфере и используете их в данном кадре. Вы не можете изменять его содержимое до тех пор, пока кадр не будет завершен - поэтому, чтобы подготовить другой кадр анимации, пока предыдущий еще обрабатывается в графическом процессоре, вам нужно использовать другую копию.

Аналогично, если сгенерированные данные требуются для следующего кадра (например, кадровый буфер, используемый для отражений пространства экрана). Повторное использование одного и того же ресурса приведет к его перезаписи. Вот почему Вам нужна еще одна копия.

Вы можете найти больше информации здесь: https://software.intel.com/en-us/articles/api-without-secrets-the-practical-approach-to-vulkan-part-1

...