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 语句中做的,所以我不得不把函数调用放在那里。