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

标签 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 中打印它之外什么也没做。启动程序后我没有触及任何东西,但创建了 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/

相关文章:

c -/usr/local/lib 中的子文件夹?

c - 在 POSIX 中,为什么不能将单个 condvar 与多个互斥量一起使用?

c++ - SDL 的事件处理错误

rust - SDL2如何安装和使用 "gfx"功能

c++ - 使用 SDL2 平滑(惯性)滚动?

C 对字符串数组进行排序

c - 使用本地工作组的 OpenCL 中值图像滤波器

C 编程-从 char * 转换为 char 数组?

c - gcc 不会编译 SDL C 程序(对 SDL 函数的 undefined reference )

c++ - 使用 SDL 和 glew 时 Qt Creator 中出现 undefined reference 错误