SDL_PollEvent深入

时间:2014-02-20 16:18:05

标签: c++ sdl

以下是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(),我完全糊涂了吗?

1 个答案:

答案 0 :(得分:2)

以上是一个非常常见的单线程事件循环:

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

每个'帧'都是通过响应队列中等待的所有事件(内部时间)开始的:

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

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

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

可能移动鼠标需要更改下一帧的视点,因此我们将更新存储我们正在查看的方向的向量。所以我们更新了内存中的向量。

您可能有很长的延伸,其中事件队列为空,并且应用程序没有任何要处理的事件。并且可能会有一些活动(例如用户移动鼠标),您将在那里收到许多要响应的事件。

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

完成所有事件并完成内循环后,您就可以继续更新世界和渲染。 此时你通常会做像AI这样的事情。调用物理引擎。例如,您可以迭代对象并根据其速度更改其位置。

下一步是实际进行绘图。

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

第一个电话将清除屏幕。然后你去并根据不同对象的状态进行渲染。例如,可能是因为我们将对象状态更改为选中状态,现在我们将围绕它绘制一个发光的边框。

您最后的电话是SDL_RenderPresent(渲染器)向用户显示新屏幕

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

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