循环 FPS 下降的可能原因?

2023-12-20

我正在用 opengl 编写一个新的代码库,很早就遇到了一个奇怪的错误。 这是重复且可预测的帧速率明显波动。

我知道它绝对与渲染的对象成正比。 它还与屏幕尺寸成正比(不是视口尺寸,不是窗口尺寸,只是物理设备尺寸) 大约是 0.2:1(低:高)帧的比例

I got curious and graphed it, bear in mind that the window/context isn't vsynced or capped. Object count and screen size comparisons

视图完全静止,所有物体也静止。 每一帧都完全相同。 任何时候都没有给出任何输入。 没有什么是基于时间的。 不会发生垃圾收集。

我不明白,如果它基本上是一遍又一遍地渲染一帧,那么什么会导致如此巨大的变化?

这是程序流程的伪代码

create window
load shaders
grab uniform locations
create camera
create 3 meshes // They just hold the buffers and data for a model
create x objects and pass a pointer to a random mesh // Objects hold position, rotation etc + link to mesh
while game is running
    poll window for events
    capture mouse and recalculate VP matrix if required
    for each object
        recalc MVP
        bind mesh's buffers and draw elements
    draw window //SFML handles this, just swaps front/back buffers and draws
clean up data

如果这没有给出任何见解,那么我将 VS2012 项目上传到 github:https://github.com/Twistedsnail/Untitled_for_SO https://github.com/Twistedsnail/Untitled_for_SO(它可能不会在本地运行,因为它需要指定位置的 SFML2 和 VS 文件中的 GLM)


当我们在上一份工作中构建游戏引擎时,我们时不时也会遇到类似的奇怪问题。

我记得的原因:

  • Lua 垃圾收集。哪里使用Lua作为引擎的脚本语言,GC会让渲染看起来好像有问题!虽然不是很明显。检查应用程序/机器中是否有任何其他线程甚至进程可能变得贪婪。

  • OpenGL 驱动程序问题:在 NVIDIA 驱动程序中禁用或启用“线程优化”有时会对性能产生有趣的影响。 ATI 驱动程序通常只是存在需要升级的错误。

  • Windows 事件循环的问题。就像使用 GetMessage 而不是 PeekMessage 一样。

另一件事:如果您确实渲染不多并且具有数千 FPS:即使渲染时间的最轻微增加也会对您的 FPS 产生“巨大”影响。 因此,您所看到的可能是非常正常的操作系统/驱动程序任务,这些任务在使用 60 到 120 等“正常”游戏 FPS 时无关紧要,并且以后不会太明显。

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

