2009-12-08 66 views
5

我想获取可以在显示设置或使用API​​的设备管理器中看到的内存RAM或图形RAM。我在C++应用程序中。用于获取图形或视频内存的API

我尝试过在网上进行seraching,并根据我的RnD我得出结论,我们可以从 得到图形内存信息1. DirectX SDK结构称为DXGI_ADAPTER_DESC。但是如果我不想使用DirectX API呢。 2. Win32_videocontroller:但是,如果视频控制器的可用性处于脱机状态,本课程并不总是为您提供适配器RAM信息。我在vista上检查过它。

是否有任何其他方式获得图形RAM?

+0

是否要**访问图形RAM **或只获得**图形适配器上的RAM **量? – atzz 2009-12-08 12:27:27

+0

只需要图形RAM的数量。 – amritad 2009-12-08 13:37:44

回答

3

在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中查看IDxDiagProviderIDxDiagContainer

+0

链接现在被破坏(至少不直接导致他们应该)。 – Ruslan 2016-08-07 20:27:43

1

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

因此,让显示驱动程序和/或下级API来完成这一工作。

如果要写入显示器表面(它不完全等同于帧缓冲区内存,尽管它在概念上几乎相同),但有很多选项。 DX,Win32,或者您可以尝试SDL库(libsdl)。

2

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

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

顺便提一下,you can find the Doom3 source here。您正在寻找的功能称为Sys_GetVideoRam,它位于一个名为win_shared.cpp的文件中,但如果您进行全面搜索解决方案,它会为您启用。