Diesen Code habe ich gerade mal in mein Spiel reingehackt, ist halt so oder so eine Quick&Dirty-Lösung weswegen ich an deiner Stelle als nächstes gescheite zeitunabhängige Anmationen implementieren würde (das MUSS gehen, und schwierig isses auch nicht):
Code:
//Plattformkompatibilität
#if defined(_MSC_VER) || defined(_WINDOWS_)
#include <time.h>
#if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)
struct timeval
{
long tv_sec;
long tv_usec;
};
#endif
#else
#include <sys/time.h>
#endif
#if defined(_MSC_VER) || defined(_WINDOWS_)
int gettimeofday(struct timeval* tv, void *timezone)
{
union {
long long ns100;
FILETIME ft;
} now;
GetSystemTimeAsFileTime (&now.ft);
tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);
return (0);
}
#endif
[...]
//Initialisierung des Spiels
timeval lastframe;
gettimeofday(&lastframe, 0);
maxfps = 100;
[...]
//Hauptschleife o.ä.
if (maxfps)
{
timeval currtime;
for(;;)
{
gettimeofday(&currtime, 0);
int difference = currtime.tv_usec - lastframe.tv_usec;
if (difference < 0) difference += 1000000;
if ((float)difference > (float)1000000 / maxfps) break;
}
}
gettimeofday(&lastframe, 0);
Der Code läuft bei mir bis auf 1% Abweichung genau, ich habe ihn nur unter Linux ausgetestet.
Da der Code so nichts anderes macht, als CPU-Zeit zu verpulvern, werde ich ihn auch sofort wieder aus meinem Spiel rausschmeißen, war mehr so ein PoC, dass ein einigermaßen genauer Framelimiter möglich ist...
Aber evtl reicht das ja für deine Zwecke...