循环 FPS 下降的可能原因? 的相关文章

  • VS Code:自定义关键字的注入语法范围在 C++ 中被覆盖

    我想制作一个小型 VS Code 扩展 为 C C 代码中的少数自定义关键字添加语法突出显示 我正在尝试通过注入语法来做到这一点source c and source cpp语言范围 遵循VS Code 语法高亮指南 https code
  • 使用 C# 使用证书进行 SSL 客户端身份验证

    我需要创建一个 C 应用程序 该应用程序必须使用 SSL 向服务器发送 API 请求 我需要创建客户端身份验证 我已经拥有服务器 CA 证书 客户端证书 cer 客户端私钥 pem 和密码 我找不到有关如何创建客户端连接的示例 有人可以建议
  • unique_ptr需要存储删除器怎么可能没有开销呢?

    先看看C Primer讲了什么unique ptr and shared ptr 16 1 6 美元 效率和灵活性 我们可以确定的是shared ptr不将删除者视为直接成员 因为删除器的类型直到运行时才知道 因为删除器的类型是a类型的一部
  • 安全地检查“this”是否为空

    首先 我知道在空指针上调用方法是未定义的行为 我还知道 因为这不应该发生 编译器可以 并且确实 假设this始终为非空 但在实际代码中 有时您会不小心这样做 通常 它没有任何不良影响 当然除了this方法中为 null 并且事情可能会崩溃
  • 如何使用 VB.NET 或 C#.NET 代码从 yahoo 邮件 ID 发送邮件

    我想从我的 yahoomail Id 发送邮件 如何使用 VB NET 或 C NET 代码从 yahoo mail Id 发送邮件 需要善意的帮助 提前谢谢 西瓦库马尔 以下是一些制作基本 html 电子邮件消息的示例 http help
  • 将二维整数作为 Readonly/const 存储在单独的类中,同时保持非公开

    这是我在使用这个地方作为我的 去处 以获取关于什么有效 无效 为什么等的一般意见之后的第一个问题 那么让我们试试这个 由于我的经验有限 我一直在尝试寻找更好的方法来创建固定数据字段 我可以在整个程序中引用这些字段 例如我反复显示的最终用户可
  • 隐藏树视图列表中的节点。在 C# 中

    我正在使用 VS 2005 C 正在处理一个未完成的 WinForm 我已将 XML 解析为树视图列表 但遇到了一些问题 我想知道是否有一种方法可以隐藏 过滤 删除名称中包含 this text 的某个节点 而不必依赖文本框 这就是我对这个
  • MySQL 性能 DELETE 或 UPDATE?

    我有一个超过 10 7 行的 MyISAM 表 向其中添加数据时 我必须在最后更新 10 行 删除它们然后插入新行更快 还是更新这些行更快 应更新的数据不是索引的一部分 索引 数据碎片怎么样 UPDATE到目前为止要快得多 当你UPDATE
  • 当 MSB 位等于 0 时如何以十六进制格式打印它们

    我需要使用打印变量HEX格式 问题是当我的变量很小时 MSB 等于 0 因此不会打印它们 ex uint16 t var 10 0x000A h gt 我需要打印 000A 但无论我做什么它总是打印 A 我怎样才能让它发挥作用 您可以添加前
  • cygwin $'\r':命令未找到错误

    我稍微修改了一个项目 在调试下它运行得很好 当我尝试在不调试的情况下构建它时 它显示错误 无法修复它 make Making all in third party make 1 Entering directory cygdrive c U
  • 在 C++ 泛型编程中处理 void 赋值

    我有 C 代码 它包装任意 lambda 并返回 lambda 的结果 template
  • 在信号/槽处理期间删除 QObject

    我知道从槽处理中删除 QObject 可能会使应用程序崩溃 因为它可能有其他排队的事件 因此 我将使用 obj gt deleteLater 而不是使用 delete obj 据我所知 obj 等待处理所有排队的事件 然后 删除 obj Q
  • 如何使 RSACryptoServiceProvider 在没有填充(nopadding)的情况下工作?

    我需要使 C 应用程序与 Java 应用程序兼容 Java 应用程序使用Cipher getInstance RSA ECB nopadding 初始化器使密码 ECB 和无填充 但是 在 C 中 您有 2 个填充选项 OAEP 填充或 P
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • C# 多重继承

    目前我正在学习 C 和 ASP NET MVC 4代码优先方法 我是 Visual Basic 开发人员 现在我想开始 C 而且 现在我遇到了必须管理多重继承的情况 但是 对于Class i来说这是不可能的 那么 我应该如何管理我拥有的这些
  • NHibernate Criteria API 是否支持集合属性的投影?

    我需要使用条件 API 复制以下工作 HQL 查询 session CreateQuery select c from Parent p inner join p Children c where p Id 9 and c Id 33 Se
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样
  • 实体框架中对象属性中的 NULL 值

    Tables Article Author Comment 1篇文章和1位作者可以有 评论 数据库中有 1 篇文章 1 位作者和 1 条评论 问题是 该代码 myBD my bd new myBD var articles by bd Ar
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 在 Rx 中,如何按 id 对事件进行分组并按多个时间跨度限制每个组?

    可以这么说 我陷入了 Rx 热潮 这个问题与我的相关here https stackoverflow com questions 19425965 rx how to group by a key a complex object and

