Я думаю , http://hasno.info/ruby-gotchas-and-caveats имеет достойное объяснение различия:
выгода/бросок не то же как повышение/спасение. выгода/бросок позволяет Вам быстро выходить из блоков назад к точке, где выгода определяется для определенного символа, спасение повышения является реальным материалом обработки исключений, включающим Объект исключения.
НЕТ способа напрямую получить графическую ОЗУ в 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.
Потоки пользовательского режима не могут получить доступ к областям памяти и операциям ввода-вывода, отображаемым с аппаратных устройств, включая буфер кадра. В любом случае, что бы вы хотели сделать? Предположим, что у вас есть доступ к фреймбуферу напрямую: теперь вы должны обрабатывать МНОГО возможных форматов пикселей в фреймбуфере. Вы можете предположить 32-битную организацию RGBA или ARGB. Есть возможность отображения 15/16/24 бит (RGBA555, RGBA5551, RGBA4444, RGBA565, RGBA888 ...). Это, если вы не хотите также поддерживать форматы видеоповерхности (наложения), такие как на основе YUV.
Так что позвольте драйверу дисплея и / или подчиненным API сделать это.
Если вы хотите запись на поверхность дисплея (которая не совпадает в точности с памятью фреймбуфера, хотя концептуально почти то же самое) есть много вариантов. DX, Win32,