如何用C++限制循环中的FPS?

2024-01-30

我试图使用带有 chrono 和 thread 的 C++ 来限制执行相交检查的循环中的每秒帧数。

这是我的代码:

std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::chrono::system_clock::time_point lastFrame = std::chrono::system_clock::now();

while (true)
{
    // Maintain designated frequency of 5 Hz (200 ms per frame)
    now = std::chrono::system_clock::now();
    std::chrono::duration<double, std::milli> delta = now - lastFrame;
    lastFrame = now;

    if (delta.count() < 200.0)
    {
        std::chrono::duration<double, std::milli> delta_ms(200.0 - delta.count());
        auto delta_ms_duration = std::chrono::duration_cast<std::chrono::milliseconds>(delta_ms);
        std::this_thread::sleep_for(std::chrono::milliseconds(delta_ms_duration.count()));
    }

    printf("Time: %f \n", delta.count());

    // Perform intersection test

}

我遇到的问题是 delta 的所有其他输出都显示出很小的量,而不是我想要的大约 200 毫秒/帧:

Time: 199.253200
Time: 2.067700
Time: 199.420400
Time: 2.408100
Time: 199.494200
Time: 2.306200
Time: 199.586800
Time: 2.253400
Time: 199.864000
Time: 2.156500
Time: 199.293800
Time: 2.075500
Time: 201.787500
Time: 4.426600
Time: 197.304100
Time: 4.530500
Time: 198.457200
Time: 3.482000
Time: 198.365300
Time: 3.415400
Time: 198.467400
Time: 3.595000
Time: 199.730100
Time: 3.373400

对于为什么会发生这种情况有什么想法吗?


如果您考虑一下您的代码是如何工作的,您会发现它完全按照您编写的方式工作。由于代码中的逻辑错误,Delta 发生振荡。

发生的情况是这样的:

  • 我们从delta == 0.
  • 因为 Delta 小于200,你的代码睡觉了200 - delta(0) == 200 ms.
  • 现在,三角洲本身已经接近200(因为您已经测量了睡眠时间以及实际工作时间)并且您睡觉了200 - delta(200) == 0 ms.
  • 之后,循环重复。

要解决这个问题,您不需要测量睡眠时间。

可以这样做:

#include <iostream>
#include <cstdio>
#include <chrono>
#include <thread>

std::chrono::system_clock::time_point a = std::chrono::system_clock::now();
std::chrono::system_clock::time_point b = std::chrono::system_clock::now();

int main()
{
    while (true)
    {
        // Maintain designated frequency of 5 Hz (200 ms per frame)
        a = std::chrono::system_clock::now();
        std::chrono::duration<double, std::milli> work_time = a - b;

        if (work_time.count() < 200.0)
        {
            std::chrono::duration<double, std::milli> delta_ms(200.0 - work_time.count());
            auto delta_ms_duration = std::chrono::duration_cast<std::chrono::milliseconds>(delta_ms);
            std::this_thread::sleep_for(std::chrono::milliseconds(delta_ms_duration.count()));
        }

        b = std::chrono::system_clock::now();
        std::chrono::duration<double, std::milli> sleep_time = b - a;

        // Your code here

        printf("Time: %f \n", (work_time + sleep_time).count());
    }
}

这段代码给了我一个稳定的增量序列:

Time: 199.057206 
Time: 199.053581 
Time: 199.064718 
Time: 199.053515 
Time: 199.053307 
Time: 199.053415 
Time: 199.053164 
Time: 199.053511 
Time: 199.053280 
Time: 199.053283    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用C++限制循环中的FPS? 的相关文章

  • 如何从该 Voronoi 图数据中获取单元格字典?

    使用找到的voronoi delaunay图生成库在这个节目中 http sourceforge net projects mapmanager 这是基于 财富 最初的实施他的算法 http en wikipedia org wiki Fo
  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • 用 C# 启动 Windows 服务

    我想启动一个刚刚安装的Windows服务 ServiceBase ServicesToRun if bool Parse System Configuration ConfigurationManager AppSettings RunSe
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o
  • 将指针转换为浮点数?

    我有一个unsigned char 通常 这指向一块数据 但在某些情况下 指针就是数据 即 铸造一个int的价值unsigned char 指针 unsigned char intData unsigned char myInteger 反
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 在桌面应用程序中,类库的连接字符串存储在哪里?我可以在app.config中使用吗?

    我是桌面应用程序开发的新手 目前正在使用分层架构 用户界面 DAL BLL 构建桌面应用程序 在 Web 开发中 我曾经将连接字符串存储在 web config 中 我的类库从那里访问它 请指导我在桌面应用程序中如何以及在何处存储 DAL
  • 使用静态类型代替变量

    当您的项目不使用命名空间时 有什么方法可以告诉编译器使用静态类型而不是变量吗 例如 我有一个名为 User 的类 它具有各种静态和非静态方法 假设调用了其中一个静态方法GetUser 我想称之为User GetUser 方法来自一个方法 该
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • 'goto *foo' 其中 foo 不是指针。这是什么?

    我正在玩标签作为值 https gcc gnu org onlinedocs gcc Labels as Values html并最终得到这段代码 int foo 0 goto foo 我的 C C 经验告诉我 foo means dere
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • 如何从代码隐藏中向我的 div 添加点击事件?

    如何从代码隐藏中向我的 div 添加点击事件 当我点击 div 时 会出现一个消息框 其中显示 您想删除它吗 并在框中显示 是 或 否 全部来自后面的代码 while reader Read System Web UI HtmlContro
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • double 类型的静态类成员的常量表达式初始值设定项

    在 C 11 和 C 14 中 为什么我需要constexpr在下面的代码片段中 class Foo static constexpr double X 0 75 而这会产生编译器错误 class Foo static const doub
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义

