glMapBuffer копирует данные? - PullRequest
8 голосов
/ 01 июля 2011

Я новичок в OpenGL.Мой вопрос: что делает glMapBuffer за кулисами?выделяет ли он новую память хоста, копирует в него данные объекта GL и возвращает указатель?

Гарантируется ли получение того же указателя для последующих вызовов этого метода?конечно с выпуском между ними.

Ответы [ 2 ]

9 голосов
/ 01 июля 2011

Как часто, ответ - «Это зависит». В некоторых ситуациях glMapBuffer действительно выделит память через malloc , скопирует туда данные для вашего использования и glUnmapBuffer освободит ее.

Однако распространенный способ реализации glMapBuffer - это отображение памяти. Если вы не знаете, что это такое, посмотрите документацию syscalls mmap (* nix-систем, таких как Linux, MacOS X) или CreateFileMap . То, что там происходит, довольно интересно: современные операционные системы управляют адресным пространством запущенных процессов в виртуальной памяти. Каждый раз, когда к какой-то «памяти» обращаются, управление памятью ОС использует полученный адрес в качестве индекса в таблице перевода, чтобы перенаправить операцию в оперативную память системы, пространство подкачки и т. Д. (Конечно, детали довольно сложны, управление памятью одна из самых сложных вещей в ядре, чтобы понять). Драйвер может установить свой собственный обработчик доступа. Таким образом, процесс может mmap что-то, управляемое драйвером, в свое адресное пространство, и каждый раз, когда он выполняет доступ к нему, вызывается обработчик mmap драйвера. Это позволяет драйверу отображать некоторую память графического процессора (через DMA) в адресное пространство процесса и вести необходимый учет. В этой ситуации glMapBuffer создаст такое отображение памяти, а полученный вами указатель будет указывать на некоторое адресное пространство в вашем процессе, которое было отображено в память DMA, зарезервированную для графического процессора.

9 голосов
/ 01 июля 2011

Это может сделать любой из них.Специфическое поведение памяти glMapBuffer определяется реализацией.

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

Нет способа узнать;Вы не можете полагаться на то, что делаете это.Это должно дать вам лучшую производительность, чем glBufferSubData, при условии, что вы можете сгенерировать свои данные (из файла или из другого места) непосредственно в память, которую вы возвращаете из glMapPointer.В худшем случае производительность будет равна glBufferSubData.

Гарантируется ли получение того же указателя для последующих вызовов этого метода?

Абсолютно нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...