为什么 SDL 使 3 个事件提前发生?

Why does SDL makes 3 events occur early?

当我试图了解事件在 SDL 中的工作原理时,我注意到在我的测试程序中总是有 3 个事件发生在早期。以下代码打印每个事件的类型。

int main(int argc, char **argv)
{
    int on = 1;
    SDL_Surface *screen = NULL;
    SDL_Event event;

    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WaitEvent(&event);
    fprintf(stderr, "%d\n", event.type);
    SDL_WaitEvent(&event);
    fprintf(stderr, "%d\n", event.type);
    SDL_WaitEvent(&event);
    fprintf(stderr, "%d\n", event.type);
    SDL_Quit();
}

输出:

17
16
1

我知道启动 SDL 程序时会发生这样的事情:window 必须指定大小并且必须指定可见性。但我不明白的是,为什么在初始化 window 之后,函数 SDL_WaitEvent 会用这些事件填充 event。如果您查看我的代码,您会发现它除了等待事件并在 stderr 中打印它之外什么也没做。启动程序后我没有触及任何东西,但创建并填写了 3 个事件 event。我在维基、文档和一些网站上看到了 "queue" 的概念,但从未对其进行解释,所以我只能想象它可能与它有关,因为看起来这 3 个事件是 正在等待 放入 SDL_Event.

我想知道发生了什么。为什么 3 个事件总是以相同的顺序出现并填充 event?

队列通常与异步事件接口一起使用。 Queue 是一个抽象数据容器类型的名称,它可以存储一组其他类型(在这个具体场景中:一组 SDL_Events),具有添加函数的功能item 和检索项目,检索函数(通常称为 dequeue())总是 returns(并删除)第一个放入队列的项目。这也称为 FIFO先进先出

SDL_WaitEvent() 与正常的 dequeue() 操作非常相似(用于从队列中检索项目),唯一的区别是如果队列中没有任何内容,它将等待事件。

因此,您看到的 3 个事件是在初始化期间创建的,并且在您调用 SDL_WaitEvent() 时已经在队列中等待;他们不是突然"appear"。它们在那里是因为 可能 有理由对创建新的 window 或调整其大小做出反应。