2010-01-24 7 views
0

j'ai rencontré une question intéressante:Pourquoi HBITMAP utilise-t-il si peu de mémoire?

  1. charge un grand (4500x6000) jpeg en mémoire (RGBRGBRGB ....) par libjpeg (coût de la mémoire 200M)
  2. CreateDIBitmap() pour créer un HBITMAP de la données
  3. la mémoire utilisée

maintenant je trouve que seulement la mémoire 5M l'utilisation de processus du tout. Je me demande où sont les données du HBITMAP. (Désactiver pagefile)


mise à jour:

j'écrire un code pour le test:

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

les données sont 0x2d0000 (sûrement dans l'espace utilisateur), bitmap.bmBits est également 0x2d0000 . Donc, je m'assure que CreateDIBSection utilise la mémoire de l'espace utilisateur pour bitmap.

+0

Comment savez-vous combien de mémoire il utilise? Si vous regardez simplement le gestionnaire de tâches, ce n'est pas toujours une jauge précise. –

Répondre

2

Que diriez-vous de ceci pour un essai. Créez des HBITMAP dans une boucle. Compter le nombre d'octets théoriquement utilisés (Basé sur le bitdepth de votre carte vidéo).

Combien d'octets de bits HBITMAP pouvez-vous allouer avant qu'ils ne commencent à échouer? (Ou, alternativement, jusqu'à ce que vous commenciez à voir un impact sur la mémoire).

Les DDB sont gérés par des pilotes de périphérique. Ils ont donc tendance à être stockés dans l'un des deux emplacements suivants: - pool paginé en mode noyau ou dans la mémoire des cartes vidéo elle-même. Les deux ne seront reflétés dans aucun compte de mémoire de processus. En théorie, les pilotes de périphériques peuvent allouer de la mémoire système pour les bitmaps, les déplacer vers vram en fonction des besoins ... mais certains pilotes de cartes vidéo pensent que la mémoire vidéo devrait suffire et allouer simplement tous les HBITMAP sur la carte. Ce qui signifie que vous manquez d'espace pour les HBITMAP au niveau de 2 Go (s'ils sont alloués dans le pool paginé du noyau, en fonction du bélier disponible et en supposant des éditions Windows 32 bits) ou 256Mb (ou peu de mémoire). Cette discussion a porté sur les bitmaps dépendant du périphérique. Les DIBSections sont un cas particulier car elles sont allouées dans la mémoire accessible depuis le mode noyau, mais disponible dans l'espace utilisateur. En tant que tel, toute application qui utilise beaucoup de bitmaps devrait utiliser DIBSections si possible car il devrait y avoir beaucoup moins de possibilités de priver le système d'espace pour stocker les DDB. Je suspecte que l'on a encore une limite de système de DIBSections jusqu'à 2 Go (sur les versions Windows 32 bits) car il n'y a pas de concept de 'processus en cours' en mode noyau où les pilotes de périphériques vidéo auront besoin d'accéder.

+0

Je pense que vous avez raison, peut-être que les données de HBITMAP sont stockées en mode noyau (ou carte vidéo), donc je ne peux voir que très peu de mémoire dans le gestionnaire de tâches ou l'explorateur de processus. Mais je ne sais pas comment vérifier ce point. – ddh

+0

Oui, vous avez raison. Si j'utilise CreateDIBSection, les données sont stockées dans l'espace utilisateur, pas dans le noyau. Merci :) – ddh

+0

CreateDIBSection devrait, si ma compréhension des mappages de mémoire et du mode du noyau est correct, utiliser à la fois l'espace kernal et l'espace utilisateur. –