CreateCompatibleBitmap und CreateDIBSection (Speicher-DC ist)

von dem, was ich gelesen habe, hier es scheint, dass die meisten der Windows-GDI-Funktionen beschleunigt werden. So zum Beispiel einen Anruf zu BitBlt oder AlphaBlend nutzt hardware-Beschleunigung, wenn verfügbar. Es erwähnt auch, dass der Inhalt eines Fensters gehalten werden nur im video-Speicher. Das alles ist nun gut und richtig für einen Fenster DC, aber wie kann ich einen Speicher DC, die sich in video Karte Speicher? Und sobald wir erreicht haben, dass so erhalten Sie direkten Zugriff auf die Pixel, ich denke, dass würde 1. temporäre kopieren der Daten in den Systemspeicher 2. ändern Sie die pixel-Daten 3. kopieren Sie video-Speicher.

Habe ich versucht, zwei Ansätze, die beide reservieren system-Speicher, wie kann ich sehen, im task-manager...

  1. CreateCompatibleBitmap

    HDC hDC = GetDC(NULL);
    m_hDC = CreateCompatibleDC(hDC);
    m_hBmp = CreateCompatibleBitmap(hDC, cx, cy);
    ReleaseDC(NULL, hDC);
    
    m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);

    und dann rufen Sie zu erhalten, die bits

    GetBitmapBits(...)

    laut diverser Kommentare dieser sollte in der Tat schaffen die kompatible bitmap im Videospeicher, aber warum kann ich immer noch sehen, eine Zunahme der Arbeitsspeicher (auch wenn ich nicht anrufen GetBitmapBits)?

  2. CreateDIBSection

    HDC hDC = GetDC(NULL);
    m_hDC = CreateCompatibleDC(hDC);
    
    BITMAPINFO bmi;
    memset(&bmi, 0, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = cx;
    bmi.bmiHeader.biHeight = -cy; //top-down
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;
    m_hBmp = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&m_pBits, NULL, NULL);
    
    ReleaseDC(NULL, hDC);
    
    m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);

    in diesem Fall erhalten wir die Zeiger auf die bits sofort ( m_pBits ), so ist es offensichtlich, dass auch diese befinden sich im system-Speicher...

Oder ist es eine Kopie, die gehalten wird im system-memory für beide Methoden? Aber wenn ich die bits im system-Speicher, ein Aufruf BitBlt wäre noch zu überprüfen/kopieren von system-Speicher wieder... nicht sehr optimiert, IMHO.

EDIT: ich habe auch versucht, die Schaffung Speicher DC mit der BeginBufferedPaint und GetBufferedPaintBits. Es ordnet Systemspeicher als gut, so dass ich vermute, es ist nur ein wrapper für die oben genannten Methoden, sondern speichert die DC ist so eine nächsten Aufruf nicht unbedingt muss wieder ein Speicher-DC. Raymond Chen ' s Artikel.

EDIT #2: ich denke, die eigentliche Frage ist: mache ich das memory DC-Erstellung korrigieren, die in Methode 1 oder 2 zu bekommen, die hardware-beschleunigte GDI-Operationen? Zu mir, es scheint alles so schnell, und beide Methoden bieten die gleiche Geschwindigkeit zu, so dass es nicht wirklich eine Möglichkeit, es zu überprüfen...

  • Ich dachte, es befindet sich immer im Arbeitsspeicher und wird nur ausgetauscht, die in video-Speicher beim Rendern auf dem Bildschirm ...
  • Also, dass würde bedeuten, wir können nicht erstellen Sie Sie in video-Speicher und die GDI-Funktionen nicht hardware beschleunigt, wenn Sie arbeiten auf einem memory-DC?
  • GDI-Funktionen für blitting-Operationen nur sind die hardware-beschleunigte auf Windows 7 ausschließlich. GDI+ ist noch in software gerendert wird sogar auf Windows 7 und ist immer noch viel langsamer. Wenn Sie dabei sind, etwas komplexer, das erfordert, dass die Leistung, die einfache Antwort ist, don T verwenden GDI. OpenGL-oder DirectX-wenn Sie möchten, den direkten Zugriff auf hardware. GDI war immer eine Abstraktion.
  • Von was ich gelesen habe GDI-Funktionen hardware-beschleunigt auf jeder version von Windows außer Vista (aufgrund der neu eingeführten Treiber-design). Ich bin nicht mit GDI+ btw, und würde nicht empfehlen, jemand zu verwenden, es nicht mehr, da es nicht hardware-beschleunigt in Win7.
  • GDI war veraltet, zu Gunsten von GDI+ in Windows XP, dann brachten Sie GDI zurück, aber ohne hardware-Beschleunigung in Vista. Dann endlich erkannten Sie Ihren Irrtum in Windows 7. In jedem Fall ist es noch bis zur display-adapter-Treiber, als ob zur Unterstützung der MS-GDI oder nicht.
  • Darüber hinaus prüfen, ob system-Speicher verwendet wird, ist nicht als Indikator gelten, ob oder ob nicht etwas ist hardware-beschleunigte Grafiken. Je nach Grafik-chip, und auch der Fahrer -, textur-Daten gespeichert oder gesichert im system-Speicher (z.B. default-Verhalten für OpenGL). GDI ist hardware-beschleunigt wie es ist, aber Sie haben nicht die tatsächliche Kontrolle über Sie. Wenn Sie die Kontrolle ich Stimme mit AJG85 sollten Sie eine Grafik-API statt.
  • "Als Folge der BitBlt-API wurde die hardware-beschleunigte und die meisten anderen GDI-Operationen gab es nicht." docs.microsoft.com/en-us/windows/desktop/direct2d/...

InformationsquelleAutor demorge | 2011-09-21
Schreibe einen Kommentar