Самый быстрый способ обновить данные вершин в VBO [duplicate]

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

Например, я мог бы интерфейс движения. Метод, который делает что-то «движение», и любой объект (Person, Car, Cat), который реализует интерфейс движения, может быть передан и передан для перемещения. Без метода, каждый из которых знает тип класса.

3
задан zeb 26 August 2015 в 09:16
поделиться

1 ответ

Хорошая вещь о glMapBuffer заключается в том, что вам не нужно сначала копировать данные в массиве, а затем использовать glBufferSubData для заполнения буфера opengl. С помощью glMapBuffer вы можете скопировать данные непосредственно в часть памяти, которую opengl будет извлекать на GPU, когда это необходимо. С моей точки зрения, glMapBuffer должен быть быстрее, если вы хотите заполнить большой буфер, который будет часто обновляться. Также важно, как вы копируете данные в буфер между glMapBuffer и glUnmapBuffer.

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

UPDATE: OpenGL Insight Асинхронный буферный буфер Глава . В этой главе вам могут быть интересны функции implicit synchronization функций glMapBuffer и glSubBufferData.

2
ответ дан mmostajab 21 August 2018 в 19:19
поделиться
  • 1
    Даже если glMapBuffer копирует данные в массив памяти процессора. Разница только в том, что glBufferSubData использует выделенный пользователем массив, а с glMapBuffer драйвер выделяет его. – BDL 26 August 2015 в 10:41
  • 2
    @BDL Вот что я имел в виду. «вы можете скопировать данные непосредственно в часть памяти, которую opengl будет извлекать на GPU, когда это необходимо». по памяти я имел в виду системную память, а не память GPU. OpenGL всегда создает буферы в системной памяти и извлекает данные на GPU, когда это необходимо. – mmostajab 26 August 2015 в 10:42
  • 3
    Но вывод неправильный: при копировании большого сегмента памяти в gpu glMapBuffer вам необходимо скопировать данные из его исходного местоположения в отображаемую память процессора (которая уже может быть медленной). Затем сопоставленная память копируется в gpu. С помощью glBufferSubData исходная память может быть скопирована непосредственно в gpu. – BDL 26 August 2015 в 10:46
  • 4
    ОК! Я могу исправить себя, сказав, что glMapBuffer более общий. Вы можете делать то, что glBufferSubData делает с glMapBuffer и даже больше. Итак, если вы можете использовать оба варианта, между ними не должно быть разницы, но все же glMapBuffer может сделать гораздо больше. Итак, если вам просто нужно изменить значения z ваших координат вершин, вы сможете сделать это быстрее с помощью glMapBuffer, поскольку вам просто нужно изменить компонент z вершин. – mmostajab 26 August 2015 в 11:18
  • 5
    @BDL Кроме того, когда я сказал, что это быстрее, я имел в виду, что это быстрее, потому что вам не нужно создавать буфер в пользовательской части и заполнять его данными, которые вы хотите скопировать в буфере. Вы можете напрямую скопировать данные в часть памяти, которую opengl будет передавать непосредственно в gpu. Если этот фрагмент данных, который будет скопирован, уже находится в массиве, и нам не нужно создавать дополнительный массив в пользовательской части, тогда glMapData и glSubBufferData должны быть идентичными. – mmostajab 26 August 2015 в 11:21
Другие вопросы по тегам:

Похожие вопросы: