#opengl
#opengl
Вопрос:
Мне было интересно, могу ли я предположить, что все операции GPU, связанные с буфером, такие как:
- glDrawElements
- glBufferData
- glSubBufferData
- glUnmapBuffer
гарантированно завершаются после выполнения буфера обмена (т. Е. Завершения кадра) при условии, что vsync включен.
Я в замешательстве, поскольку сталкивался с реализациями методов потоковой передачи вершин, таких как rond robin vbo, которые подразумевают, что vbo все еще может использоваться во время следующего кадра.
Что я в основном хочу сделать, так это поток вершин через glMapBufferRange с помощью GL_UNSYNCHRONIZED_BIT, самостоятельно управляя правильными диапазонами, чтобы записи и чтения никогда не перекрывались. Это сработало бы очень хорошо, если бы я мог просто предположить синхронизацию и сбросить индекс диапазона потока в конце кадра.
Другими словами, гарантирует ли буфер обмена с vsynch синхронизацию?
Ответ №1:
glDrawElements glBufferData glSubBufferData glUnmapBuffer гарантированно завершается после выполнения буфера подкачки (т.Е. Завершения кадра) при условии, что vsync включен.
Нет; это было бы ужасно для производительности. Это в основном наложило бы полную синхронизацию GPU / CPU просто потому, что кто-то хочет отобразить новое изображение. Несмотря на то, что как создание этого изображения, так и его отображение являются процессами GPU (или, по крайней мере, не обязательно синхронными с потоком / процессом вашего процессора).
Цель vsync заключается в том, чтобы гарантировать, что новое изображение не будет заменено до периода вертикальной синхронизации, чтобы избежать визуального разрыва изображения, когда половина отображения приходится на старое, а половина — на новое. Речь идет не о том, чтобы гарантировать, что что-либо действительно завершено на графическом процессоре относительно выполнения процессора.
Если вы передаете данные в объекты буфера с помощью постоянного сопоставления (что следует предпочесть более старым «несинхронизированным» схемам), то вам необходимо выполнить синхронизацию самостоятельно. Установите объект синхронизации ограждения после того, как вы выполнили команды рендеринга, которые будут использовать данные из области буфера, в которую вы записали. Затем, когда придет время снова попытаться выполнить запись в эту область буфера, проверьте синхронизацию ограждения и подождите, пока она не станет доступной. Это также дает вам свободу расширять количество таких областей буфера, которые у вас есть, если рендеринг постоянно задерживается.
Комментарии:
1. В связи с этим: можно ли с уверенностью предположить, что большая часть пользовательского оборудования поддерживает постоянное сопоставление, как сегодня? Я не могу найти никакой достоверной статистики по этому поводу…
2. @Lake: Все, что связано с последними / обновленными драйверами, будет . И, конечно, поддержка оборудования с устаревшими драйверами является сложной задачей, поскольку ошибки драйверов не будут исправлены.
3. К сожалению, я только что узнал, что на моем 5-летнем ноутбуке нет ARB_buffer_storage, и он поддерживает только opengl 4.3. Думаю, мне все-таки придется использовать способ обратной совместимости…. Как вы думаете, можно ли использовать ручную синхронизацию с помощью старого GL_UNSYNCHRONIZED_BIT?