OpenGL: рециркуляция Framebuffer в фрейм повлияет на производительность? - PullRequest
2 голосов
/ 29 апреля 2019

Для производительности графического процессора важно, чтобы кадровые буферы не переключались между частотой отрисовки и выборки из шейдерного фрагмента? Возможно, мне удастся сэкономить видеопамять, переработав буферы кадров в одном кадре, но я опасаюсь, что это может привести к некоторым параллельным оптимизациям, которые может выполнять GPU, когда записи FBO не зависят друг от друга, или просто быть дорогостоящим другим способом.

Справочная информация:

В моем рендерере я выделяю все буферы кадров, которые мне нужны, в текущем кадре, повторно используя предыдущие кадры, если это возможно, и использую их следующим образом:

FBO_0, FBO_1, FBO_n are allocated (FBO_n is the final output)

FBO_0 bind      ]_____________________ 
FBO_0 drawn to  ]                     \
FBO_n bind                             \
FBO_0 color used as a texture          Could the GPU be doing these two tasks
FBO_n drawn to with this texture       in parallel thanks to them using seperate FBO? 
                                       /
FBO_1 bind      ]_____________________/
FBO_1 drawn to  ]
FBO_n bind
FBO_1 color used as a texture
FBO_n drawn to with this texture

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

1 Ответ

1 голос
/ 03 мая 2019

Все будет в порядке, если вы используете только FBO_0 и FBO_n, например:

FBO_0 bind
FBO_0 drawn data1
FBO_n bind
FBO_0 color used as a texture
FBO_n drawn to with this texture

FBO_0 bind      
FBO_0 drawn data2
FBO_n bind
FBO_0 color used as a texture
FBO_n drawn to with this texture

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

В этой вики можно найти несколько исключений:

https://www.khronos.org/opengl/wiki/Memory_Model

Но самый быстрый способ очень сильно зависит от реализации OpenGL.

В вашем примеретак как первое «рисование FBO_n» зависит от завершения рисования FBO_0, реализация может начать рисование FBO_1 параллельно.Но у вас нет такой гарантии.

...