gpt4 book ai didi

c++ - SDL_PollEvent 深入

转载 作者:行者123 更新时间:2023-11-28 02:56:15 26 4
gpt4 key购买 nike

这是SDL2代码的一部分

SDL主函数

int main(int argc,char *argv[])
{
...
...
bool quit=false;
SDL_Event e;
while(!quit) ///First while (say)
{
while(SDL_PollEvent(&e)) ///Second while (say)
{
if(e.type==SDL_QUIT)
{
quit=true;
}
handleEvent(e) ;///Function for executing certain event
}

...
SDL_RenderPresent((SDL_Renderer)renderer);
}

}

我的问题是,这个 SDL_PollEvent() 实际上做了什么,假设发生了一个事件,执行是否从第二个 while() 开始并调用 SDL_RenderPresent() 或者它等待所有事件进行轮询然后SDL_RenderPresent() 被调用了,我完全糊涂了?

最佳答案

上面是一个很常见的单线程事件循环:

基本上,应用程序总是在外部 while 循环中。为了获得最流畅的用户体验,我们尝试将此循环保持在 17 毫秒以下(对于每秒 60 帧的速率)

每个“帧”都以响应队列中等待的所有事件(内部 while)开始:

        while(SDL_PollEvent(&e)) ///Second while (say)
{
if(e.type==SDL_QUIT)
{
quit=true;
}
handleEvent(e) ;///Function for executing certain event
}

事件是来自操作系统的通知,表明发生了某些事情。可能是窗口正在关闭 SDL_QUIT 或者鼠标被移动了。您必须响应这些事件,应用程序才能响应。通常响应是更改应用程序的状态。

例如,我们可能会看到 left-mouse is down 事件,我们可能会发现鼠标按钮“下方”的内容并表明它现在已被选中。这通常只是找到对象并调用将更改其状态的函数。所有的变化都是指示对象现在已被选中的 bool 值。

也许移动鼠标需要改变下一帧的视角,所以我们将更新存储我们正在看的方向的 vector 。所以我们更新内存中的 vector 。

您可能有很长一段时间事件队列是空的,应用程序没有任何事件要处理。并且可能会有一连串的事件(例如用户移动鼠标),您将在其中获得大量事件来响应。

SDL_PollEvent 不会“等待”事件。如果队列中有事件,您将获得信息。如果没有事件,它将返回 false。
处理事件应该很快完成(记住我们必须在 17 毫秒内完成)不要担心这在 PC 上需要很多时间。

完成所有事件并退出内部循环后,您就可以继续更新世界和渲染了。在这一点上,你通常会做像人工智能这样的事情。调用物理引擎。例如,您可以遍历对象并根据它们的速度更改它们的位置。

下一步是实际绘制。

        SDL_RenderClear(renderer);
...
SDL_RenderPresent((SDL_Renderer)renderer);

第一次调用会清除屏幕。然后你去根据不同对象的状态进行渲染。例如,可能因为我们将对象状态更改为选中,所以我们现在将在其周围绘制一个发光的边框。

最后调用 SDL_RenderPresent(renderer) 向用户呈现新屏幕

如果您正在使用 Vsync(非常常见),那么这个最后的调用将隐藏一小段等待时间来同步屏幕更新与显卡功能。这将产生更平滑的图形。假设刷新率为 60Hz(每秒 60 帧)并假设您在帧渲染逻辑中的运行时间低于 16.6 毫秒,应用程序将等待剩余的时间。

现在应用程序准备好返回循环的开始并检查 SDL_PollEvent 中是否有任何事件。由于整个循环通常只需要几毫秒,因此应用程序总是会感觉响应迅速。

关于c++ - SDL_PollEvent 深入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com