C Probleme mit GTK2 und GTKGL

Photon

Commodore
Registriert
Apr. 2006
Beiträge
5.039
Hallo Community,

ich habe eine nette kleine Simulation für die Effekte der speziellen Relativitätstheorie ausgegraben, letztes Update vom Entwickler im Jahre 2001, basierend auf dem uralten GTK+: http://lightspeed.sourceforge.net/

Nachdem ich zum Jahreswechsel etwas Freizeit habe, dachte ich, ich versuche mich mal daran, das Programm auf GTK2 oder sogar GTK3 zu portieren. Das Portieren auf GTK2 ging mit überschaubaren Änderungen vonstatten und das Programm lässt sich nun gegen GTK2 kompilieren, linken und ausführen. Allerdings gibt es zwei Probleme mit der OpenGL-Ausgabe:

1. Das Programm lastet einen der CPU-Kerne voll aus. Das war in der alten GTK+-Version nicht so.
2. Animationen werden oft nur abgespielt, während die Maus bewegt wird, Alt+Tab benutzt wird oder der Bildschirminhalt sonst wie verändert wird.

An dem OpenGL-Teil habe ich nur wenige Zeilen verändert: Einige Aufrufe von

C:
gtk_gl_area_endgl()

mussten entfernt werden. Um das Problem 2 anzugehen, habe ich versucht an diese Stellen Aufrufe von

C:
gtk_widget_queue_draw()

und

C:
glFlush()

zu setzen. Erstere schienen die Häufigkeit von eingefrorenen Animationen reduziert zu haben, letztere scheinen keinen Effekt zu haben.

Ich kann gerne die ganze Funktion vor und nach meinen Änderungen anhängen oder auch die ganze Datei (ca. 600 Zeilen) -- was immer ihr für nötig erachtet. Ein Minimalbeispiel kriege ich wohl nicht hin, da ich keine Ahnung habe, wie der Code funktioniert. :D Habe noch nie mit OpenGL oder GTK gearbeitet und C kenne ich auch nur dank einem zweiwöchigen C++-Kurs vor bald zehn Jahren. Bin also schon überrascht, dass ich es so weit gebracht habe mit dem Port, aber die beiden Probleme von oben sind da wohl zu harte Nüsse...

Frohe Weihnachten und schon mal einen guten Rutsch ins neue Jahr!
Photon
 
Ich habe nun versucht dem ersten Problem nachzugehen und einen Profiler drüber laufen lassen.

GTK+-Version (wenig CPU-Last):

gprof.png


GTK2-Version (ein Kern voll ausgelastet):

gprof.png


Warum alle Funktionen etwa doppelt so oft aufgerufen werden und read_system_clock in der GTK+-Version nicht auftaucht, in der GTK2-Version hingegen gleich mit über einer Million Aufrufe -- keine Ahnung...
 
Offenbar liegt das Problem woanders: Die Funktion, die für die Aktualisierung aller Variablen und der Bildschirmausgabe zuständig ist, prüft an einer Stelle, ob noch ein GTK-Event aktiv ist, bei der GTK2-Version ergibt diese Prüfung aus irgendeinem Grund "TRUE", bei der GTK+-Version aber "FALSE". Ich wollte also bei der GTK2-Version mehr über das aktive Event erfahren, kam aber darauf, dass es NULL ist:

C:
if (gtk_events_pending( ) == 0) {
  fprintf(stderr, "gtk_events_pending=0\n");
} else {
  fprintf(stderr, "gtk_events_pending=1\n");
  if ( gtk_get_current_event () == NULL ) {
    fprintf(stderr, "current event is NULL\n");
  }
}

gibt bei der GTK2-Version

Code:
gtk_events_pending=1
current event is NULL

und bei der GTK+-Version

Code:
gtk_events_pending=0

Da ist also ein Event aktiv, ist aber NULL, kapiere ich nicht...
 
Zurück
Oben