API来获取graphics或video内存

我想获得你可以在显示设置或使用API​​的设备pipe理器中看到的adpater RAM或graphicsRAM。 我在C ++应用程序。

我已经尝试在网上seraching,并根据我的RnD我得出结论,我们可以从1 DirectX的SDK结构称为DXGI_ADAPTER_DESC的graphics内存信息。 但是,如果我不想使用DirectX API。 2. Win32_videocontroller:但是,如果video控制器的可用性是离线的,这个类并不总是给你adapterRAM信息。 我已经在Vista上检查过了。

有没有其他的方式来获得graphicsRAM?

在Windows上没有办法直接获得图形RAM,Windows可以防止你这样做,因为它保持对显示内容的控制。

但是,您可以创建一个DirectX设备。 获取后台缓冲区表面,然后锁定它。 锁定后,你可以填写任何你想要的,然后解锁并打电话给目前。 但是,这很慢,因为您必须将视频存储器通过总线复制回主内存。 一些卡片也使用“混合”格式,因为它复制时不得不放弃。 这增加了进一步的时间,有些卡甚至会禁止你这样做。

一般而言,您希望避免直接访问视频卡,并让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)并释放你的线性数组!

编辑:只有一种方法可靠地获取视频RAM,即通过DX Diag接口。 查看DX SDK中的IDxDiagProvider和IDxDiagContainer 。

Win32_videocontroller是获得gfx内存量的最佳途径。 这就是在Doom3源代码中完成的。

你说“..视频控制器的可用性是离线的,我已经在Vista上检查过了。” 视频控制器在什么情况下会脱机?

顺便说一句, 你可以在这里找到Doom3的源代码 。 你正在寻找的功能被称为Sys_GetVideoRam,它在一个名为win_shared.cpp的文件,但如果你做一个解决方案的广泛搜索它会为你打开。

用户模式线程无法访问硬件设备(包括帧缓冲区)映射的内存区域和I / O。 无论如何,你会想要做什么? 假设你可以直接访问framebuffer:现在你必须在framebuffer中处理很多可能的像素格式。 您可以假设一个32位的RGBA或ARGB组织。 有15/16/24位显示器(RGBA555,RGBA5551,RGBA4444,RGBA565,RGBA888 …)的可能性。 这就是如果你不想也支持诸如基于YUV的视频表面格式(覆盖)。

所以让显示驱动程序和/或下面的API来做这个工作。

如果你想写一个显示表面(它不完全等同于framebuffer内存,虽然它在概念上几乎相同),但是有很多选项。 DX,Win32,或者您可以尝试SDL库(libsdl)。