Как правило, невозможно создать «неблокирующую карту», но вы можете отобразить без блокировки.
Причина, по которой не может быть «неблокирующей карты», заключается в том, что в момент возврата вызова функции, вы можете получить доступ к данным, поэтому водитель должен убедиться, что он там, положительно.Если данные не были переданы, что еще может сделать драйвер, кроме как заблокировать.
Потоки не делают это лучше и, возможно, ухудшают его (добавляя проблемы синхронизации и совместного использования контекста).Потоки не могут волшебным образом устранить необходимость переноса данных.
И это приводит к тому, как не блокировать отображение: отображать только тогда, когда вы уверены, что передача завершена.Один из безопасных способов сделать это - отобразить буфер после переключения буферов, или после glFinish
, или после ожидания объекта запроса / забора.Использование забора является предпочтительным способом, если вы не можете дождаться замены буферов.Забор не остановит конвейер, но сообщит вам, выполнен ли ваш перенос (glFinish
может или не может, но , вероятно, остановится).Чтение после замены буферов также на 100% безопасно, но может быть неприемлемо, если вам нужны данные в одном кадре (хотя отлично работает для снимков экрана или для расчета гистограммы для отображения тонов).
Менее безопасный способэто вставить «некоторые другие вещи» и надеяться, что в это время передача завершена.
В отношении нижеследующего комментария:
Этот ответ не неверен.Невозможно сделать что-то лучше, чем получить доступ к данным после того, как они станут доступны (это должно быть очевидно).Это означает, что вы должны синхронизировать / блокировать, так или иначе, выбора нет.
Хотя, с очень педантичной точки зрения, вы, конечно, можете использовать GL_MAP_UNSYNCHRONIZED_BIT
, чтобы получитьнеблокирующая операция сопоставления, это совершенно не имеет значения, поскольку она не будет работать, если вы явно не воспроизведете неявную синхронизацию, как описано выше.Картография, к которой вы не можете получить безопасный доступ, бесполезна.
Отображение и доступ к буферу, в который OpenGL передает данные без синхронизации / блокировки (неявно или явно), означает «неопределенное поведение», что является лишь более приятной формулировкой для «возможно, результаты мусора, возможно, сбой».
Если, с другой стороны, вы явно синхронизируете (скажем, с забором, как описано выше), то не имеет значения, используете ли вы флаг несинхронизированного, так как в любом случае не требуется никакой неявной синхронизации.