Ich versuche, ein SDL-Programm zu erstellen, das mit einer konstanten Bildrate ausgeführt wird. Allerdings finde ich das, obwohl mein Programm viel hinterherhinkt und viele Frames überspringt (obwohl es auf einem niedrigen Frame läuft und nicht viel rendert).Erzielen einer konstanten Bildrate in SDL
Haben Sie irgendwelche Vorschläge, um mein Programm reibungsloser laufen zu lassen?
#include "SDL.h"
#include "SDL/SDL_ttf.h"
//in milliseconds
const int FPS = 24;
const int SCREENW = 400;
const int SCREENH = 300;
const int BPP = 32;
void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination) {
SDL_Rect offset;
offset.x = x;
offset.y = y;
if(SDL_BlitSurface(source, NULL, destination, &offset) < 0) {
printf("%s\n", SDL_GetError());
}
}
int main(int argc, char* argv[]) {
//calculate the period
double period = 1.0/(double)FPS;
period = period * 1000;
int milliPeriod = (int)period;
int sleep;
SDL_Init(SDL_INIT_EVERYTHING);
TTF_Init();
TTF_Font* font = TTF_OpenFont("/usr/share/fonts/truetype/freefont/FreeMono.ttf", 24);
SDL_Color textColor = { 0x00, 0x00, 0x00 };
SDL_Surface* screen = SDL_SetVideoMode(SCREENW, SCREENH, BPP, SDL_SWSURFACE);
SDL_Surface* message = NULL;
Uint32 white = SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF);
SDL_Event event;
char str[15];
Uint32 lastTick;
Uint32 currentTick;
while(1) {
while(SDL_PollEvent(&event)) {
if(event.type == SDL_QUIT) {
return 0;
}
else {
lastTick = SDL_GetTicks();
sprintf(str, "%d", lastTick);
message = TTF_RenderText_Solid(font, str, textColor);
if(message == NULL) { printf("%s\n", SDL_GetError()); return 1; }
//the actual blitting
SDL_FillRect(screen, &screen->clip_rect, white);
apply_surface(SCREENW/2, SCREENH/2, message, screen);
currentTick = SDL_GetTicks();
//wait the appropriate amount of time
sleep = milliPeriod - (currentTick - lastTick);
if(sleep < 0) { sleep = 0; }
SDL_Delay(sleep);
SDL_Flip(screen);
}
}
}
TTF_CloseFont(font);
TTF_Quit();
SDL_Quit();
return 0;
}
Ich denke, es wäre eine gute Idee zu schlafen, um Batterien zu sparen. Interpolation ist gut und in einigen Spielen ist es gut, es trotzdem zu machen, aber wenn mein Spiel 60FPS während der Benutzung erreichen kann, sagen wir 20% der CPU, gibt es ABSOLUT keine Notwendigkeit schneller zu laufen, da das Display höchstwahrscheinlich mit 60Hz läuft trotzdem verschwende ich nur die Akkulaufzeit auf Notebooks und Geräten. –
@TomA Führt SDL nicht VSync durch, welches die Framerate sowieso kappt? –
Sie können zwischen drei Arten von V-Sync mit SDL 2.x wählen. Siehe SDL_GL_SetSwapInterval() – Michaelangel007