Thanks for answering.
Basically, I am separating rendering and updating to have fixed-timestep updating (for physics etc) as well as as-fast-as-possible rendering with time interpolation. (Heavily heavily inspired from Gaffer on Games article)
My code looks as follows (only slightly simplified):
... within my OpenGLContext
const double delta = 1.0 / fixedUpdatesPerSecond;
auto time = QDateTime::currentMSecsSinceEpoch();
double accumulated = 0.0;
while (! this->terminate)
auto newTime = QDateTime::currentMSecsSinceEpoch();
double frameExecution = tdiff(time, newTime);
time = newTime;
accumulated += frameExecution;
while (accumulated >= delta)
// Handle user input / system polling
//However, since Qt has event driven polling, let's just call processEvents and then handle any input events by putting their results into a map.
// Update our states
accumulated -= delta;
this->render(accumulated / delta);
In the same class, I have updateState and render:
void MyGL::updateState(float delta)
//... Bunch of commented-out code to make sure base loop works first
cam->translateAlongForward(delta * 3.0);
void MyGL::render(float aheadAlphaPercent)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// a lot of other drawing stuff
I know that my rendering code itself works because I initially tested it by just using a QTimer.
Instead, I now do the following:
QApplication a(argc, argv);
... MainWindow::start (MainWindow is QMainWindow subclass)...
uiElements->glWindow->gameLoop(); //glWindow is subclass of OpenGLContext
As you can see, I tried to avoid calling Qt's blocking event loop in QApplication::exec, but am still polling events. However, this doesn't work properly, as described in my first post.