CreateCompatibleBitmap et CreateDIBSection (DC de Mémoire)

de ce que j'ai lu ici il semble que la plupart des Fenêtres des fonctions GDI sont accélérés. Ainsi, par exemple, un appel à BitBlt ou AlphaBlend utilise l'accélération matérielle si disponible. Il mentionne également que le contenu d'une fenêtre ne sont conservés que dans la mémoire vidéo. Maintenant c'est tout bon et vrai pour un fenêtre DC, mais comment puis-je utiliser un DC de mémoire qui réside dans la mémoire de carte vidéo? Et une fois que nous avons réalisé que la façon d'obtenir un accès direct aux pixels, je pense que ce serait la participation de 1. copie les données de la mémoire système de 2. modifier les données de pixel 3. copie de sauvegarde dans la mémoire vidéo.

J'ai essayé les deux approches, à la fois allouer de la mémoire système comme je peux le voir dans le gestionnaire de tâches...

  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);

    et ensuite appeler pour obtenir les bits

    GetBitmapBits(...)

    selon les différents commentaires, cela devrait en effet de créer le compatible bitmap en mémoire vidéo, mais pourquoi ne puis-je encore une augmentation de la mémoire système (même si je n'ai pas l'appeler 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);

    dans ce cas, nous recevons le pointeur à l'bits immédiatement (m_pBits) il est donc évident que ces résider dans la mémoire du système...

Ou est-il une copie est conservée dans la mémoire du système pour les deux méthodes? Mais si je change de bits dans la mémoire du système à un appel à BitBlt aurait encore à vérifier/copie de la mémoire système à nouveau... pas très optimisé à mon humble avis.

EDIT: j'ai aussi essayé de créer de la mémoire du contrôleur de domaine à l'aide de la BeginBufferedPaint et GetBufferedPaintBits. Il alloue de la mémoire système comme bien, je suppose que c'est juste un wrapper pour les méthodes ci-dessus, mais les caches de la DC est donc un prochain appel n'a pas nécessairement de recréer une mémoire de DC. Voir Raymond Chen l'article.

EDIT #2: je crois que la vraie question est: Suis-je en train de faire le DC de mémoire de la création de corriger dans la méthode 1 ou 2 pour obtenir l'accélération matérielle opérations GDI? Pour moi tout semble rapide, et les deux méthodes fournissent la même vitesse trop, donc il n'y a pas vraiment moyen de le vérifier...

J'ai pensé qu'il réside toujours dans la mémoire du système et obtient seulement échangé dans la vidéo la mémoire lors du rendu de l'écran ...
De sorte que voudrait dire qu'on ne peut pas le créer dans la mémoire vidéo et le GDI n'est pas l'accélération matérielle en travaillant sur un DC de mémoire?
Les fonctions GDI pour blitting opérations d' sont l'accélération matérielle sous Windows 7 exclusivement. GDI+ est encore rendu logiciel, même sur Windows 7 et il est toujours beaucoup plus lent. Si vous faites quelque chose de complexe qui exige de performance de la réponse la plus simple est de ne pas utiliser l'interface graphique. Utiliser OpenGL ou DirectX si vous voulez un accès direct au matériel. GDI a été un sera toujours une abstraction.
De ce que j'ai lu fonctions GDI sont l'accélération matérielle sur toutes les versions de Windows à l'exception de Vista (à cause du pilote nouvellement introduit de conception). Je ne suis pas en utilisant GDI+ btw, et je ne recommande à personne de l'utiliser tout au plus, car ce n'est pas l'accélération matérielle dans Win7.
En outre, vérifier si la mémoire système est utilisé n'est pas un indicateur valide si oui ou non quelque chose est à l'accélération graphique matérielle. En fonction de la puce graphique, et même le pilote, la texture de données est stockée ou sauvegardés dans la mémoire système (par exemple, le comportement par défaut pour l'OpenGL). GDI est accéléré par le matériel tel qu'il est, mais vous n'avez pas de réel contrôle sur elle. Si vous la commande je suis d'accord avec AJG85 que vous devez utiliser une API graphique à la place.

OriginalL'auteur demorge | 2011-09-21