glutTimerFunc 1000ms bug [solved]

Benutzeravatar
vwm
Mausschubser
Mausschubser
Beiträge: 94
Registriert: 7. Mai 2007 09:42
Wohnort: Rodenbach

glutTimerFunc 1000ms bug [solved]

Beitrag von vwm »

Ich hab ein eigenartiges Problem mit GLUT:
Sobald zur Programmlaufzeit die Bildwiederholrate über glutTimerFunc auf über 1fps (<1000ms) gesetzt wird, stürzt der Thread, der den Callback aufruft, ab (vermutlich - eine Fehlermeldung gibt es nicht, und die Schleife lässt sich nach Erhöhung des Wiederholintervalls auf >= 1000 wieder starten). 1000ms funktionieren (meistens), 990ms nicht mehr.
Hat irgendjemand eine Idee, woran das liegen könnte? GLEW und GLUT hab ich selbst gebaut (msvc), Grafikkartentreiber sind aktuell, OS ist Windows 7 x64.
Zuletzt geändert von vwm am 9. Nov 2011 21:17, insgesamt 1-mal geändert.
a tiger can smile
a snake will say it loves you
lies make us evil

Benutzeravatar
vwm
Mausschubser
Mausschubser
Beiträge: 94
Registriert: 7. Mai 2007 09:42
Wohnort: Rodenbach

Re: glutTimerFunc

Beitrag von vwm »

Hab das Problem gelöst. Es handelt sich um einen Rundungsfehler in gluts (3.7.6) win32_util.c, der dafür sorgt, dass Timer-Ereignisse in der Warteschlange mit falschen Zeitwerten im Mikrosekundenbereich gespeichert werden.
Es gibt hier eine für mich nicht funktionierende Lösung, daher für alle, denen der Fehler auch unterkommt, eine Alternative: Folgender Code ersetzt dabei die Funktion gettimeofday() in win32_util.c:

Code: Alles auswählen

int
gettimeofday(struct timeval* tp, void* tzp)
{
  LARGE_INTEGER t;
  if(QueryPerformanceCounter(&t)) {
    /* hardware supports a performance counter */
    LARGE_INTEGER f;
    double frc;
    QueryPerformanceFrequency(&f);
    frc = ((double)t.QuadPart/f.QuadPart);
    tp->tv_sec = (long)frc;
    tp->tv_usec = (frc - tp->tv_sec)*1000*1000;
  } else {
    /* hardware doesn't support a performance counter,
       so get the time in a more traditional way. */
    DWORD t;
    t = timeGetTime();
    tp->tv_sec = t / 1000;
    tp->tv_usec = (t % 1000)*1000;
  }

  /* 0 indicates that the call succeeded. */
  return 0;
}
a tiger can smile
a snake will say it loves you
lies make us evil

Antworten

Zurück zu „Archiv“