Nie dość ,że skalujesz powierzchnię to jeszcze ją blitujesz na ekran co zżera ci większą ilość FPS. Na dodatek znajduje się to w głównej pętli. Ja bym proponował zrobić tak:
Daj
SDL_BlitSurface( ScaleSurface(ekran,640,480),NULL,print, & dest);
poza główną pętle(na sam początek).
usuń te trzy linijki
SDL_Flip(print);
Uint32 colorkey = SDL_MapRGB(ekran->format,70,70,70);
SDL_FillRect(ekran,NULL,colorkey);
Spodziewam się ,że chcesz przesuwać kamerą po mapie. Tutaj nie ma wyboru musisz narysować czworokąt znajdujący się w innym miejscu mapy. Najpierw zrób sobie funkcję:
Kopiuj
SDL_Surface * backupDisplay(int x1, int y1, int w1, int h1)
{
SDL_Surface * bb;
bb = createSurface(0,0,0,w1,h1);
SDL_Rect rct;
rct.x = x1;
rct.y = y1;
rct.w = w1;
rct.h = h1;
applySurface(0,0,video,bb, &rct); //kopiujemy kawałek bufora ekranu do powierzchni zapasowej
return bb;
}
Tworzy ona powierzchnię zapasową ekranu(będzie ona potrzebna do przywracania fragmentów ekranu). Załóżmy że będziesz się chciał poruszać po mapie strzałkami. Jeśli będziesz chciał przesunąć kamerę w inne miejsce to musisz tylko blitować właściwy kawałek powierzchni mapy na ekran dzięki czemu zostanie zatarty stary kawałek mapy(nie musisz już używać SDL_FillRect do czyszczenia ekranu). Później odśwież cały ekran. Zauważ że ekran będzie się cały odświeżał tylko jak będziesz poruszał się po mapie. Podam teraz przykład poruszania się postaci po mapie:
Jak wklejasz powierzchnię(np bitmapę) na bufor ekranu to najpierw musisz utworzyć powierzchnię zapasową dokładnie tego miejsca na ekranie gdzie będziesz wklejał ową bitmapę. Później jak będziesz chciał przesunąć postać w inne miejsce to wklejasz powierzchnię zapasową ekranu którą wcześniej zapamiętałeś i blitujesz postać w inne miejsce na ekranie(oczywiście uprzednio zapamiętując powierzchnię "backupową" ekranu). Następnie wystarczy odświeżyć funckją UpdateRect dwa miejsca stare i nowe gdzie znajdowała się postać.(zauważ ,że nie musisz odświeżać całego ekranu tylko miejsca które zostały zmienione) Tak właśnie możesz osiągnąć maksymalną wydajność w SDL. Ogólnie mówiąc powinieneś zauważyć ,że nie czyścisz już całego ekranu i odświeżasz go cały czas na daremnie. Tylko robisz to wtedy kiedy jest to konieczne.