SDL2没有延迟渲染

时间:2016-03-13 23:59:26

标签: c++ rendering sdl sdl-2

这个简单的SDL2程序在我的系统上打开一个空窗口(即它没有渲染),除非我取消注释SDL_Delay行。

#include <SDL.h>

int main(int argc, char** argv) {

    constexpr unsigned width = 256, height = 256;

    if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        SDL_Log("Failed to initialize SDL: %s", SDL_GetError());
        return 1;
    }

    SDL_Window* window = SDL_CreateWindow("Test",
                                          SDL_WINDOWPOS_UNDEFINED,
                                          SDL_WINDOWPOS_UNDEFINED,
                                          width, height,
                                          0);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);

    SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
    SDL_RenderClear(renderer);
    // SDL_Delay(20);
    SDL_RenderPresent(renderer);

    bool quit{};
    SDL_Event event;
    while (!quit) {
        SDL_WaitEvent(&event);

        switch (event.type) {
        case SDL_QUIT:
            quit = true;
            break;
        }
    }

    SDL_Quit();

    return 0;
}

延迟时间必须大约为10-20毫秒或者没有任何显示,但它并不一致 - 如果它设置为10毫秒,它的工作时间大约是一半。

在阅读this answer之后,我添加了事件循环,但没有它我会得到相同的行为。 IRC上的#sdl上的用户已从相同的代码获得了预期的蓝屏。

知道这里发生了什么/我做错了什么?

1 个答案:

答案 0 :(得分:1)

您应该调用SDL_PollEvent()以避免阻塞绘图线程。

尝试以下方法:

while (!quit) {
    SDL_Delay(1000/25);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
    if(!SDL_PollEvent(&event)) continue;

    switch (event.type) {
    case SDL_QUIT:
        quit = true;
        break;
    }
}

或者,对于使用键盘和游戏手柄轮询的完整示例,编译并运行GPL游戏Rock Dodger SDL2 Compact Edition,然后查看其源代码(这只是一个小文件)。