Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 事件深度_C++_Sdl - Fatal编程技术网

C++ 事件深度

C++ 事件深度,c++,sdl,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) {

下面是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循环中。为了获得最流畅的用户体验,我们尝试将此循环保持在17ms以下(每秒60帧)

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

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

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

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

在事件队列为空且应用程序没有任何要处理的事件的情况下,可能会有较长的扩展。而且可能会有一连串的活动(例如,用户移动鼠标),在这些活动中,您将得到许多事件的响应

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

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

下一步是实际绘制

        SDL_RenderClear(renderer);
        ...
        SDL_RenderPresent((SDL_Renderer)renderer);
第一次呼叫将清除屏幕。然后根据不同对象的状态进行渲染。例如,可能因为我们将对象状态更改为“选定”,我们现在将在其周围绘制一个发光的边框

最后一个调用是SDL_RenderPresent(渲染器)向用户显示新屏幕

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


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

这是否意味着,假设我想在第二个while循环中执行10个事件,这些事件将存储在事件队列中,并生成相应的帧,在第11个事件为空时,SDL_PollEvent()将返回false并退出第二个while循环,所有10个帧将使用SDL_RenderPresent()在屏幕上呈现,它是这样工作的吗?您不“执行”事件。。你回应他们。它们表示操作系统中发生了某些情况(窗口大小调整/鼠标移动)。如果您不响应它们,应用程序将看起来没有响应。一旦您对所有这些都做出响应,您就可以返回到绘制下一帧
        SDL_RenderClear(renderer);
        ...
        SDL_RenderPresent((SDL_Renderer)renderer);