FPS messen
-
Wie baue ich in meine Engine eine FPS-Messung ein?
Meine Scene besteht nur aus RenderRect();
Am besten wäre eine einzige Methode, zB. showFPS();
MfG
-
void RenderLoop() { timer.start(); // ... Rendern timer.end() timer.get_duration(); // Dauer zum Zeichnen eines Frames // Hochrechnen, wieviel Frames man in einer Sekunde geschafft hätte wenn ein Frame x Sekunden dauert }
-
Du misst jeden Schleifendurchlauf die Zeit; die Differenz zwischen jeder Messung gibt an, wie lange ein Durchlauf gedauert hat.
Das kannste dann hochrechnen auf Frames pro Sekunde (FPS)::edit::
Du Schwein :)))
-
void RenderLoop() { timer.start(); // ... Rendern timer.end() timer.get_duration(); // Dauer zum Zeichnen eines Frames // Hochrechnen, wieviel Frames man in einer Sekunde geschafft hätte, wenn ein Frame x Sekunden dauert // Angenommen get_duration liefert Millisekunden ShowFPS(1000/timer.get_duration()); }::edit::
hehe
-
Und woher kommt timer?
-
Außerdem, wie gebe ich dann die Schrift aus? Wie geht das möglichst einfach?
-
Mit was arbeitest du überhaupt? OpenGL, SDL, DirectX, färbst du einzelne Pixel in nem Widget ein, und und und?
Wir brauchen schon mehr Informationen, was du genau machst und vorhast.
-
xindon schrieb:
Mit was arbeitest du überhaupt?
[o] DirectXxindon schrieb:
färbst du einzelne Pixel in nem Widget ein, und und und?
Bitte wer ist gestorben?
xindon schrieb:
Wir brauchen schon mehr Informationen, was du genau machst und vorhast.
Okay.
-
Renderer schrieb:
Und woher kommt timer?
z. B.:
#include <string> using namespace std; #include <windows.h> namespace Vertexwahn { namespace System { // Exception. Wird geworfen, wenn versucht wird ein HighResolutionPerformanceTimer // Objekt zu erstellen, wenn dieser nicht untersützt wird. class HighPerformanceCounterNotSupportedException { }; class HighResolutionPerformanceTimer { public: // Constructor HighResolutionPerformanceTimer(); // Start the timer void Start(); // Stop the timer void Stop(); // Returns the duration of the timer (in seconds) double getDuration(); virtual ~HighResolutionPerformanceTimer() {} private: // copy-ctor schützen HighResolutionPerformanceTimer(const HighResolutionPerformanceTimer &src) {} // Zuweisungsoperator schützen void operator=(const HighResolutionPerformanceTimer &src) {} LONGLONG startTime, stopTime; LONGLONG freq; }; } }#include "HighResolutionPerformanceTimer.h" #include <string> using namespace std; #include <windows.h> namespace Vertexwahn { namespace System { HighResolutionPerformanceTimer::HighResolutionPerformanceTimer() { startTime = 0; stopTime = 0; if (QueryPerformanceFrequency((LARGE_INTEGER*) &freq) == false) { // high-performance counter not supported throw HighPerformanceCounterNotSupportedException(); } } void HighResolutionPerformanceTimer::Start() { // lets do the waiting threads there work Sleep(0); QueryPerformanceCounter((LARGE_INTEGER*) &startTime); } void HighResolutionPerformanceTimer::Stop() { QueryPerformanceCounter((LARGE_INTEGER*) &stopTime); } double HighResolutionPerformanceTimer::getDuration() { return (double)(stopTime - startTime) / (double) freq; } } }
-
Renderer schrieb:
Außerdem, wie gebe ich dann die Schrift aus? Wie geht das möglichst einfach?
Such mal im DXSDK nach Font - da gibts glaub ich ID3DXFont oder so was ähnliches - schau dir nachdem du es gefunden hast und durchgelesen hast gleich mal ein Beispiel an, das dem DXSDK beiliegt
-
Danke, der timer ist jetzt kein Problem mehr.
Jedoch finde ich keine Samples zu ID3DXFont...
Bin bei
D3DXCreateFont(m_pDevice, 20, 20, 1, 1, false, 0, 0, 0, 0, pFacename, ppFont);
steckengeblieben. Wie kreiere ich pFacename ...
Kenne mich gar nicht mehr aus, gibt es ein Minimalbeispiel?
-
D3DXFONT_DESC description; ZeroMemory( &description, sizeof(description) ); description.Height = 0; description.Width = 0; description.Weight = FW_DONTCARE; description.MipLevels = 1; description.Italic = false; description.CharSet = DEFAULT_CHARSET; description.OutputPrecision = OUT_DEFAULT_PRECIS; description.Quality = DEFAULT_QUALITY; description.PitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; D3DXCreateFontIndirect( m_lpd3dDevice, &description, m_lpd3dFont );Weis jetzt aber nicht ob das passt..
edit: wenn du den Facename leer lässt, wählt es die erste Schrift, die passt
-
Danke, und wie zeichne ich nun?
-
Habs so gemacht, wird aber gar nichts angezeigt, nur schwarzer Bildschirm:
Hauptklasse:
ID3DXFont *font; D3DXFONT_DESC description;Dann alles von dir aufrufen,
D3DXCreateFontIndirect( m_pDevice, &description, &font);
Und dann
RECT rctDest = {100, 100, 100, 100}; font->DrawText(0, "T E S T", -1, &rctDest, 0, 0xFFFF0000);Wird aber nichts angezeigt

-

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/ID3DXFont__DrawText.asp
http://www.drunkenhyena.com/cgi-bin/view_cpp_article.pl?chapter=3;article=17Sorry, hab mein Source zu Hause, kann Dir später vielleicht mehr sagen.
-
Danke habs schon rausbekommen. Nun fehlt mir ein gutes Mess-Skript.