PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Win32: Zeit anhalten?


Expandable
2008-12-30, 15:00:47
Hallo allerseits,

ich hätte da mal eine Frage: Ich würde gerne den Zustand einer Anwendung mit einer anderen Anwendung betrachten (also eine Art "Debugger"). Da ich über die eigentliche Anwendung nichts weiß (ich weiß nur, dass sie Horde3D als Grafikengine benutzt, aber sonst nichts, insbesondere nicht, wieviele andere Threads noch laufen und was machen), müsste ich beim Debuggen die komplette Anwendung anhalten. Das lässt sich wohl mit der SuspendThread-Funktion der Win32-API bewerkstelligen (s. http://msdn.microsoft.com/en-us/library/ms686345(VS.85).aspx), die wohl genau für solche Zwecke gedacht ist. Nach dem Debuggen kann mit ResumeThread weitergemacht werden.

Die Frage ist nun: Ich rufe SuspendThread auf und debugge die Anwendung 5 Minuten lang. Dann geht's mit ResumeThread weiter. Nun "denken" wahrscheinlich die Game- und Physikengine, dass seit dem letzten Frame 5 Minuten vergangen wären (was ja eigentlich auch stimmt) und produzieren dann einen rechten Schmarrn. Wie kann ich das verhindern? SuspendThread scheint nach MSDN-Doku die Zeit nicht "anzuhalten". Bei einer Suche in MSDN und Google bin ich auch nicht wirklich schlauer geworden. Wie macht das z.B. nVidia mit nvPerfHUD?

Danke,
- Expandable

Nachtrag:

Gerade entdeckt in der nvPerfHud-Doku:

Note: PerfHUD “freezes” your application by returning the same value every time your application asks for the current time. This simulates an infinitely fast rendering loop, so the same workload is submitted for each frame.

Note: If your application has implemented a frame rate limiter, you may need to disable this functionality to use the time control, debugging and profiling features of PerfHUD. Please see the FAQ section for more information.

Genau sowas bräuchte ich also. Aber wie?

Monger
2008-12-30, 15:22:56
Ich wäre überrascht, wenn sich die Spiele tatsächlich an die Windows Uhr hängen würden. Normalerweise wird der Renderzyklus durch irgendeinen Timer angestoßen. Hältst du den Thread des Timers an, stoppst du auch den gesamten Ablauf dahinter.

Ist nur die Frage wieviele nebenläufige Threads mit Timern eigentlich existieren. Könnte bei komplexeren Anwendungen knifflig werden.

Expandable
2008-12-30, 15:42:09
Die meisten Spiele werden wohl den ganz normalen PerformanceCounter (QueryPerformanceCounter und QueryPerformanceFrequency) verwenden, oder nicht? Timer erscheinen mir eher unwahrscheinlich.

Dennoch danke für deinen Input.

Ectoplasma
2008-12-31, 11:33:14
Was genau macht denn diese andere "Anwendung"?
Einen laufenden Prozess "anzuschauen", ist alles andere als einfach. Du erwähnst aber dann so simple Dinge wie die "SuspendThread" Funktion. Hmm ...
passt irgendwie alles nicht.

Warum benutzt du keinen richtigen Debugger, der genau das macht, was du möchtest? Ok, einen Nachteil hat richtiges Debuggen unter Windows. Wird der Debugger beendet, beendet sich sich auch das zu debuggende Programm.

Monger
2008-12-31, 12:29:48
Warum benutzt du keinen richtigen Debugger, der genau das macht, was du möchtest? Ok, einen Nachteil hat richtiges Debuggen unter Windows. Wird der Debugger beendet, beendet sich sich auch das zu debuggende Programm.
Nö, nicht zwingend. Zumindest von .NET her kenne ich das so, dass man sich auch an einen laufenden Prozess ranhängen und auch wieder ausklinken kann. Wenn der Prozess allerdings nicht mit passenden Debug Informationen kompiliert wurde, kommt da halt nur wenig brauchbare Info raus.

Coda
2008-12-31, 17:59:36
Stimmt auch so. Man kann den Debugger wieder detachen.

Demirug
2008-12-31, 18:17:46
Die meisten Spiele werden wohl den ganz normalen PerformanceCounter (QueryPerformanceCounter und QueryPerformanceFrequency) verwenden, oder nicht? Timer erscheinen mir eher unwahrscheinlich.

Dennoch danke für deinen Input.

Ja. In der Regel nutzt man diese Werte aber nicht direkt sondern hat zum Beispiel noch Multiplikatoren um das Spiel schneller oder langsamer laufen zu lassen.

Was PerfHud nun macht ist die timer Funktionen von Windows zu hooken. Dadurch liefern die solange man in dem Freeze modus ist immer den gleichen Wert zurück.

Expandable
2008-12-31, 19:11:05
Ectoplasma: Einen "richtigen" Debugger zu verwenden, kommt nicht in Frage. Mich interessiert nicht die eigentliche Codeausführung, sondern der Zustand z.B. des Szenengraphen der 3D-Engine und die verwendeten Resourcen. Da komme ich bereits ran, dieses Problem ist gelöst.

Demirug: Danke für den Hinweis. Ich werde also versuchen die timer Funktionen von Windows irgendwie zu hooken.

Aber jetzt erst mal einen guten Rutsch euch allen!