Prozessspeicherverbrauch nimmt stätig zu bei TextOut

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
gombolo
Beiträge: 86
Registriert: 26.01.2011, 20:33

Prozessspeicherverbrauch nimmt stätig zu bei TextOut

Beitrag 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...
textout.jpg
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.
Zuletzt geändert von gombolo am 01.05.2022, 18:42, insgesamt 1-mal geändert.
Mein aktuelles Projekt -> FirstStrike | Alte Projekte mit Quellcode -> stacker | snake² | detriz | giDX² - DirecX7 based 2D Engine
Mirror
Establishment
Beiträge: 177
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag von Mirror »

Du solltest auf jeden Fall den Font und alles andere was Du im hDC geändert hast wieder zurücksetzen.
ehemals gdsWizard, http://www.mirrorcad.com
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 455
Registriert: 05.07.2003, 11:17

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag von Lord Delvin »

Was für ein Diagnosewerkzeug ist das?
XML/JSON in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Krishty
Establishment
Beiträge: 7852
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag von Krishty »

Visual Studio blendet das standardmäßig ein
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 455
Registriert: 05.07.2003, 11:17

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag von Lord Delvin »

Ich glaube ich hab' seit VisualStudio 6 keine neuere Version mehr zum Entwickeln verwendet ;)
XML/JSON in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Alexander Kornrumpf
Moderator
Beiträge: 1946
Registriert: 25.02.2009, 13:37

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag 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?
Benutzeravatar
Krishty
Establishment
Beiträge: 7852
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag von Krishty »

Schwierig. Das Zurücksetzen auf oldObj würde ich ebenfalls probieren, aber nur mangels Alternativen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
NytroX
Establishment
Beiträge: 265
Registriert: 03.10.2003, 12:47

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 7852
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Prozessspeicher nimmt stätig zu bei TextOut

Beitrag von Krishty »

NytroX hat geschrieben: 30.04.2022, 19:24Funktion vereinfachen.
Noch besser vielleicht erstmal ein LineTo() anstelle von Textausgabe.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
gombolo
Beiträge: 86
Registriert: 26.01.2011, 20:33

Re: Prozessspeicherverbrauch nimmt stätig zu bei TextOut

Beitrag 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);
}
Mein aktuelles Projekt -> FirstStrike | Alte Projekte mit Quellcode -> stacker | snake² | detriz | giDX² - DirecX7 based 2D Engine
Alexander Kornrumpf
Moderator
Beiträge: 1946
Registriert: 25.02.2009, 13:37

Re: Prozessspeicherverbrauch nimmt stätig zu bei TextOut

Beitrag von Alexander Kornrumpf »

Jetzt hast du zuviel gleichzeitig geändert um wirklich sagen zu können, was denn die Lösung war.
Benutzeravatar
gombolo
Beiträge: 86
Registriert: 26.01.2011, 20:33

Re: Prozessspeicherverbrauch nimmt stätig zu bei TextOut

Beitrag 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.
Mein aktuelles Projekt -> FirstStrike | Alte Projekte mit Quellcode -> stacker | snake² | detriz | giDX² - DirecX7 based 2D Engine
Antworten