- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是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/
所以我正在阅读这篇文章,其中包含“SDL 中多线程编程的提示和建议”-https://vilimpoc.org/research/portmonitorg/sdl-tips-and-tricks.ht
我正在 OpenGL 中创建一个游戏,遇到 SDL_PollEvent 问题,没有接收到所有事件,例如,如果我按住一个键,我必须等待大约 1-3 秒,程序才会意识到我刚才有什么完毕。这是我的mai
我目前正在使用 SDL 制作一款游戏,但我遇到了一个问题,即 SDL 无法获取某些事件。例如,我会按“w”向前移动,同时移动鼠标环顾四周。但是假设我然后按“a”或“d”,SDL 不会选择这些事件,甚至
我正在使用 SDL 库来捕获屏幕上的触摸和鼠标事件。但是如果我断开触摸屏并重新连接它,有时我会停止获取手指触摸事件,即 SDL_FINGERMOTION、SDL_FINGERDOWN、SDL_FING
这是SDL2代码的一部分 SDL主函数 int main(int argc,char *argv[]) { ... ... bool quit=false; S
我正在阅读一本有关SDL的介绍性书籍代码,并且有这样的示例代码: void Game::handleEvents() { SDL_Event event; if (SDL_PollEv
我使用 SDL2 在 C++ 中拼凑了一个非常基本的游戏循环,我注意到每隔几秒,SDL_PollEvent 似乎异常缓慢,即使没有任何事情发生也是如此。 我发送了 deltaTime 来控制每个循环,
我最近才开始使用 C 语言并使用 SDL,所以我确信我搞砸了一些基本的东西,但我能找到的每个示例代码看起来都像我的,除了我的不起作用。因此,欢迎任何帮助。 #include #include in
我目前正在浏览 SDL2 的 Lazy Foo 教程(我在 Linux 机器上这样做),我遇到了一些错误,其中包含 SDL_PollEvent 在我的主要循环似乎阻止了 SDL_UpdateWindo
我使用 SDL2 在 C++ 中拼凑了一个非常基本的游戏循环,我注意到每隔几秒,SDL_PollEvent 似乎异常缓慢,即使没有发生任何事情。 我将我的 deltaTime 发送到控制台每个循环,它
我目前正在使用 C 和 gcc 编译器来处理 SDL2。我已经设法让图像在 2 秒后自动加载并关闭,但现在我想等到用户按下顶部的 X 按钮,或者用户按下 ESC 键. 但是,在几个打印语句显示一切正常
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我已经使用 SDL 一段时间了,但现在看来我在处理键盘事件时一直在以错误的方式做事。 通常我的主循环看起来像这样: int main() { SDL_Init(SDL_INIT_VIDEO);
我有一个程序可以使用 xset dpms force on/off 打开和关闭屏幕,并且还可以循环调用 SDL_PollEvent(&e)。使用 xset 关闭显示器后,任何对 SDL_PollEve
我是一名优秀的程序员,十分优秀!