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

时间:2017-06-11 15:13:02

标签: c sdl

当我试图理解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
  • 17代表SDL_VIDEOEXPOSE类型。
  • 16代表SDL_VIDEORESIZE类型。
  • 1代表SDL_ACTIVEVENT类型。

我知道启动SDL程序时会发生这样的事情:必须给窗口一个大小,并且必须给它一个可见性。但是我没有得到的是,在初始化窗口后,函数SDL_WaitEvent填充event这些事件。如果你查看我的代码,你可以看到它只会等待一个事件并在stderr中打印它的类型。启动程序后我没有触及任何内容,但是在event中创建并填充了3个事件。我在wiki和doc以及一些网站上看到了“队列”的概念,但它从未被解释过,所以我只能想象它可能与它有关,因为它看起来像是3个事件等待放入SDL_Event

我想知道发生了什么。为什么3个事件(始终相同且顺序相同)会显示并填充event

1 个答案:

答案 0 :(得分:2)

队列通常与异步事件接口一起使用。 Queue 是抽象数据容器类型的名称,可以存储一组其他类型(在此具体方案中:一组SDL_Event s),其中包含添加项目和检索的功能一个项目,并且检索功能(通常称为dequeue())始终返回(并删除)首先放入队列的项目。这也称为 FIFO 先进先出

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

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