OpenGL Buffer Object внутренняя работа? - PullRequest
1 голос
/ 26 сентября 2010

Я начал использовать объекты Pixel Buffer, и хотя я понимаю, как их использовать, и суть того, что они делают, я действительно не знаю, что происходит под капотом.Мне известно, что спецификация OpenGL допускает свободу действий в отношении точной реализации, но это все еще за мной.

Насколько я понимаю, объект буфера обычно находится на стороне сервера в GRAM;хотя, по-видимому, это может варьироваться в зависимости от target и использование .Это имеет смысл, поскольку именно поэтому вызовы OpenGL на BO будут работать так быстро.Но в каких случаях он находится в AGP или системной памяти?(дополнительный вопрос: имеет ли PCI-e эквивалент памяти AGP?)

Кроме того, glMapBuffers() возвращает указатель на блок памяти BO, чтобы данные могли быть прочитаны / записаны / изменены.Но как это сделать?Манипуляции происходят на стороне клиента, поэтому данные все равно должны как-то передаваться с сервера на клиент.Если это так, как лучше, чем glReadPixels()?Очевидно, что PBO лучше, чем glReadPixels(), что очевидно по разнице в производительности, я просто не понимаю, как.

Я еще не использовал FBO, но слышал, что их лучше использовать.Это правда?если так, то почему?

1 Ответ

0 голосов
/ 26 сентября 2010

Я не могу сказать вам, в какой памяти будет размещен объект буфера. На самом деле вы в основном отвечали на этот вопрос сами, поэтому вы можете надеяться, что хороший водитель действительно сделает это так.

glMapBuffer может быть реализован так же, как файлы с отображением в памяти. Помните разницу между физической памятью и виртуальным адресным пространством: при записи в ячейку памяти адрес отображается через таблицу страниц в физическую ячейку. Если необходимая страница помечена как помененная местами, происходит прерывание, и система загружает требуемую страницу из раздела подкачки в ОЗУ. Этот механизм можно использовать для сопоставления файлов и других ресурсов (например, памяти графического процессора) с виртуальным адресным пространством вашего процесса. Когда вы вызываете glMapBuffer, система выделяет некоторый диапазон адресов (не память, а только адреса) и подготавливает соответствующие записи в таблице страниц. При попытке чтения / записи по этим адресам система загружает / отправляет его в графический процессор. Конечно, это будет медленно, поэтому по пути выполняется некоторая буферизация.

Если вы постоянно передаете данные между CPU и GPU, я сомневаюсь, что PBOs будет быстрее. Они быстрее, когда вы делаете много манипуляций на GPU (например, загрузка из кадрового буфера, изменение нескольких текселей с помощью CPU и использование его снова в качестве текстуры на GPU). Ну, они могут быть быстрее в случае встроенного графического процессора или памяти AGP, потому что в этом случае glMapBuffer может отображать адреса непосредственно в физическую память, эффективно исключая одну операцию копирования.

Чем лучше FBO? Для чего? Они лучше, когда вам нужно визуализировать текстуру. Это снова, потому что они исключают одну операцию копирования данных.

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