I'm making a fractal renderer, so I'm not rendering in a loop, like in a game; I'm rendering only when I want to redraw the fractal. The problem is that on Windows, I always see the last render, not the latest one. For example, if I click and drag on the canvas, so as to zoom in, nothing happens. Then I do something that forces a repaint, and only then do I see the render.
When I want a render to occur, I call refresh().
Code: Select all
void Canvas::refresh() {
Refresh(false);
Update();
}
void Canvas::onPaint(wxPaintEvent&) {
wxPaintDC dc(this);
render(dc);
}
void Canvas::render(wxDC&) {
if (!IsShownOnScreen()) {
return;
}
SetCurrent(*m_context);
if (!m_renderer.isInitialised()) {
auto sz = GetSize();
m_renderer.initialise(sz.x, sz.y);
PostSizeEvent();
}
m_renderer.clear(255, 255, 255);
if (m_disabled) {
m_renderer.finish();
SwapBuffers();
return;
}
// Disgusting hack to force out stale render on Windows
#ifdef WIN32
m_renderer.drawMandelbrot(m_mouseDown || m_disableRender);
if (!m_disableRender) {
m_disableRender = true;
CallAfter([this]() { refresh(); });
}
else {
m_disableRender = false;
}
#else
m_renderer.drawMandelbrot(m_mouseDown);
#endif
if (m_mouseDown) {
int x = m_selectionRect.x;
int y = m_selectionRect.y;
int w = m_selectionRect.width;
int h = m_selectionRect.height;
m_renderer.drawSelectionRect(x, y, w, h);
}
m_renderer.finish();
SwapBuffers();
measureFrameRate();
m_onRender();
}