[gelöst]OpenGL und QThreads

Alles rund um die Programmierung mit Qt
Antworten
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

[gelöst]OpenGL und QThreads

Beitrag von twessels »

Guten Abend,
es geht bei diesem Problem um eine 3D-Engine aus der Ego-Perspektive.
Es interessiert mich nur wie soetwas überhaupt gemacht wird, bin also kein Zocker oder jemand der mit Programmieren angefangen ist nur um ein Spiel zu coden.
Das Programm ist schon fertig, basiert aber derzeit auf einem QTimer der alle 20ms eine Funktion aufruft und die Dinge macht wie die folgende while-Schleife.

Das Grundgerüst sollte _stark vereinfacht_ so aussehen:
while(true)
{
lösche_bildschirm();
berechne();
render();
Thread.wait(25);
}


Damit die Bewegungen für alle Rechner gleich schnell ablaufen wird die Render-Dauer pro Frame berechnet und zu jede Bewegung multipliziert.
Beispiel:
Bewegungsgeschwindigkeit: 5
Render Dauer pro Frame: 17ms
Bewegungsgeschwindigkeit: 5 * 0.17 = 0.85

Mein Problem sind die Threads. Es sollte einen mainThread geben der die Aufgabe der while-Schleife übernimmt und einen renderThread der das Bild zeichnet.
Aber wie kann der renderThread auf meinem QGLWidget zeichnen?

Code: Alles auswählen

//Ist nur das Fenster mit dem glWidget als Inhalt
class window : public QWidget
{
 Q_OBJECT
 private:
   GLWidget *glWidget:
};


//hier passiert im Grunde alles: keyEvents, mouseEvents, OpenGL ...
class GLWidget : publicQGLWidget
{
 Q_OBJECT
 private:
  void initializeGL();
  void resizeGL();
  void paintGL();

  MainThread mainThread;
  RenderThread renderThread;
};



class MainThread : public QThread
{
  public:
  void run();
};



class RenderThread: plublic QThread
{
  public:
  void run(); 
};


GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent)
{
  connect(&renderThread, SIGNAL(finished()), &mainThread, SLOT(start()));

RenderThread::run()
{
  glRotate();      // wird nicht gehen
  pointerAufglWidget->glTranslate();  // ????
}
}



RenderThread::run() kann ja nicht auf glWidget`s private Variablen und Methoden zugreifen.
Aber irgendwie muss ich die OpenGL-Aufrufe doch in die run()-Funktion hineinbekommen?

Wäre dankbar für jede Hilfe.

MfG
Tobias
Zuletzt geändert von twessels am 24. Dezember 2007 00:49, insgesamt 1-mal geändert.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Nur der Main-Thread kann malen. Du kannst also nur Berechnungen in einen Thread auslagern.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

Beitrag von twessels »

Hallo,
müsste der mainThread dann nicht eigentlich vererbt werden?

Code: Alles auswählen

class GLWidget : public QGLWidget, QThread
{
  public:
  void run(); //hauptschleife
};

Wäre das überhaupt eine sinnvolle Lösung?
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

ARGH!
Guck dir mal die Thread und QGl Beispiele an. Und dann überleg dir was du gerade gepostet hast!
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

Beitrag von twessels »

Das war das Erste was ich gemacht habe.
Da ist die Sache aber auch wesentlich einfacher, da zum Rendern nur der Pointer auf ein QImage übergeben werden musste. Nix mit virtuellen Funktionen von OpenGL implementieren.
Ein richtig gutes Beispiel von OpenGL mit Threads gibt es nicht.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
mollitz
Beiträge: 81
Registriert: 5. April 2007 10:55

Beitrag von mollitz »

hey twessels!
ich steh grad genau vor dem gleichen problem!

schon ne lösung gefunden?

wenn ich eine finde, lass ichs dich wissen!
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Evtl. hilft euch das ja weiter: http://doc.trolltech.com/qq/qq06-glimpsing.html
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
mollitz
Beiträge: 81
Registriert: 5. April 2007 10:55

Beitrag von mollitz »

ja das hab ich auch schon gefunden und es tut auch teilweise
aber das mit dem resize funktioniert noch nicht so richtig
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

Beitrag von twessels »

Danke für den hilfreichen Link. Werde ich morgen mal mein Programm umschreiben...

@mollitz: Wir sollten mal ab und zu miteinander chatten und ein paar Ideen austauschen! ;] PN hab ich dir schonmal geschickt.

MfG
tobi
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

Beitrag von twessels »

Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Antworten