You could try the dirty rectangles method. Doing it well is a little more
complicated than double buffering, but it scales better to larger
resolutions in many cases.

Essentially, you draw to a hidden buffer just like you do with double
buffering. But instead of blitting the entire buffer to the screen at once,
you keep track of which rectangular regions of the buffer have changed
since the last frame, and only blit those regions to the screen.

This method is useful primarily if your animation consists of objects that
spread out over the screen. If you end up having to blit most of the
screen anyway, this won't help much and may even be slower than double
buffering.