Я использовал функцию Windows 100 BitBlt
для выполнения захвата экрана.
Однако есть много недостатков:
- DWM и Aero вызывают значительное замедление (3 мс -> 35 мс просто для вызова
BitBlt
) - чтобы обойти это, потребуется отключить Aero, чего я просто не хотел бы делать. Экран мерцает и все вокруг меняется.
- Данные должны быть повторно перенесены в графический процессор для загрузки данных в виде текстуры
- Многослойные окна не могут быть захвачены без флага
CAPTUREBLT
. Когда включено, курсор мыши мигает при захвате. Это может показаться незначительной проблемой, но это очень раздражает, когда приложение без ошибок. В качестве обходного пути для этого я намерен визуализировать многослойное окно в качестве дополнительного курсора.
Я уже использую OpenGL для отображения и управления захваченными данными экрана. BitBlt
дает мне данные о пикселях, и их относительно легко загрузить в текстуру. Однако это немного абсурдно, потому что я вручную повторно отправляю данные обратно в GPU, когда они должны быть доступны на GPU для начала. Данные наверняка есть, но попытка получить к ним другое дело.
Я предполагаю, что эта функциональность не входит в список дел (или, скорее всего, в любом списке) для поставщиков, но я хотел бы спросить тех, кто в курсе, есть ли какие-либо положения, предоставляемые AMD ( ATI) или NVidia в своих драйверах для чтения экранного буфера (например, в контексте OpenGL). Я просто не знаю достаточно о современной архитектуре графического процессора, чтобы знать, с чего начать искать ответы.