gpt4 book ai didi

sdl - 在 SDL 中实现恒定的帧速率

转载 作者:行者123 更新时间:2023-12-04 00:51:16 26 4
gpt4 key购买 nike

我正在尝试制作一个以恒定帧速率运行的 SDL 程序。但是我发现即使我的程序滞后很多并且跳过了很多帧(即使它以低帧运行并且没有渲染太多)。

你们有什么建议可以让我的程序运行更流畅吗?

#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;
}

最佳答案

不要 sleep 。

相反,使用线性插值函数来计算每次通过主循环给定当前时间的位置。这样做将保证无论硬件如何, spaceship 都能同时到达目的地(尽管在快速机器上,您会看到更多的步骤)。

还有其他插值/混合功能(如线性缓入、缓出、二次缓入/缓出、三次等)用于其他很酷的效果。

看看这个链接:
Frame Rate Independent Linear Interpolation

关于sdl - 在 SDL 中实现恒定的帧速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2548541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com