Framerate Begrenzung DirectX9



  • Hi!

    gibt es directX funktionen die eine Framerate begrenzung realisieren?
    oder mach ich das über time funktionen?


  • Mod

    reicht vsync nicht? brauchst du was spezielles? und wieso willst du die ueberhaupt limitieren?



  • ich hab eine feste geschwindigkeit für die winkeländerung der servomotoren.
    ka. z.b. 360° in 1,5 sec. wenn ich jetzt eine festeframe rate die nie gebrochen wird einbauen kann, so 60fps. wäre es ja möglich das ganz simpel runterzubrechen, wie viel drehung pro durchlauf der schleife.

    ansonsten, würde ich die fps gerne bei 60 halten damit es nicht immer auf 100% läuft.

    wie aktiviere ich vsync?
    und was genau macht das?



  • Und was machst du auf einem Rechner der zu langsam ist um überhaupt auf 60 fps zu kommen? Miss besser die Zeit die der letzte Frame gedauert hat, dann weißt du wieviel du die Simulation weiterbewegen musst.



  • naja...
    also die software läuft mommentan auf meinem netbook mit mehr als 60fps^^
    1,6ghz dual.

    aber ich denke deine lösung ist da etwas intelligenter.
    wie genau realisiert man das?
    einfach clock();?
    zeit vor dem frame nehmen, dann nach der berechnung.
    t2-t1 -> usw?



  • Mach dir einfach eine stopwatch Klasse, so in etwa:

    // Hier mit C++11, kannst natürlich auch einfach clock() nutzen und float zurückgeben oder was du willst.
    // (Nicht vergessen dann durch CLOCKS_PER_SEC zu teilen, daher float oder double.)
    
    #include <chrono>
    
    class stopwatch
    {
    	std::chrono::time_point<std::chrono::high_resolution_clock> last_;
    public:
    	stopwatch()
    	{
    		reset();
    	}
    	void reset()
    	{
    		last_ = std::chrono::high_resolution_clock::now();
    	}
    	std::chrono::microseconds elapsed() const
    	{
    		auto t = std::chrono::high_resolution_clock::now();
    		return std::chrono::duration_cast<std::chrono::microseconds>(t - last_);
    	}
    	std::chrono::microseconds tick()
    	{
    		auto t = std::chrono::high_resolution_clock::now();
    		auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(t - last_);
    		last_ = t;
    		return elapsed;
    	}
    };
    

    Und dann einfach:

    stopwatch timer;
    
    while (window.is_open())
    {
      // ...
      simulation.tick(timer.tick());
    }
    


  • Danke dir!
    habs grade eben ähnlich nachgebaut, und funktioniert super!


Anmelden zum Antworten