- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我使用 SDL2 在 C++ 中拼凑了一个非常基本的游戏循环,我注意到每隔几秒,SDL_PollEvent 似乎异常缓慢,即使没有发生任何事情。
我将我的 deltaTime 发送到控制台每个循环,它与 SDL_PollEvent 滞后的周期相差约 100 毫秒。我已经通过移动我的计时器来确认它与此功能有关,但我不确定在哪里进一步诊断问题。
我的循环:
while (!quit) {
uint32_t startTime = SDL_GetTicks();
while (SDL_PollEvent(&e) != 0) {
std::cout << "Event: "<< e.type << std::endl; // Added later, read update
if (e.type == SDL_QUIT) {
quit = true;
}
}
if (engine.AllowUpdate()) { // Restricts updates to every 20ms
GameState::Update();
}
engine.rMan.BeginRender();
//^v Literally just SDL_RenderClear and SDL_RenderPresent
engine.rMan.FinishRender();
engine.deltaTime = SDL_GetTicks() - startTime;
std::cout << std::setw(10) << engine.deltaTime;
}
没有 Vsync 的控制台输出,注意 106。这是我的延迟:
我还注意到,即使我没有进行调试,并且至少在另一台机器上不存在此问题,也会发生此问题。非常欢迎任何有关如何进行的建议。
编辑 1:尝试打印以控制正在通过队列的所有事件,以查看其中一个是否导致问题。在上面的代码中添加了打印行。在有延迟的时候似乎没有触发任何事件,否则我就处于空闲状态。
编辑 2:根据要求,一些可运行的代码,在带有 SDL2-2.0.9 的 VS2017 上使用 c++14 构建:
#include <iostream>
#include <SDL.h>
void InitSDL();
void BuildWindow();
void BuildRenderer();
SDL_Window* window;
SDL_Renderer* renderer;
int main(int argc, char* args[]) {
InitSDL();
BuildWindow();
BuildRenderer();
bool quit = false;
uint32_t deltaTime = 0;
while (!quit) {
uint32_t startTime = SDL_GetTicks();
SDL_Event e;
while (SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
quit = true;
}
}
deltaTime = SDL_GetTicks() - startTime;
std::cout << deltaTime << std::endl;
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
return 0;
}
void InitSDL() {
Uint32 flags = SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_EVENTS;
SDL_Init(flags);
}
void BuildWindow() {
window = SDL_CreateWindow
("SDL Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
800, 600, NULL);
}
void BuildRenderer() {
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
}
在整理这些内容时,我注意到了一些事情:
<罢工>1。在没有 SDL_RenderPresent 的情况下不会出现卡顿经过仔细检查,情况似乎并非如此,但是,SDL_RenderPresent 似乎受到卡顿的影响。
在 SDL_PollEvent 期间,与口吃同时出现的 deltaTime 增加似乎发生在 SDL_PollEvent 期间,正如 deltaTime 被分配的位置所证明的那样
第一个 deltaTime 总是更长,尽管我怀疑这与启动时触发的一些默认事件有关。
编辑 3:做了更多的挖掘。试图仅围绕 SDL_RenderPresent 移动我的增量分配。
示例片段:
SDL_Event e;
while (SDL_PollEvent(&e) != 0) {
std::cout << "Event: "<< e.type << std::endl;
if (e.type == SDL_QUIT) {
quit = true;
}
}
uint32_t startTime = SDL_GetTicks();
//SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
//SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
deltaTime = SDL_GetTicks() - startTime;
std::cout << deltaTime << std::endl;
编辑 4:更多数据。看起来口吃几乎每 3000 毫秒发生一次。我的控制台输出只有 > 50 毫秒的增量。图像格式为:# of game loop cycles |增量时间 | SDL_GetTicks()
我还认为这是一个硬件问题,因为我在另一台机器上没有这个问题,而且我还下载了一些其他开源 SDL 游戏并且遇到了同样的卡顿,相隔 3000 毫秒。我在 Windows 10 和 Windows 7 的相同硬件上也看到了同样的问题。除非有人认为有必要,否则我不会发布我的规范,但我已经通过看到相同的内容消除了我的专用 GPU 出现故障的可能性在移除我的 GPU 的情况下通过 RDP 运行游戏时的确切问题。
编辑 5:看起来滞后与 USB 设备有关。 SDL 是否每 3000 毫秒或其他时间查找所有设备?
将 GPU 放回我的机器后,我注意到延迟显着下降,并且我注意到与之前和之后的唯一区别是我的 USB 耳机不再插入。
凭直觉,我再次运行了我的循环,这次是观察任何超过 3 毫秒的 deltaTime。我在移除设备时观察了控制台的变化:
Eureka !有点。在没有插入 USB 设备的情况下,deltaTime 始终保持在 3ms 以下。我测试的第二台机器是笔记本电脑,因此没有插入 USB 设备。我回去用同一个 USB 鼠标对其进行了测试,正如预期的那样,我每 3000 毫秒看到一次明显的卡顿。
所以当前的问题是:USB 设备是如何导致这种卡顿的?与 (a) USB 设备和 (b) SDL_RenderPresent() 相关的每 3000 毫秒 SDL 会做什么?
最佳答案
我仍然不确定究竟是什么导致了问题,但它肯定与 USB 设备有关。插入的设备越多,延迟峰值就越长,并且几乎每 3000 毫秒发生一次。
我从 SDL2-2.0.9 回滚到 SDL2-2.0.8,问题已经停止。
编辑:更改集位于 https://hg.libsdl.org/SDL/rev/9091b20040cf似乎在 SDL2-2.0.9 中解决了这个问题。
关于c++ - SDL_PollEvent() 空闲时口吃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53644628/
我有一个需要从远程下载数据的更新服务,但是就像微软的 BITS 我想在用户空闲和/或他们的网络利用率低时执行此操作,以免影响他们的体验. 我需要做什么或看什么?谁能指出我从哪里开始并获得我需要的信息的
我有一个运行良好的 Angular 项目,我正在实现 NG-IDLE 和 KeepAlive,以保持 session 新鲜并在 API session 到期之前注销用户。 我的问题是 ng-idle
我开始使用http://reactphp.org/用于处理 HTTP 请求。 我运行多个在不同端口上运行的 React Worker,然后使用 Nginx 作为负载平衡来处理请求。像这样 upstre
我有一个 ViewController,它将通过 init 请求访问位置服务 if ([CLLocationManager authorizationStatus] == kCLAuthorizati
1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app
有没有办法在 Python 的 IDLE 中循环打开的窗口?似乎唯一的方法就是转到菜单栏,或者单击所需的窗口。谢谢。 最佳答案 在 Mac OS X 上,如果您使用的是来自与 Aqua Cocoa T
我在 java 中实现了一个邮件监听器,监听器进入 IDLE 直到新邮件到达,它打印电子邮件主题并立即再次返回 IDLE。 我是否有可能错过我发出的两个 IDLE 之间的事件(新电子邮件)? 例如,我
在嵌入式设备中,允许空闲 HTTP 连接保持打开状态的实际时间是多少? 我知道在 1999 年左右的互联网时代,互联网聊天室有时只会保持连接打开并在他们进来时发送回复。在那些日子里,HTTP 连接的空
我正在网页(在弹出窗口中)检查用户状态 - 他是活跃的还是空闲的。如果他空闲超过 30 分钟,窗口将自动关闭并重置数据库中的一些标志。 我设置了包含时间的 cookie(他打开弹出窗口的时间),并在每
我在空闲: >>> import mymodule >>> # ??? 导入模块后: if __name__ == '__main__': doStuff() 我实际上如何从 IDLE 中调用
除了 Sun Java Mail 之外,还有支持 IDLE 命令的 Java IMAP 库吗? 我一直在使用 Sun 的 JavaMail,它运行良好,只是它有相当多的内存开销。 最佳答案 Chilk
我尝试实现一个邮件服务器,使用 sun IMAPFolder 和空闲命令解析传感器发送的电子邮件。 不幸的是,空闲状态在30分钟后关闭并抛出FolderClosedException。为了模拟在空闲重
我有一个 PHP 脚本可以从文本文件中导入各种数据。 导入非常复杂,我的测试文件有 32.000 个条目。这些条目必须被解析并插入到 mysql 数据库中。 如果我要运行我的脚本,它需要 30 分钟才
我正在使用在后端使用 SQL Server 2008 的 Hibernate 开发 Spring REST Web 应用程序。我在 64 位 Windows 机器上使用 Tomcat 6 作为 Web
我对 JS 中的任务运行器非常陌生,这是我第一次尝试 GruntJS。在我的 Gruntfile.js 中,我保留了几个任务,例如 jshint、cssmin 等。我可以从命令行运行它们,但是当我在那
麦克:特立独行 python :3.4 我尝试在 Python 的 IDLE 中测试 timeit 模块 import timeit >>> timeit.timeit( "obj.method",
我的 C# 应用程序在系统启动时运行,必须等待本地 SQL Server 实例才能真正执行任何操作。现在,我只是等待服务器响应(我曾经获得服务的等待句柄,但那不可靠),然后启动应用程序的主对话框。 当
我在服务器上有一个 (bash) 脚本,我继承了它的管理方面,最近发现脚本中的一个缺陷,没有人引起我的注意。 发现问题后,其他人都跟我说这让他们很恼火,但从来没有告诉过我(太棒了。。。) 所以,脚本遵
假设我有一个 websocket 可以随时接收事件,但大部分时间处于空闲状态,初始连接后将消耗多少带宽以使其保持事件状态? 不管怎样,服务器是使用 ws 的 NodeJS,而客户端使用的是 QtWeb
当我打开应用程序时,让它在后台模式下运行很长时间,然后再次打开,然后不久又崩溃了。崩溃日志表明这次崩溃是由MapKit框架引起的。这只发生在设备中... . 有人能理解这个崩溃日志吗?请帮我解决这个问
我是一名优秀的程序员,十分优秀!