2016-08-24 7 views
-1

Я хочу получить кадр (изображение), который будет отображаться на экране, непосредственно из VRAM, если это возможно, в бинарном формате (RAW) с использованием SDL/OpenGl/DirectX или любого другого API.Как получить видеовыход или рамку из VRAM

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

ответ

1

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

С помощью OpenGL используйте для использования async переводы glReadPixels или PBOs.

+0

Я понимаю, но мне нужно отправить это изображение по сети, поэтому для уменьшения латентности и получения передачи в реальном времени мне нужно это сделать. Что касается функции SDL «SDL_RenderReadPixels()», это очень медленно. –

+2

@hemantc: Почему вы думаете, что glReadPixels увеличивает вашу задержку? Если что-то это * уменьшает * задержку, потому что glReadPixels вводит точку синхронизации, а драйверы оптимизированы, чтобы закончить рендеринг результата, возвращаемого glReadPixels, и как можно быстрее вернуться к нему. Основная цель PBO - дать возможность реализовать некоторую свободу действий, когда и как завершить рендеринг и передачу (что дает пропускную способность пролета, но на самом деле увеличивает задержку на glReadPixels). – datenwolf

+2

@hemantc: Также вы можете делать glReadPixels перед сменой буфера; однако я настоятельно рекомендую не «установить срок», а только начать передачу, если вы можете утверждать, что он закончит до свопа. В противном случае вы можете пропустить крайний срок. – datenwolf