WIN32 GDI - GUI -> verringert Performance auf andere Programme ?!
-
Hallo Leute, ich habe mal eine Allgemeine Frage ohne Code Beispiele.
Ich habe eine WIN32-GDI GUI geschrieben und jetzt habe ich das Problem,
das wenn ich z.B. Spiele anhabe, die ihre Performance durch das Programm verlieren. Ich verstehe nicht warum, denn das Programm benötigt unter 1MB Arbeitsspeicher und nutzt Max. 3% der CPU Leistung. Ich benutze eine einfache DrawText Funktion aus der WIN32-API und benutze einen Bitmap Backbuffer.
-
... und Du hast keine Handle Leaks?
Schau mal auf die Anzahl der GDI-Objekte!
-
@Quest235234
Vielleicht machst du irgendwas was der Desktop Window Manager nicht mag. Zeichnest du vielleicht in ein Fenster das nicht dir gehört?Du kannst mal ausprobieren ob der Performance-Hit auch gleich schlimm ist, wenn du Aero ausschaltest. Falls es da deutlich weniger schlimm ist, liegt es vermutlich daran.
-
Hallo Leute, das Problen liegt an dem Back Buffer. Die CPU auslastung ist komplett ungenutzt und der RAM sowieso aber jedes Fenster fängt an zu laggen, wenn ich den Back Buffer benutze. ( z.B. wenn man den Task-Manager hin und her schiebt. ) Warum das jetzt auf die anderen Programme sich auswirkt kann ich mir nur erklären das gewisse Dinge wie TOPMOST ect. schuld sind.
-
Das glaube ich nicht. Evtl. hast Du doch ein GDI Leak!
-
@Quest235234
Zeig mal etwas Code...
Und/oder beschreib genauer was du mit "Back Buffer" meinst. GDI hat nämlich eigentlich kein Konzept "Back Buffer" - was du damit meinst können wir also nur raten.
-
case ( WM_PAINT ):
{PAINTSTRUCT PaintStruct;
HDC hPaintDC = BeginPaint( hWnd , &PaintStruct );
RECT Rect;
SetRect( &Rect , 0 , 0 , g_BackBuffer.uSizeX , g_BackBuffer.uSizeY );
FillRect( g_BackBuffer.hDC , &Rect , hTransparent );Rendering( ); // DrawText, FillRect ( with g_BackBuffer.hDC )
BitBlt( hPaintDC , 0 , 0 , g_BackBuffer.uSizeX , g_BackBuffer.uSizeY , g_BackBuffer.hDC , 0 , 0 , SRCCOPY );
EndPaint( hWnd , &PaintStruct );
}
break;
-
( WM_CREATE )
> 'SetTimer' erstellt den Timer, der dann über die 'WM_TIMER' Message benutzt wird.
( WM_TIMER )
> 'InvalidateRect' ruft die WM_PAINT Funktion auf und die 'WM_ERASEBKGND' wird mit 'TRUE' abgefangen.
( WM_PAINT )
[code] PAINTSTRUCT PaintStruct;HDC hPaintDC = BeginPaint( hWnd , &PaintStruct );
/* Back Buffer Clear - hTransparent ( TRANSPARENT COLOR OF WINDOW ) */
RECT Rect;
SetRect( &Rect , 0 , 0 , g_BackBuffer.uSizeX , g_BackBuffer.uSizeY );
FillRect( g_BackBuffer.hDC , &Rect , hTransparent );Rendering( );
/*
@Rendering Function
Using: g_BackBuffer.hDC
Calls: DrawText , FillRect
*/BitBlt( hPaintDC , 0 , 0 , g_BackBuffer.uSizeX , g_BackBuffer.uSizeY , g_BackBuffer.hDC , 0 , 0 , SRCCOPY );
EndPaint( hWnd , &PaintStruct );
-
Hey Leute, ich hoffe ich verirre euch hier nicht so .. Mir ist gerade etwas aufgefallen, wenn ich mein Programm an habe, hat es so gut wie 0% CPU Auslastung und unter 1MB RAM benutzung .. Aber jetzt kommt das "aber" .. Die "dwm.exe" - "Desktopfenster-Manager", steigt auf gut bis zu 20% CPU Auslastung hoch & alle Fenster fangen beim Bewegen an zu hängen.
-
Quest235234 schrieb:
Die "dwm.exe" - "Desktopfenster-Manager", steigt auf gut bis zu 20% CPU Auslastung hoch & alle Fenster fangen beim Bewegen an zu hängen.
hustbaer schrieb:
@Quest235234
Vielleicht machst du irgendwas was der Desktop Window Manager nicht mag. Zeichnest du vielleicht in ein Fenster das nicht dir gehört?Du kannst mal ausprobieren ob der Performance-Hit auch gleich schlimm ist, wenn du Aero ausschaltest. Falls es da deutlich weniger schlimm ist, liegt es vermutlich daran.
-
Probier das was ich geschrieben habe.
-
Probier folgende Änderung (ist nur ein Schuss ins Blaue, k.A. ob das was bringt):
// case WM_PAINT: // VOR BeginPaint Back-Buffer neu zeichnen /* Back Buffer Clear - hTransparent ( TRANSPARENT COLOR OF WINDOW ) */ RECT Rect; SetRect( &Rect , 0 , 0 , g_BackBuffer.uSizeX , g_BackBuffer.uSizeY ); FillRect( g_BackBuffer.hDC , &Rect , hTransparent ); Rendering(); // BeginPaint erst nachdem der Back-Buffer komplett gezeichnet wurde PAINTSTRUCT PaintStruct; HDC hPaintDC = BeginPaint( hWnd , &PaintStruct ); BitBlt( hPaintDC , 0 , 0 , g_BackBuffer.uSizeX , g_BackBuffer.uSizeY , g_BackBuffer.hDC , 0 , 0 , SRCCOPY ); EndPaint( hWnd , &PaintStruct );
- Zeig den Code her mit dem du den DC und die Bitmap für den Back-Buffer erzeugst.
-