Since debugging is easier with a single thread, the frame rate isn't always reaching 60 while working on it. I figured frame rate is more important than resolution. This is actually super easy because of how I implemented rendering. The buffer isn't even a 2D array, it's just one big memory block, so I can change resolution to whatever I want whenever I want. So if a frame renders too slowly to maintain the frame rate, the next frame is slightly smaller. If it's significantly faster than it needs to be, it increases resolution. This makes the frame rate extremely stable. The hardware is responsible for scaling the render to fit the screen, which is the only part of the pipeline done in hardware.
I also put the renderer on it's own window, so that I can view the 3D and the map at the same time.
You should probably not judge on the last frame, but on the worst frame in the last (couple of ?) second or something like that, to get less jittering.