为什么 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
- 17代表类型
SDL_VIDEOEXPOSE
.
- 16代表类型
SDL_VIDEORESIZE
.
- 1代表类型
SDL_ACTIVEVENT
.
我知道启动 SDL 程序时会发生这样的事情:window 必须指定大小并且必须指定可见性。但我不明白的是,为什么在初始化 window 之后,函数 SDL_WaitEvent
会用这些事件填充 event
。如果您查看我的代码,您会发现它除了等待事件并在 stderr
中打印它之外什么也没做。启动程序后我没有触及任何东西,但创建并填写了 3 个事件 event
。我在维基、文档和一些网站上看到了 "queue" 的概念,但从未对其进行解释,所以我只能想象它可能与它有关,因为看起来这 3 个事件是 正在等待 放入 SDL_Event
.
我想知道发生了什么。为什么 3 个事件总是以相同的顺序出现并填充 event
?
队列通常与异步事件接口一起使用。 Queue 是一个抽象数据容器类型的名称,它可以存储一组其他类型(在这个具体场景中:一组 SDL_Event
s),具有添加函数的功能item 和检索项目,检索函数(通常称为 dequeue()
)总是 returns(并删除)第一个放入队列的项目。这也称为 FIFO:先进先出。
SDL_WaitEvent()
与正常的 dequeue()
操作非常相似(用于从队列中检索项目),唯一的区别是如果队列中没有任何内容,它将等待事件。
因此,您看到的 3 个事件是在初始化期间创建的,并且在您调用 SDL_WaitEvent()
时已经在队列中等待;他们不是突然"appear"。它们在那里是因为 可能 有理由对创建新的 window 或调整其大小做出反应。
当我试图了解事件在 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 程序时会发生这样的事情:window 必须指定大小并且必须指定可见性。但我不明白的是,为什么在初始化 window 之后,函数 SDL_WaitEvent
会用这些事件填充 event
。如果您查看我的代码,您会发现它除了等待事件并在 stderr
中打印它之外什么也没做。启动程序后我没有触及任何东西,但创建并填写了 3 个事件 event
。我在维基、文档和一些网站上看到了 "queue" 的概念,但从未对其进行解释,所以我只能想象它可能与它有关,因为看起来这 3 个事件是 正在等待 放入 SDL_Event
.
我想知道发生了什么。为什么 3 个事件总是以相同的顺序出现并填充 event
?
队列通常与异步事件接口一起使用。 Queue 是一个抽象数据容器类型的名称,它可以存储一组其他类型(在这个具体场景中:一组 SDL_Event
s),具有添加函数的功能item 和检索项目,检索函数(通常称为 dequeue()
)总是 returns(并删除)第一个放入队列的项目。这也称为 FIFO:先进先出。
SDL_WaitEvent()
与正常的 dequeue()
操作非常相似(用于从队列中检索项目),唯一的区别是如果队列中没有任何内容,它将等待事件。
因此,您看到的 3 个事件是在初始化期间创建的,并且在您调用 SDL_WaitEvent()
时已经在队列中等待;他们不是突然"appear"。它们在那里是因为 可能 有理由对创建新的 window 或调整其大小做出反应。