小编Aar*_*eis的帖子

SDL_PollEvent()空闲时口吃?

我使用SDL2在C++中拼凑了一个非常基本的游戏循环,我注意到每隔几秒,SDL_PollEvent似乎异常缓慢,即使什么也没发生.

我发送deltaTime来控制每个循环,它在SDL_PollEvent滞后的周期上差不多100ms.我已经通过移动我的计时器确认了这个功能,但我不确定在哪里进一步诊断问题.

我的循环:

while (!quit) {

    uint32_t startTime = SDL_GetTicks();

    while (SDL_PollEvent(&e) != 0) {
    std::cout << "Event: "<< e.type << std::endl; // Added later, read update
        if (e.type == SDL_QUIT) {
            quit = true;
        }
    }

    if (engine.AllowUpdate()) { // Restricts updates to every 20ms
        GameState::Update(); 
    }


    engine.rMan.BeginRender();
    //^v Literally just SDL_RenderClear and SDL_RenderPresent
    engine.rMan.FinishRender();

    engine.deltaTime = SDL_GetTicks() - startTime;
    std::cout << std::setw(10) << engine.deltaTime;
}
Run Code Online (Sandbox Code Playgroud)

控制台输出没有Vsync,请注意106.这是我的滞后:没有Vsync控制台输出

使用Vsync.请注意,滞后后的增量略短.不确定原因:Vsync控制台输出

我也注意到即使我没有调试也会发生这个问题,而且至少还有一台其他机器没有.任何有关如何进行的建议都将非常受欢迎.

编辑1:尝试打印以控制通过队列的所有事件,以查看其中一个是否导致问题.在上面的代码中添加了打印行.在有滞后的时候似乎没有发生任何事件,而我却无所事事.

编辑2:根据要求,一些可运行的代码,使用SDL 14在VS2017上使用SDL2-2.0.9构建:

#include <iostream>
#include <SDL.h>

void InitSDL();
void …
Run Code Online (Sandbox Code Playgroud)

c++ sdl game-engine sdl-2

13
推荐指数
1
解决办法
683
查看次数

标签 统计

c++ ×1

game-engine ×1

sdl ×1

sdl-2 ×1