为什么HBITMAP使用如此少的内存?

时间:2010-01-24 14:27:35

标签: winapi bitmapdata

我遇到了一个有趣的问题:

  1. 通过libjpeg将大(4500x6000)jpeg加载到内存(RGBRGBRGB ....)(成本约200M内存)
  2. CreateDIBitmap()从数据
  3. 创建HBITMAP
  4. 释放使用的内存
  5. 现在我发现该进程根本只使用5M内存。我想知道HBITMAP的数据在哪里。 (我禁用页面文件)


    更新

    我编写了这样的代码用于测试:

        // initilise 
        BITMAP bitmap;
        BITMAPINFO info;
        // ....
        void *data = NULL;
        HDC hdc = ::GetDC(NULL);
        HBITMAP hBitmap = ::CreateDIBSection(hdc, &info, DIB_RGB_COLORS, &data, NULL, 0);
        ::ReleaseDC(NULL, hdc);
    
        if (hBitmap) {
            ::GetObject(m_hBitmap, sizeof(bitmap), &bitmap);
        }
    

    然后数据为0x2d0000(当然在用户空间中),bitmap.bmBits也是0x2d0000。所以我确保CreateDIBSection使用用户空间内存作为位图。

1 个答案:

答案 0 :(得分:2)

测试怎么样?在循环中创建HBITMAP。计算理论上使用的字节数(基于视频卡的bitdepth)。

在开始失败之前,您可以分配多少个字节的HBITMAP? (或者,在您确实开始看到对内存的影响之前)。

DDB由设备驱动程序管理。因此,它们倾向于存储在以下两个位置之一: - 内核模式分页池或视频卡内存本身。这两个都不会反映在任何进程内存计数中。 理论上,设备驱动程序可以为位图分配系统内存存储,并在需要时将它们移动到vram ...但是一些视频卡驱动程序认为视频内存应该足够并且只需在卡上分配所有HBITMAP。这意味着在2Gb标记处(如果它们在内核分页池中分配;取决于可用的ram并假设32位Windows版本)或256Mb标记(或者视频卡具有多少内存),HBITMAP的空间不足。

该讨论涉及设备相关位图。

DIBSections是一种特殊情况,因为它们被分配在可从内核模式访问的内存中,但在用户空间中可用。因此,任何使用大量位图的应用程序应该在可能的情况下使用DIBSections,因为应该有更少的机会使系统空间存储DDB。 我怀疑一个系统的系统范围限制仍然高达2Gb的DIBSections(在32位Windows版本上),因为在内核模式中没有“当前进程”的概念,视频设备驱动程序需要访问它。