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] DirectX

    xindon 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 😞





  • Danke habs schon rausbekommen. Nun fehlt mir ein gutes Mess-Skript.


Anmelden zum Antworten