SDL2 不会无延迟地渲染

SDL2 does not render without a delay

本文关键字:延迟 SDL2      更新时间:2023-10-16

这个简单的 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 毫秒,它大约一半的时间有效。

阅读此答案后,我添加了事件循环,但是没有它,我得到了相同的行为。#sdl IRC 上的用户从相同的代码中获得了预期的蓝屏。

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

您应该调用 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,然后查看其源代码(只有一个小文件)。