Analyse eines laufenden Programms?
-
Ich habe eine fertiges Programm (mit und ohne Debuginfos) und möchte das jetzt analysieren, sprich feststellen welche Funktionen wieviel Zeit verbrauchen? Kann ich ein Programm in einer Art Sandbox laufen und mir hinterher eine Auswertung anzeigen lassen?
Benutze VC++ 2005 Express, Anwendung ist eine WinAPI-Anwendung (ScreenSaver).
Hintergrund:
Besagte Anwendung fängt trotz Doublebuffer an zu flackern, wenn ein animiertes Fraktal größer als 50% der Bildschirmfläche wird. Ich möchte nun feststellen, ob der Flaschenhals beim Zeichnen in den Buffer oder bei der anschließenden BitBlt-Routine zu suchen ist.Programm: http://ticore.de/share/ifs.zip // etwa 8,0 Kb
-
Viel einfacher wäre die Frage, ob Du WM_ERASEBKND behandelst, indem Du nichts tust und TRUE returnierst?
Anders macht Doublebuffering keinen Sinn!
-
Martin Richter schrieb:
(...)Anders macht Doublebuffering keinen Sinn!
Etwa so? Ändert leider auch nichts.
case WM_TIMER: KillTimer(hWnd, timer_id); // maximale Ausdehnung holen xmin = ifs_st->xmin; xmax = ifs_st->xmax; ymin = ifs_st->ymin; ymax = ifs_st->ymax; // Alles was zuvor gezeichnet wurde löschen if (xmin <= xmax && ymin <= ymax) { rect.left = xmin; rect.top = ymin; rect.right = xmax+1; rect.bottom = ymax+1; FillRect(myBackBuffer, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH)); ifs_st->xmin = ifs_st->width + 1; ifs_st->xmax = ifs_st->ymax = -1; ifs_st->ymin = ifs_st->height + 1; } if (ifs_st->npoints) { drawpoints(ifs_st); } // copy the changed area (including erased area) to screen BitBlt (myDevCon, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1, myBackBuffer, xmin, ymin, SRCCOPY); // (...) Iterationen berechnen // (...) Mutationen berechnen SetTimer(hWnd, timer_id, idelay, NULL); break; case WM_ERASEBKGND: return true;
-
Zeichnen sollte man immer in WM_APINT machen und nicht in WM_TIMER!
Zur Analyse ist in der EE leider nichts dabei, aber in der Team Suite...
-
Jochen Kalmbach schrieb:
Zeichnen sollte man immer in WM_APINT machen und nicht in WM_TIMER!
Aber die wird doch nur aufgerufen, wenn bei einer normalen Anwendungen ein Zeiechenbereich für ungültig erklärt wird, oder verstehe ich da was falsch?
Denn verschiebe ich meine BitBlt-Routine nach WM_PAINT passiert gar nichts, denn WM_PAINT tritt nie ein. Muss ich selbst im Timer eine WM_PAINT posten?Jochen Kalmbach schrieb:
Zur Analyse ist in der EE leider nichts dabei, aber in der Team Suite...
Etwas weniger kommerzielles gibt es wohl nicht oder?
-
Dann rufst Du halt in WM_TIMER ein Invalidate(Rect) auf... dann wird korrekt gezeichnet und zwar nur dann wenn das Fenster auch sichtbar ist (bei Dir würde immer gezeichnet werden).
-
VTune von Intel ist ein tolles, wenn nicht das beste Programm zum Analysieren deiner Anwendungen.
Für 30 Tage kannst du VTune testen.
http://www.intel.com/cd/software/products/asmo-na/eng/vtune/219898.htm