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