Quick answer: Use clock.tick(60), not clock.tick_busy_loop(60). Or vsync via display flag.

Game runs at 60fps but laptop fan spins. CPU monitor shows one core pinned. tick_busy_loop is the culprit.

The Fix

clock = pygame.time.Clock()

while running:
    # ... events, update, render
    pygame.display.flip()
    clock.tick(60)   # sleeps; CPU friendly

# Alternative: vsync
screen = pygame.display.set_mode(
    (1280, 720),
    pygame.SCALED, vsync=1
)

tick yields CPU between frames. vsync delegates pacing to the display driver; even less CPU. tick_busy_loop only for cases where you need sub-ms timing precision.

Verifying

Task Manager / top: process CPU under 5% at 60fps. Compare with tick_busy_loop: ~95% one core.

“tick yields. busy_loop spins.”

Related Issues

For Clock vsync, see vsync. For mixer Channel, see channel.

tick yields. CPU breathes.