Seite 1 von 1

[gelöst]OpenGL und QThreads

Verfasst: 23. September 2007 22:14
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

Verfasst: 24. September 2007 08:23
von macman
Nur der Main-Thread kann malen. Du kannst also nur Berechnungen in einen Thread auslagern.

Verfasst: 24. September 2007 09:14
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?

Verfasst: 24. September 2007 09:40
von CaptnChaos
ARGH!
Guck dir mal die Thread und QGl Beispiele an. Und dann überleg dir was du gerade gepostet hast!

Verfasst: 25. September 2007 11:48
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.

Verfasst: 20. Oktober 2007 01:49
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!

Verfasst: 20. Oktober 2007 13:18
von Volker
Evtl. hilft euch das ja weiter: http://doc.trolltech.com/qq/qq06-glimpsing.html

Verfasst: 27. Oktober 2007 12:24
von mollitz
ja das hab ich auch schon gefunden und es tut auch teilweise
aber das mit dem resize funktioniert noch nicht so richtig

Verfasst: 29. Oktober 2007 21:56
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

Verfasst: 24. Dezember 2007 00:47
von twessels