Salut !
Alors, je voudrais réagir :
" png font rammer mon programme... à moooort"
--> FAUX, et archi faux.
Je m´explique, et ça me donne une piste :
Quand tu charges une image, que ce soit une BMP, une PNG, ou une JPG, ou une truc_chose gérée par SDL_Image ou autres, a la sortie, la SDL_Surface* est LA MEME : c´est un bitmap.
Son cout en mémoire est de X*Y*4 octets si ton image est 32 bits + 1 partie header de structure négligeable, donc ça ne prend pas 150 Mo de RAM pour une BMP de 8 Mo, mais bien a peu pres 8 Mo.
La ou le PNG peut etre plus lent, c´est au chargement : car il y a, pendant le chargement, une phase de décompression. Mais j´insiste : a la fin du chargement, que tu aies chargé une BMP ou une PNG, ça revient au meme.
Donc, en toute logique, je me dis que, si ça rame quand tu charges des PNG, sous entendu, dans le jeu, ça veut dire que tu charges des images PENDANT le jeu, autrement dit dans la boucle principale : vérifie cela.
Si c´est le cas, ça explique un effondrement effroyable de mémoire, et ça explique ça rame.
Donc pense bien a charger tes images AVANT de lancer la boucle principale, de façon a ce que tes images, en RAM ou en VRAM, soient bcp + rapides d´acces ( l´acces au disque dur doit etre 1000 fois plus lent que l´acces en RAM, et je ne te parle meme par de la différence avec la VRAM...)
Déja, vérifie ça.
Si tu as bcp d´images a charger, dis toi qu´elles n´auront peut etre pas toute le privilege d´aller en VRAM : assure une priorité : au lieu de charger dans n´importe quel ordre, charge d´abord celles qui doivent absolument etre en VRAM...
Ensuite, pour les collisions, si tu dis que, en les enlevant, ça ne ralentit par vraiment +, ça veut dire que tu ne forces pas trop a ce niveau, ce n´est donc pour le moment pas fondamental de trop optimiser cette partie ( peut etre plus tard)
Ensuite, il faut voir les choses, un point :
Des fois on a l´impression que ça rame, alors que non :
Je m´explique :
si tu es en 800*600 par exemple. Et que tu décides de bouger ton sprite de 1 pixel en X par frame :
ton sprite ira tout doucement. Tu te diras : ça rame ! alors qu´en fait, tu seras peut etre a 50 frames par secondes ( ce qui ne rame pas du tout ! )
Mais calcule : pour faire 800 pixels, a 1 pixel par frame, ça fait 800 frames. Et a 50 frames par secondes, tu mettras 16 secondes a traverser...
ça rame ? non ça avance 
--> faut juste avancer de + de pixels a la fois
Bon j´arrete le roman pour le moment, vérifie bien tes chargement d´images : JAMAIS pendant la boucle.