API для получения видеопамяти или видеопамяти

Я думаю , http://hasno.info/ruby-gotchas-and-caveats имеет достойное объяснение различия:

выгода/бросок не то же как повышение/спасение. выгода/бросок позволяет Вам быстро выходить из блоков назад к точке, где выгода определяется для определенного символа, спасение повышения является реальным материалом обработки исключений, включающим Объект исключения.

5
задан amritad 8 December 2009 в 15:48
поделиться

2 ответа

НЕТ способа напрямую получить графическую ОЗУ в Windows, окна не позволяют вам сделать это, поскольку поддерживает контроль над тем, что отображается.

Однако вы МОЖЕТЕ создать устройство DirectX. Возьмите заднюю буферную поверхность и зафиксируйте ее. После блокировки вы можете заполнить его всем, чем хотите, а затем разблокировать и вызвать присутствующего. Однако это медленно, так как вам нужно скопировать видеопамять обратно через шину в основную память. Некоторые карты также используют форматы "swizzled", которые необходимо удалять при копировании. Это добавляет дополнительное время для выполнения этой задачи, а некоторые карты даже запрещают вам это делать.

В общем, вы хотите избежать прямого доступа к видеокарте и позволить Windows / DirectX рисовать за вас. Хотя под D3D1x я почти уверен, что вы можете сделать это через IDXGIOutput. Это действительно то, чего следует избегать ...

Вы можете записывать в линейный массив через стандартный win32 (в этом примере предполагается C), но это довольно сложно.

Сначала вам понадобится линейный массив.

    unsigned int* pBits = malloc( width * height );

Затем вам нужно создать растровое изображение и выделить его в DC.

    HBITMAP hBitmap = ::CreateBitmap( width, height, 1, 32, NULL );
    SelectObject( hDC, (HGDIOBJ)hBitmap );

Затем вы можете заполнить массив pBits по своему усмотрению. Когда вы закончите, вы можете установить биты растрового изображения.

    ::SetBitmapBits( hBitmap, width * height * 4, (void*)pBits )

Когда вы закончите использовать растровое изображение, не забудьте удалить его (с помощью DeleteObject) И освободить линейный массив!

Редактировать: есть только один способ надежно получить видеопамять - пройти через интерфейсы DX Diag. Взгляните на IDxDiagProvider и IDxDiagContainer в DX SDK.

4
ответ дан 14 December 2019 в 08:52
поделиться

Потоки пользовательского режима не могут получить доступ к областям памяти и операциям ввода-вывода, отображаемым с аппаратных устройств, включая буфер кадра. В любом случае, что бы вы хотели сделать? Предположим, что у вас есть доступ к фреймбуферу напрямую: теперь вы должны обрабатывать МНОГО возможных форматов пикселей в фреймбуфере. Вы можете предположить 32-битную организацию RGBA или ARGB. Есть возможность отображения 15/16/24 бит (RGBA555, RGBA5551, RGBA4444, RGBA565, RGBA888 ...). Это, если вы не хотите также поддерживать форматы видеоповерхности (наложения), такие как на основе YUV.

Так что позвольте драйверу дисплея и / или подчиненным API сделать это.

Если вы хотите запись на поверхность дисплея (которая не совпадает в точности с памятью фреймбуфера, хотя концептуально почти то же самое) есть много вариантов. DX, Win32,

1
ответ дан 14 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: