Images are loaded once into Surfaces with pygame.image.load(), converted for fast blitting, then transformed (scale/rotate/flip) via pygame.transform — which always returns a new Surface rather than modifying the original.
1-B 2-B 3-B 4-B | 5 flip 6 disk-read 7 = .convert() is for opaque images; .convert_alpha() preserves per-pixel transparency for images with alpha channels 8 = rotating every frame is CPU-expensive; pre-generating a list of rotated frames once trades a bit of memory for much better runtime speed 9 = load every image once at startup into a dictionary keyed by name, then reference that dictionary everywhere instead of reloading from disk | 10 = (a) load a separate pre-drawn left-facing image, or (b) use pygame.transform.flip(img, True, False) on the right-facing image once and cache the result — option (b) is more efficient since it avoids managing double the art assets and only flips once, not every frame