Before I implement SDL2 rendering, it’s worth reminding ourselves what FPS actually is and how it is measured as this is the metric I’ll be using to benchmark performance. It’s important because you can’t compare FPS gain from 30 to 60 against a gain 300 to 330.
FPS (Frames Per Second) refers to how many frames are displayed in one second. The frame-to-frame time interval (Δt) in milliseconds (ms) is given by: Δt = 1000/FPS, where 1000 ms is one second.
This relationship is non-linear because FPS is inversely proportional to Δt. As FPS increases, the frame interval decreases, but not at a constant rate—it follows a hyperbolic curve.
Example Values:
FPS | Frame Interval (ms) |
---|---|
30 | 33.33 |
60 | 16.67 |
120 | 8.33 |
240 | 4.17 |
As FPS doubles, the interval does not decrease linearly but rather halves.

- Going from 30 → 60 FPS reduces frame time by ~16.67 ms
- To get the same relative (2x) improvement later, you’d need to jump from 60 → 120 FPS
- Further down, you’d need 120 → 240 FPS to see the same kind of % gain
This shows that FPS improvements have diminishing returns—doubling FPS consistently halves the frame interval, but the perceived smoothness improvement is less noticeable at higher FPS levels.

This is why jumping from 30 to 60 FPS feels like a huge improvement, but going from 120 to 240 FPS is much less dramatic.
This will be important when comparing pygame’s blitting vs pygame’s SDL2 vs OpenGL rendering.