循环 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 下降的可能原因? 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 按成员序列化

    我已经实现了template
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 来自 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 低 高 帧的比