gpt4 book ai didi

c++ - 每3秒DirectX应用程序 “hiccups”

转载 作者:可可西里 更新时间:2023-11-01 16:48:00 26 4
gpt4 key购买 nike

我已经调查DirectX 11 C++应用程序中的一个问题已有一个多星期了,因此,我向StackOverflow上的好人寻求帮助,以帮助他们深入研究这一问题。

我的应用程序大多数情况下将以每秒60-90帧的速度运行,但是每隔几秒钟我就会得到一帧,大约需要三分之一的时间才能完成。经过大量研究,调试和使用了各种代码分析器之后,我将其范围缩小到对DirectX API的调用。但是,从一个慢帧到下一个慢帧,并非总是相同的API调用引起减速。在我最近的一次运行中,停顿的 call (大约持续五分之一秒)是

  • ID3D11DeviceContext:UpdateSubresource
  • ID3D11DeviceContext:DrawIndexed
  • IDXGISwapChain:当前

  • 不仅是停滞的功能不同,而且慢速调用的每个功能(主要是前两个功能)也可能在我的代码中的不同位置出现。

    根据多种配置工具和我自己的高分辨率计时器(我在代码中放置了这些计时器来帮助进行测量),我发现这种“打ic”现象将以不到3秒(〜2.95)的恒定间隔发生。

    该应用程序从外部硬件收集数据,并使用DirectX实时可视化该数据。当应用程序运行时,硬件可能处于空闲状态或以各种速度运行。硬件运行得越快,收集的数据就越多,并且必须可视化。我指出这一点是因为在考虑此bug的某些特征时它可能很有用:
  • 硬件空闲时不会出现长帧。这对我来说很有意义,因为该软件只需要重绘它已经拥有的数据,而不必将新数据传输到GPU。
  • 但是,无论硬件运行的速度如何,长帧都以这3秒钟的恒定间隔出现。因此,即使我的应用程序每秒收集两倍的数据量,长帧的频率也不会改变。
  • 这些长帧的持续时间非常一致。始终在0.25到0.3秒之间(我相信对DirectX API的缓慢调用是一致的,因此总体帧持续时间的任何变化都是该调用的外部影响)。
  • 上周(当我首次发现问题时)进行现场测试时,我注意到在长时间运行(大约20分钟或更长时间)的连续测试后,在几次运行该应用程序的过程中,除了观看程序外,与程序没有太多交互,打ic就会消失。如果我们与该应用程序的某些功能进行交互或重新启动该程序,则会打back。这对我来说没有任何意义,但几乎就像GPU“弄明白了”并解决了问题一样,但是当我们改变了以前的工作模式时又恢复了原状。不幸的是,我们硬件的性质使我很难在实验室环境中复制它。

  • 该错误在硬件非常相似的两台不同机器(双GTX580卡)上始终出现。但是,在最新版本的应用程序中,不会发生此问题。不幸的是,此后代码经历了许多更改,因此很难确定导致问题的具体更改。

    我考虑了图形驱动程序,因此已更新为最新版本,但这并没有什么不同。我还考虑了对两台计算机进行某些其他更改或对两台计算机上运行的软件进行更新的可能性,可能会导致GPU问题。但是,除了应用程序运行时,两台计算机上都运行的Microsoft Security Essentials之外,我什么都没有想到,而且我已经尝试过禁用它的实时保护功能,但毫无用处。

    虽然我很想成为可以立即关闭的外部程序的原因,但最终我担心我必须对DirectX API进行错误/不正确的操作,导致GPU必须每隔几秒钟进行一次调整。也许我在更新GPU上的数据的方式上做错了(因为仅当我收集要显示的数据时才会发生延迟)。然后,GPU每隔几秒钟就会停转,而停转期间碰巧调用的任何API函数都无法像往常一样快地返回?

    任何建议将不胜感激!

    谢谢,
    提姆

    更新(2013.01.21):

    我最终屈服了,然后继续搜索我的应用程序的先前版本,直到发现没有发生此错误的地方。然后我逐个修订,直到找到确切的错误开始发生的时间,并设法找出问题的根源。在将“unsigned integer”字段添加到一个顶点类型后,就开始出现该问题,我为其分配了一个大的顶点缓冲区。由于顶点缓冲区的大小,此更改将大小增加了184.65 MB(从1107.87 MB增加到1292.52)。因为实际上我确实在我的顶点结构中需要这个额外的字段,所以我找到了其他方法来减少整体顶点缓冲区的大小,并将其减小到704.26 MB。

    我最好的猜测是,该字段的添加和所需的额外内存使我超出了GPU上的某些阈值/限制。我不确定这是否超出了总的内存分配,或者超出了单个顶点缓冲区的某些限制。无论哪种方式,似乎这种过量都会导致GPU每隔几秒钟不得不做几分额外的工作(可能与CPU通信),因此我对API的调用必须等待这一点。如果有人有任何信息可以澄清大型顶点缓冲区的含义,我很乐意听到!

    感谢所有给我他们的时间和建议的人。

    最佳答案

    1)尝试开启VSYNC

    2)您是否正在分配/取消分配大块内存?尝试在程序开始时分配内存,而不要对其进行分配,只需将其覆盖即可(这可能是您对updatesubresource所做的工作)

    3)将与硬件设备的交互放在单独的线程上。设备完全完成向应用程序的数据传递后,将其加载到GPU中。不要让设备控制主线程。我怀疑设备经常阻塞主线程,并且我完全推测,但是如果您是将数据直接从设备复制到GPU,则设备偶尔会阻塞,这会导致速度下降。

    关于c++ - 每3秒DirectX应用程序 “hiccups”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407120/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com