Снимок экрана с помощью Open GL с использованием glReadPixels - PullRequest
0 голосов
/ 28 февраля 2011

Я создал CGRegisterScreenRefreshCallback (refreshCallback, NULL) и в методе refreshCallback получаю список прямоугольников, которые изменились.

Я получаю данные прямоугольника из frameBuffer, используя OpenGL glReadPixels.

Есть ли лучший способ захвата экрана с OpenGL или без него, а также с использованием OpenGL, можно ли пропустить чтение по пикселям?

Я посмотрел на glGetTexImage и glCopyTexSubImage2D. Любой простой блок кода, который может объяснить, как использовать эти функции для получения измененных данных прямоугольника, был бы очень полезен?

Ответы [ 2 ]

0 голосов
/ 01 марта 2011

Поток захвата -> HandlerThread

CaptureThread запускается CGRegisterScreenRefreshCallback-> Callback уведомляет поток обработчика о том, что прямоугольники изменились -> При необходимости поток обработчика будет запрашивать только данные прямоугольника.

При этомНа этапе мы будем использовать glReadPixels для чтения данных прямоугольника.

Может ли это быть изменено на более быстрый API, который может считывать данные только из измененного прямоугольника?Это должно быть очень быстро, так как будет большое количество прямоугольников, которые будут изменены, и будет много раз проверять обновления экрана.

Нужно ли менять дизайн, чтобы он был быстрее?

0 голосов
/ 01 марта 2011

Лучший способ считывания обратных пикселей - это привязать объект пиксельного буфера (GL_PIXEL_PACK_BUFFER), инициализировать его с помощью glBufferData и нулевого указателя данных (GL_STREAM_READ, важно!) Для резервирования памяти, а затем вызвать glReadPixels.Затем в течение следующего кадра, т. Е. После замены буферов, либо (предпочтительно) glMapBuffer, либо (альтернативно) glGetBufferSubData.

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

...