[gelöst]OpenGL und QThreads
Verfasst: 23. September 2007 22:14
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?
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
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(); // ????
}
}
Aber irgendwie muss ich die OpenGL-Aufrufe doch in die run()-Funktion hineinbekommen?
Wäre dankbar für jede Hilfe.
MfG
Tobias