0

興味深い質問に出会いました:

  1. 大きな(4500x6000)jpegをlibjpegでメモリ(RGBRGBRGB ....)にロードします(約200Mのメモリが必要です)
  2. データから HBITMAP を作成する CreateDIBitmap()
  3. 使用中のメモリを解放する

今では、プロセスが 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 がビットマップにユーザー空間メモリを使用するようにします。

4

1 に答える 1

2

お試し用にいかがでしょうか。ループで HBITMAP を作成します。理論的に使用されるバイト数を数えます (ビデオ カードのビット深度に基づきます)。

障害が発生し始める前に、何バイト分の HBITMAP を割り当てることができますか? (または、メモリへの影響が見られるようになるまで)。

DDB は、デバイス ドライバーによって管理されます。したがって、それらは次の 2 つの場所のいずれかに保存される傾向があります。カーネル モードのページ プールまたはビデオ カード メモリ自体です。どちらもプロセス メモリ カウントには反映されません。理論的には、デバイス ドライバーはビットマップ用のシステム メモリ ストレージを割り当て、必要に応じてそれらを vram に移動できます... しかし、一部のビデオ カード ドライバーは、ビデオ メモリで十分であると考え、カード上のすべての HBITMAP を単純に割り当てることができます。つまり、2Gb マーク (カーネル ページ プールに割り当てられている場合。利用可能な RAM と 32 ビット Windows エディションを想定) または 256Mb マーク (またはビデオ カードのメモリ量) のいずれかで HBITMAP のスペースが不足しています。

その議論は、デバイス依存のビットマップをカバーしていました。

DIBSections は、カーネル モードからアクセスできるメモリに割り当てられますが、ユーザー空間で使用できる特殊なケースです。そのため、多くのビットマップを使用するアプリケーションは、DDB を格納するためにシステムのスペースを枯渇させる可能性がはるかに少ないため、可能であれば DIBSectionsを使用する必要があります。ビデオデバイスドライバーがアクセスする必要があるカーネルモードには「現在のプロセス」の概念がないため、システム全体で最大2Gb相当のDIBSections(32ビットWindowsバージョン)の制限がまだあると思います。

于 2010-01-24T19:50:38.017 に答える