当我试图了解事件在 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
中打印它之外什么也没做。启动程序后我没有触及任何东西,但创建了 3 个事件并填充到 event
中。我在维基、文档和一些网站上看到了“队列”的概念,但从未对其进行解释,所以我只能想象它可能与它有关,因为这 3 个事件看起来是 等待被放入 SDL_Event
中。
我想知道发生了什么。为什么 3 个事件总是以相同的顺序出现并填充 event
?
最佳答案
队列通常与异步 事件接口(interface)一起使用。 Queue 是一个抽象数据容器类型的名称,它可以存储一组其他类型(在这个具体场景中:一组 SDL_Event
),具有添加一个函数的功能item 和检索项目,检索函数(通常称为 dequeue()
)总是返回(并删除)第一个放入队列的项目。这也称为 FIFO:先进先出。
SDL_WaitEvent()
与普通的 dequeue()
操作非常相似(用于从队列中检索项目),唯一的区别是它将等待一个事件如果队列中没有任何内容。
因此,您看到的 3 个事件是在初始化期间创建的,并且在您调用 SDL_WaitEvent()
时已经在队列中等待;它们不会突然“出现”。它们在那里是因为可能有理由对新窗口的创建或调整大小使用react。
关于c - 为什么 SDL 使 3 个事件提前发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44485362/