随机推荐

  • 来自 DataFrame 的 Dask 数组

    有没有一种方法可以轻松地将数值数据帧转换为数组 如同values使用 pandas DataFrame 我似乎找不到任何方法来使用提供的 API 来执行此操作 但我认为这是一个常见的操作 编辑 是的 现在这是微不足道的 您可以使用 valu
  • Morris.js 未捕获类型错误:无法读取未定义的属性“匹配”

    我对此失去了理智 无法弄清楚这个问题 我使用以下代码使用 morris js 渲染图表 但不断收到 未捕获的类型错误 无法读取未定义的属性 匹配 错误 javascript和php代码如下 我将php json输出到控制台并将其粘贴到此 g
  • Rails 3:JSON 字符串中出现转义字符 (\)

    任何人都知道为什么我的一些 json 元素是反斜杠 逃脱了 而其他人却没有 first John last Smith dogs name Rex breed Lab name Spot breed Dalmation name Fido
  • 如何根据需要安装和/或重新安装 msiexec

    我在网络驱动器上放置了一个内部 MSI 我想编写一个登录脚本 以便我们网络上的任何人都可以将 MSI 安装到他们的计算机上 或者在 MSI 更新时自动重新安装它 这经常发生 如果我使用msiexec exe i REINSTALL ALL如
  • Node.js 温斯顿记录器;将日志插入日志文件时如何从换行符开始?

    我正在制作一个 Node js 应用程序 并且使用 Winston 来实现大部分日志记录目的 但是我发现日志文件中的所有记录都在一行中 我想为每条日志记录更改行 有什么方法可以做到这一点吗 我的代码 var winston require
  • Insert 上没有写@CreatedDate 注释的字段,@LastModifiedDate 是

    我创建了以下实体并使用 h2 对其进行测试 Getter public class Topic Id private long id private final Title title CreatedDate private LocalDa
  • 如何在悬停或单击时放大图像? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试使用 HTML 和 CSS 制作一堆图像 如果我将鼠标悬停或单击其中任何一个 它将在同一页面中放大 这就是我能够做的 img
  • 低垂的图形编程成果?

    我目前正在使用 Java2D 开发一款基于图块的游戏 我正在考虑添加一些廉价的视觉效果 例如 实现一个简单的粒子系统 可能类似于this http www jhlabs com java particles html 用于爆炸和 或烟雾 对
  • 如何将 ItemAdd 事件应用到自定义文件夹? Outlook 2010 VBA [重复]

    这个问题在这里已经有答案了 我正在尝试使用 ItemAdd 事件方法来监视新项目何时添加到收件箱下的子文件夹中 我的目录结构是这样的 Inbox subfolder 我想在将新电子邮件添加到子文件夹时运行代码 原因是我使用将某些电子邮件重定
  • Jasmine 单元测试抽象类

    有没有办法为抽象组件创建茉莉花单元测试 doing const fixture TestBed createComponent MyAbstractComponent 说 不能将抽象构造函数类型分配给非抽象构造函数类型 我尝试了一些搜索 但
  • 如何更改相机 2 中表面视图的高度和宽度

    我正在使用相机 2 我想自定义表面视图的高度和宽度 我正在使用以下代码
  • 有没有一种安全的方法可以从 Rust 中的可变引用中临时检索拥有的值? [复制]

    这个问题在这里已经有答案了 我正在使用两个独立的函数 第一个获取结构的自有实例然后返回它 第二个函数采用可变引用 但需要使用第一个函数 This structure is not Clone struct MyStruct fn take
  • 这真的是获取单个属性对象值的最短方法吗?

    我有一个具有单一属性的对象 但我不知道其名称 使用纯javascript 以下真的是获取此属性值的最短方法吗 obj Object keys obj 0 看起来好像很多 还有更好的选择吗 再次不使用任何 JS 库 在您描述的场景中 有一个带
  • 如何用纯JS导入字体? [复制]

    这个问题在这里已经有答案了 我需要在不使用的情况下完成一个网站CSS at all 一切都很顺利 但我不知道如何改变我的字体系列与纯JS 有谁知道如何使用导入字体JS only Thanks 你说 纯JS 但很可能你问的是如何在浏览器环境中
  • 将鼠标悬停在其他 div 元素上方时更改一个 div 元素的属性

    很抱歉再次提出这个问题 因为我很确定它在类似的线程中得到了回答here https stackoverflow com questions 4353398 changing the property of outer div while h
  • 如何在 ASP.Net Core 中强制使 JWT 令牌过期?

    我在 ASP NET Core 中实现了 JWT 身份验证和基于策略的授权 有一个具有管理员权限的用户可以将权限分配给非管理员用户 如果管理员更新非管理员用户的权限 声明 是否有办法强制访问令牌过期 以便携带它的用户将被迫请求具有新更新的权
  • 为什么哈希输出的长度是固定的?

    无论输入如何 哈希函数总是产生固定长度的输出 即 MD5 gt gt 128 位 SHA 256 gt gt 256 位 但为什么呢 我知道设计师就是这样设计的 但是为什么他们将输出设计为具有相同的长度 这样它就可以以一致的方式存储 更容易
  • 600 秒内无法报告状态。杀戮!报告 hadoop 的进度

    我收到以下错误 Task attempt 201304161625 0028 m 000000 0 failed to report status for 600 seconds Killing 为我的地图工作 这个问题类似于this ht
  • .filter 和 .includes 用数组过滤数组?

    我对 javascript 很陌生 正在学习一门课程来获得一些经验 但有时我对返回概念感到困惑 基本上这是我坚持的任务 有一系列不必要的单词 迭代数组以过滤掉这些单词 将剩余的单词保存在名为 betterWords 的数组中 有多种方法可以
  • 循环 FPS 下降的可能原因?

    我正在用 opengl 编写一个新的代码库 很早就遇到了一个奇怪的错误 这是重复且可预测的帧速率明显波动 我知道它绝对与渲染的对象成正比 它还与屏幕尺寸成正比 不是视口尺寸 不是窗口尺寸 只是物理设备尺寸 大约是 0 2 1 低 高 帧的比