用于获取图形或视频内存的API

amr*_*tad 5 windows directx graphics

我想获得adpater RAM或图形RAM,您可以在显示设置或设备管理器中使用API​​查看.我在C++应用程序中.

我尝试过在网上搜索,根据我的RnD,我得出结论,我们可以从1.DirectX SDK结构中获取图形内存信息,称为DXGI_ADAPTER_DESC.但是,如果我不想使用DirectX API怎么办?2. Win32_videocontroller:但是如果视频控制器的可用性处于脱机状态,则此类并不总是为您提供适配器信息.我已经在vista上检查了它.

有没有其他方法来获得图形RAM?

Goz*_*Goz 4

没有办法在 Windows 上直接获取图形 RAM,Windows 会阻止您这样做,因为它保持对显示内容的控制。

但是,您可以创建 DirectX 设备。获取后台缓冲区表面,然后锁定它。锁定后,您可以在其中填充您想要的任何内容,然后解锁并呼叫出席。不过,这很慢,因为您必须通过总线将视频内存复制回主内存。有些卡还使用“swizzled”格式,在复制时必须取消swizzle。这会增加更多的时间,有些卡甚至会禁止你这样做。

一般来说,您希望避免直接访问视频卡并让 Windows/DirectX 为您进行绘图。不过,在 D3D1x 下,我非常确定您可以通过 IDXGIOutput 来完成此操作。但这确实是需要尝试和避免的事情......

您可以通过标准 win32 写入线性数组(此示例假设为 C),但它相当复杂。

首先你需要线性阵列。

    unsigned int* pBits = malloc( width * height );
Run Code Online (Sandbox Code Playgroud)

然后你需要创建一个位图并将其选择到DC。

    HBITMAP hBitmap = ::CreateBitmap( width, height, 1, 32, NULL );
    SelectObject( hDC, (HGDIOBJ)hBitmap );
Run Code Online (Sandbox Code Playgroud)

然后您可以根据需要填充 pBits 数组。完成后,您可以设置位图的位。

    ::SetBitmapBits( hBitmap, width * height * 4, (void*)pBits )
Run Code Online (Sandbox Code Playgroud)

当您使用完位图后,不要忘记删除它(使用DeleteObject)并释放您的线性数组!

编辑:只有一种方法可以可靠地获取视频内存,那就是通过 DX Diag 接口。查看DX SDK 中的IDxDiagProviderIDxDiagContainer 。