Seite 1 von 1
Prozessspeicherverbrauch nimmt stätig zu bei TextOut
Verfasst: 29.04.2022, 22:40
von gombolo
Hallo...ich habe hier eine Methode welches einen Text ausgeben soll auf einer Directx7 Surface...ich weiß ist alt, aber ich misste gerade meine Festplatte aus und stoße hier und da auf sehr alten Code von mir. :)
Diese Methode wird in einer Schleife aufgerufen und zeigt im Spiel die Punktzahl an oder Level usw...was man halt so in einem Spiel anzeigt.
Hier der Code:
Code: Alles auswählen
void
CGidxGraphic::Print(int x, int y, const wchar_t text[])
{
HDC hdc=NULL;
m_lpDDSBack->GetDC(&hdc);
HGDIOBJ oldObj= SelectObject(hdc,m_font);
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,m_fontcolor);
TextOut(hdc,x,y,text,lstrlen(text));
m_lpDDSBack->ReleaseDC(hdc);
}
und so sieht der Speicherverbrauch aus...
Wenn ich TextOut auskommentiere, dann bleibt der Speicherbedarf konstant, aber wenn ich TextOut "aktiviere" dann steigt der Speicherverbrauch.
hmmm....wo ist der Fehler? Sollte doch nicht sein oder übersehe ich was wichtiges.
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 01:32
von Mirror
Du solltest auf jeden Fall den Font und alles andere was Du im hDC geändert hast wieder zurücksetzen.
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 08:16
von Lord Delvin
Was für ein Diagnosewerkzeug ist das?
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 09:35
von Krishty
Visual Studio blendet das standardmäßig ein
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 11:21
von Lord Delvin
Ich glaube ich hab' seit VisualStudio 6 keine neuere Version mehr zum Entwickeln verwendet ;)
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 11:59
von Alexander Kornrumpf
Mirror hat geschrieben: ↑30.04.2022, 01:32
Du solltest auf jeden Fall den Font und alles andere was Du im hDC geändert hast wieder zurücksetzen.
Nach der einfachen Code Review Heuristik, "du machst nichts mit
oldObj", vager Erinnerung an die ganz frühen 00er Jahre und flüchtigem Googlen würde ich auch behaupten, dass es wahrscheinlich daran liegt.
Interessanterweise ist das Internet reich an Seiten mit dieser Festsstellung (weil so steht es auch im MSDN) und sehr arm an Erklärungen, was da eigentlich vor sich geht. Krishty?
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 13:10
von Krishty
Schwierig. Das Zurücksetzen auf oldObj würde ich ebenfalls probieren, aber nur mangels Alternativen.
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 19:24
von NytroX
Ich sehe auch erstmal nichts grundlegend falsches.
Ich würde 2 Sachen versuchen:
1)
Funktion vereinfachen. Man sieht dann zwar wahrscheinlich nichts, aber es geht ja erstmal nur um den Speicherverbrauch.
Code: Alles auswählen
CGidxGraphic::Print(int x, int y, const wchar_t text[])
{
HDC hdc=NULL;
m_lpDDSBack->GetDC(&hdc);
TextOut(hdc,x,y,text,lstrlen(text));
m_lpDDSBack->ReleaseDC(hdc);
}
2)
Beide Implementierungen mal im Release-Mode starten.
Es kann nämlich sein, dass der Funktionsaufruf einfach irgendwo Debug-Infos sammelt.
Re: Prozessspeicher nimmt stätig zu bei TextOut
Verfasst: 30.04.2022, 19:39
von Krishty
NytroX hat geschrieben: ↑30.04.2022, 19:24Funktion vereinfachen.
Noch besser vielleicht erstmal ein
LineTo() anstelle von Textausgabe.
Re: Prozessspeicherverbrauch nimmt stätig zu bei TextOut
Verfasst: 01.05.2022, 18:47
von gombolo
Ich habe damals (auch heute noch) gedacht ich erstelle ein Font und benutze es, aber jedes mal, wenn ich das gemacht habe wurde mehr Speicher notwendig...Memory Leak :)
Also lag das Geheimnis darin das Font nach der Verwendung wieder zu löschen. Habe den Code etwas umgebaut und das Leck ist weg.
Code: Alles auswählen
void
CGidxGraphic::Print(int x, int y, LPCWSTR text)
{
HDC hdc=NULL;
m_lpDDSBack->GetDC(&hdc);
HFONT font = ::CreateFont(m_font.height, m_font.width, 0, 0, m_font.fnWeight, 0, 0, 0, 0, 0, 0, 0, FIXED_PITCH, L"ARIAL");
SelectObject(hdc,font);
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,m_fontcolor);
TextOut(hdc,x,y,text,lstrlen(text));
// Hier löschen !!!
DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
m_lpDDSBack->ReleaseDC(hdc);
}
Re: Prozessspeicherverbrauch nimmt stätig zu bei TextOut
Verfasst: 01.05.2022, 19:36
von Alexander Kornrumpf
Jetzt hast du zuviel gleichzeitig geändert um wirklich sagen zu können, was denn die Lösung war.
Re: Prozessspeicherverbrauch nimmt stätig zu bei TextOut
Verfasst: 01.05.2022, 20:25
von gombolo
:D ja....ich habe ein paar Sachen umprogrammiert.
Ganz am Anfang habe ich mit CreateFont ein Font erstellt (im Konstruktor) . Dann erhalten ich ein HFONT....das habe ich dann in der Methode Print in SelectObject immer wieder verwendet...um ein Objekt im Gerätekontex zu erhalten. Damit habe ich auf die DX7 Surface geschrieben. Dann habe ich das Gerätekontex wieder freigegeben, ABER es scheint so, dass das Font-Objekt noch Speicher hat und beim nächsten Durchlauf wieder Speicher erhält (nur meine Vermutung)
Weil wenn ich das aktuelle Font-Objekt wieder lösche (Was ich beim Kommentar //Hier löschen mache) weil SelectObject das alte Objekt zurückgibt und das ja das ist mit dem ich vorher "gezeichnet" habe.
Wenn ich CreateFont nur einmal mache, dann ist das Font trotzdem gelöscht und ab dem zweiten Durchlauf gibt es kein Font mit dem ich "zeichnen" kann.
So stelle ich mir den Ablauf vor...keine Ahnung ob das auch so von MS gedacht ist, aber ich habe kein Speicherleck mehr.