当前位置: 首页 > 知识库问答 >
问题:

SDL延迟影响SDL

庾鸿飞
2023-03-14

我试图将SDL程序限制为60 FPS,并使用以下代码计算FPS:

static const Uint32 min_frame_time = 16;
Uint32 start_time = SDL_GetTicks();

// Rendering stuff...

time_delta = SDL_GetTicks() - start_time;
fps_sum += 1000.0 / (float)time_delta;
fps_count++;

if(fps_count >= fps_max_count)
{
    printf("FPS: %f\n", fps_sum / (float)fps_count);
    fps_count = 0;
    fps_sum = 0.0;
}

if(time_delta < min_frame_time)
    SDL_Delay(min_frame_time - time_delta);

但似乎SDL_Delay以某种方式影响了SDL_GetTicks的返回值,因此time_delta得到的值类似于0到3,而当我只删除最后2行时,它通常约为15。

对我来说,这毫无意义。有人知道怎么回事吗?

编辑:

上面的代码基本上是我程序的主循环。我首先实现了一个fps计数器,通过在start_time和afterwords中计算多个循环的平均fps来节省渲染场景之前的时间,效果很好。

然后,我添加了最后两行以将fps限制为60。因此,如果渲染速度快于min_frame_time,则程序应等待其余时间。但是在添加此值后,除第一个循环外,所有循环的SDL_GetTicks()的结果变得奇怪,因此delta变成了我上面提到的这些小值。

共有2个答案

陆洛城
2023-03-14

一些程序,如谷歌Chrome。将系统时钟分辨率设置为15ms。有办法解决这个问题。

Hibernate(1) 和SDL_Delay(1) 需要 15 ms

但如果我理解正确的话,它会使CPU每1ms慢一次。我希望这能帮助你,我一直在寻找有关这方面的信息!

我想我不应该搞砸这件事,也许只是解决它。

季小云
2023-03-14

根据你所展示的,我要在这里做一个小小的猜测。

当运行窗口或启用VSync的全屏时,SDL_RenderPresent将等待垂直同步。这种等待将发生在您的定时代码中,因此您可以看到大约time_delta=15处的值。使用SDL_Delay,您将手动等待直到接近或刚刚在下一个vsync之后,但这种等待超出了您的时间范围。因此,下次渲染时不必等待,也不必等待很长时间,以便下一个vsync发生,并且您可以更快地运行渲染循环。

 类似资料:
  • 我正在用Netty框架创建一个代理,但我注意到收到的最后一条消息在传递到下一个节点之前往往会延迟。 设计: 客户| 基本上,当服务器在将消息传递给客户机之前启动消息时会出现延迟,或者如果服务器在第一条消息之后立即发送后续消息,那么第一条消息就会通过,第二条消息会延迟几秒钟。为什么会这样?是否缺少一些配置参数?

  • 首先,是否有人对GRPC客户机服务器实现与websocket protobuf客户机服务器实现之间的吞吐量/延迟进行了性能比较?或者至少是类似的东西。 为了实现这一目标,我正在试用示例JAVA helloworld grpc客户机服务器,并尝试将响应的延迟与类似的websocket客户机服务器进行比较。目前,我正在本地机器上用客户端和服务器进行测试。 websocket客户端服务器在服务器端有一个

  • 我观察到,在使用内存后端时,使用检查点会导致观察到的延迟意外增加。 考虑以下检查点: 尽管端到端持续时间仅为50ms,但在15:35:46385注入的事件的响应仅在520ms后到达。在这两个时间戳之间,没有处理任何事件。在没有检查点的情况下,99.99%的延迟约为15ms。 设置: 平行度=1 编辑:这是一项线性工作,所以我想检查点屏障并没有对齐。

  • redis能监控主从复制的延迟时间吗?怎么减小主从延迟带来的影响?

  • 问题内容: 我正在尝试使用新的React Lazy和Suspense创建后备加载组件。这很好用,但后备时间仅显示几毫秒。有没有办法增加额外的延迟或最短时间,因此我可以在渲染下一个组件之前显示该组件的动画? 现在懒导入 等待组件: 我可以做这样的事情吗? 问题答案: 函数应该返回对象的承诺,该对象由具有默认导出功能的模块返回。不会返回承诺,也不能那样使用。尽管任意承诺可以: 如果目标是提供 最小的

  • 当考虑到下载后的脚本执行及其对页面性能的影响时,和的使用有何不同? 异步 在执行时阻止页面解析 一旦可用就立即执行 推迟 < li >在页面完成解析后执行 < li >在< code>DOMContentLoaded事件之前执行 < li >尊重脚本顺序 对我来说,的影响似乎较低,因为下载后的执行发生在页面解析之后,而脚本在下载后执行会阻止解析。但是为什么我经常看到和一起使用,后者只是后备?异步似