2010-11-13 24 views
0

J'ai écrit une petite procédure dans l'assemblage pour dessiner du texte à l'écran (d'abord il écrit dans un tampon, puis copiez le tampon à l'écran avec BitBlt) La fonction fonctionne bien, et dessine chaque 25ms, mais j'ai remarqué que l'utilisation de la mémoire augmente avec le temps, et augmente beaucoup. Tout d'abord, j'ai essayé de libérer le tampon DC, puis supprimer le bitmap, en créant un nouveau pour voir si la mémoire est sortie, mais cela n'a pas fonctionné, est-il possible de réduire cette utilisation de la mémoire?Utilisation de la mémoire pendant la procédure de dessin

voici mon code

backh dd 0 
bmph dd 0 
isless db 1 
zerod dd 0 

initmenu: 
      invoke GetDC,0 
      invoke CreateCompatibleDC,eax 
      mov [backh],eax 
      invoke GetDC,0 
      invoke CreateCompatibleBitmap,eax,140,250 
      mov [bmph],eax 
      invoke SelectObject,[backh],[bmph] 
      invoke SetBkMode,[backh],TRANSPARENT 
      invoke SetTextColor,[backh],33CC00h 
      retn 

updatescreen: 
     invoke GetDC,0 
     mov [zerod],eax 
     mov cl,[isless] 
     test cl,cl 
     jnz @f 
     invoke BitBlt,[zerod],0,0,140,250,[backh],0,0,SRCCOPY 
     jmp _updatescreenend 
     @@: 
     invoke BitBlt,[zerod],0,0,140,25,[backh],0,0,SRCCOPY 
     _updatescreenend: 
     invoke ReleaseDC,[zerod] 
     retn 
menuproc: 
      invoke Sleep,25 
      call updatemenu 
      jmp menuproc 

Répondre

1

Vous devez libérer le DC. Il est possible que vous ne l'ayez pas fait correctement (dans le code que vous avez présenté, la valeur de DC est perdue au retour de BitBlt). Pouvez-vous estimer la quantité de mémoire perdue par itération?

+0

mis à jour la fonction, mais toujours des fuites de mémoire (ajouté une fonction pour libérer le courant continu quand j'appelle la fonction updatescreen , aucun résultat) – user506998

+0

Vous appelez la fonction 'GetDC()' deux fois dans initmenu. l'avez-vous sorti deux fois? – ruslik

1

résolu le problème, au lieu de ReleaseDC je devrais utiliser DeleteDC, les informations sur MSDN est erroné ...