随机推荐

  • Spring Elastic Search 自定义字段名称

    我是 Elastic Search 的新手 我正在尝试使用 Spring data elasticsearch 来实现它 我的弹性搜索文档中有一些名称为 Transportation Telephone Number 的字段 当我尝试将我的
  • 用于通配符 url 映射的 Kubernetes Ingress 控制器

    我需要我的每个用户都可以通过自定义网址访问服务 例如 abccompany mycloudapp com 每个服务都是 kubernetes 服务 我正在查看入口控制器 但我需要一种使用通配符主机字段并以某种方式将值读入 path 和 se
  • #someDiv 是什么意思? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当用户将鼠
  • Google Datastore 模拟器从本地数据库中删除数据

    我的本地计算机 Mac OSX 10 11 6 上运行着一个本地数据存储模拟器实例 我已经有一堆数据了 但我想从本地数据库中删除所有数据 从头开始 不过 我已经尝试删除存储数据的目录 我认为的目录 启动模拟器时会出现此消息 WARNING
  • VS2015中sprintf()和wsprintf()的格式差异

    我正在将一些代码从多字节移动到 unicode 并发现我的字符串格式出现错误 看起来 Visual Studio 2015 在 sprintf 和 wsprintf 之间处理宽度参数说明符 的方式不同 这是编译器错误或副作用 还是我错过了一
  • Angular 9 PWA 哈希不匹配(cacheBustedFetchFromNetwork)

    我有一个 Angular PWA 它无法离线启动 http 错误 504 当我检查 ngsw state 时 出现此错误 Error Hash mismatch cacheBustedFetchFromNetwork https examp
  • codeigniter 分页 - 每个页面上的结果保持相同

    我正在使用 Codeigniter 分页 但遇到了问题 url 在点击时发生变化 如限制更新 例如displayAllUsers 10 到 displayAllUsers 15 但结果保持不变 这是我的控制器 public function
  • C# XAMARIN.FORMS 中的超链接按钮

    我想创建具有点击可能性的标签 就像在 WIN 手机 xaml 中一样
  • 获取 openX 的域详细信息以及 Portrait_id 和 Landscape_id

    我刚刚下载了 OpenX android sdk 并尝试将其指向本地创建的域 但看起来它对我来说效果不佳 布局中的 OXMAdBanner 看起来像
  • 如何从事件处理程序获取 jquery 选择器

    我在页面上有几个输入元素 其中一个 第一个 是我可以输入任何其他元素的特定 ID 的地方 我希望我的代码以这样的方式设置 当我关注任何其他元素并且其 id 与第一个元素中输入的文本匹配时 它会突出显示 并在其中显示指示我选择了正确元素的文本
  • “更改表重命名”和“重命名表”有什么区别?

    我正在使用MySQL 举个例子 我想将表A重命名为B 那么下面的语句有什么区别 alter table A rename to B 和这个 rename table A to B 谁能详细比较一下它们之间的情况吗 是否会根据不同的发动机而有
  • 封装 Action 和 Func

    我正在尝试为某种 IExecutable 接口进行设计 我不会详细介绍 但重点是我有几个需要从基类执行的操作 它们可能采用不同的参数 没什么大不了的 并且它们可能 可能不返回值 到目前为止 这是我的设计 public abstract cl
  • 在 AngularJS 服务调用后填充 jQuery UI 手风琴

    我目前正在尝试构建一个 AngularJS 应用程序 其中使用 jQuery UI 手风琴控件 问题是 jQuery UI 手风琴已启动before我的 AngularJS 服务已完成从服务器加载数据 换句话说 手风琴在启动时没有任何数据
  • 如何在 WPF KeyBinding 中传递来自 DataGrid 的单元格信息?

    我有一个 DataGrid 来列出 MobileInfo 集合 DataGrid 配置为SelectionUnit FullRow 如果我单击任何行 那么它会选择整行 此外它还指向鼠标被击中的带有边框的单元格 边框选择在键盘导航时移动例如
  • 我如何知道库是服务器端、客户端还是两者?

    dart html 是一个客户端库 而 dart io 是一个服务器端库 因为这是显而易见的 但是一个时髦的库怎么样 http pub dartlang org packages http pub dartlang org packages
  • 为什么带有 T: 类约束的泛型方法会导致装箱? [复制]

    这个问题在这里已经有答案了 为什么将 T 限制为类的通用方法会在生成 MSIL 代码中包含装箱指令 我对此感到非常惊讶 因为肯定由于 T 被限制为引用类型 所以生成的代码不需要执行任何装箱 这是 C 代码 protected void Se
  • 仅在某些条件下使用什么 RxJava 运算符来链接可观察量

    我正在 RxJava Android 中开发一个完整的应用程序 试图使事情尽可能成为 Rx 方式 我认为我已经实现了我想要的目标 但现在我遇到了一个问题 我确信存在更好的方法来做到这一点 它包括 从 Observable 获取布尔值 A 如
  • TypeScript 升级后 Promise 返回类型错误

    Using typescriptv2 3 4 以下代码运行良好 getStuff Promise
  • 如何在 Angular 7 中使用 JavaScript 代码?

    我正在尝试在移动屏幕上使用MaterializeCSS 的帮助下制作一个可折叠的导航栏 并且需要在其中使用JavaScript 代码 我应该在哪里编写这段 JavaScript 代码 这是我想使用的代码 document ready fun
  • 如何用C++限制循环中的FPS?

    我试图使用带有 chrono 和 thread 的 C 来限制执行相交检查的循环中的每秒帧数 这是我的代码 std chrono system clock time point now std chrono system clock now