SDL 滞后/超慢 (SDL 2.0.14)
SDL Lag / Super slow (SDL 2.0.14)
我有一个游戏循环,可以测量完成游戏所需的毫秒数。
在进入循环之前,我调用了一个“Init”函数,它看起来像这样:
void screen::Init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
m_window = SDL_CreateWindow("TITLE", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH*SIZE, HEIGHT*SIZE, NULL);
m_renderer = SDL_CreateRenderer(m_window, -1, NULL);
if(m_renderer)
SDL_SetRenderDrawColor(m_renderer, 0,0,0,0);
m_Texture = SDL_CreateTexture(m_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, WIDTH, HEIGHT);
}
}
问题是,当我调用函数时,一次循环执行需要 70 到 90 毫秒!
如果我离开“init”函数调用(所以没有 window 显示)它只有 2-4 毫秒。
除了调用如下所示的一个函数外,循环什么也不做:
void screen::handleEvents()
{
SDL_PollEvent(&m_event);
switch(m_event.type)
{
case SDL_QUIT:
screen->Clean();
break;
default:
break;
}
}
离开 handleEvents 函数会导致 0-2 毫秒,但 window 在我单击它时崩溃。
不确定我做错了什么但我很确定它不应该减慢到 ~10 FPS 哈哈
这是代码的其余部分:
#define SIZE 5
#define WIDTH 150
#define HEIGHT 150
int main(int argc, char* argv[])
{
screen* screen = new class screen;
screen->Init();
while(screen->running)
{
screen->execute();
}
return 0;
}
void screen::execute()
{
if(currline == 1 && Time == 0)
start = SDL_GetTicks();
if(Time > 0)
Time--;
else
counter();
handleEvents();
if(currline == 151 && Time == 0)
{
end = SDL_GetTicks();
printf("s: %8d e: %8d r: %d\n", start, end, end-start);
}
}
void screen::counter()
{
if(currline > 150)
currline = 255;
currline++;
Time = 500;
};
好的,找到它滞后的原因了:
我每次执行循环(每秒几千次)时都会调用 handleevent,而不是在这个 if 语句中执行:
if(currline == 151 && Time == 0)
{
end = SDL_GetTicks();
printf("s: %8d e: %8d r: %d\n", start, end, end-start);
}
if 语句用于将整个事情“限制”到特定的帧率 :)
通常你会在整个循环结束时休眠以获得每秒 60 次执行,但因为我是在这个 if 语句中做的,所以我不得不把函数调用放在那里。
我有一个游戏循环,可以测量完成游戏所需的毫秒数。 在进入循环之前,我调用了一个“Init”函数,它看起来像这样:
void screen::Init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
m_window = SDL_CreateWindow("TITLE", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH*SIZE, HEIGHT*SIZE, NULL);
m_renderer = SDL_CreateRenderer(m_window, -1, NULL);
if(m_renderer)
SDL_SetRenderDrawColor(m_renderer, 0,0,0,0);
m_Texture = SDL_CreateTexture(m_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, WIDTH, HEIGHT);
}
}
问题是,当我调用函数时,一次循环执行需要 70 到 90 毫秒! 如果我离开“init”函数调用(所以没有 window 显示)它只有 2-4 毫秒。
除了调用如下所示的一个函数外,循环什么也不做:
void screen::handleEvents()
{
SDL_PollEvent(&m_event);
switch(m_event.type)
{
case SDL_QUIT:
screen->Clean();
break;
default:
break;
}
}
离开 handleEvents 函数会导致 0-2 毫秒,但 window 在我单击它时崩溃。
不确定我做错了什么但我很确定它不应该减慢到 ~10 FPS 哈哈
这是代码的其余部分:
#define SIZE 5
#define WIDTH 150
#define HEIGHT 150
int main(int argc, char* argv[])
{
screen* screen = new class screen;
screen->Init();
while(screen->running)
{
screen->execute();
}
return 0;
}
void screen::execute()
{
if(currline == 1 && Time == 0)
start = SDL_GetTicks();
if(Time > 0)
Time--;
else
counter();
handleEvents();
if(currline == 151 && Time == 0)
{
end = SDL_GetTicks();
printf("s: %8d e: %8d r: %d\n", start, end, end-start);
}
}
void screen::counter()
{
if(currline > 150)
currline = 255;
currline++;
Time = 500;
};
好的,找到它滞后的原因了:
我每次执行循环(每秒几千次)时都会调用 handleevent,而不是在这个 if 语句中执行:
if(currline == 151 && Time == 0)
{
end = SDL_GetTicks();
printf("s: %8d e: %8d r: %d\n", start, end, end-start);
}
if 语句用于将整个事情“限制”到特定的帧率 :)
通常你会在整个循环结束时休眠以获得每秒 60 次执行,但因为我是在这个 if 语句中做的,所以我不得不把函数调用放在那里。