本文介绍了使用DwmGetCompositionTimingInfo确定DWM的合成率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想编写一个基本记录DWM组合速率的工具,以便我可以检测外部应用程序中的渲染延迟。像fraps这样的工具可以实现这样的功能,所以我知道这可能是某种方式。由于我在窗口模式下运行,因此DwmGetCompositionTimingInfo
看起来就像我需要的确切功能。但是,它的行为似乎与MSDN文档不匹配。根据我的理解,此代码段应该有效:

I'd like to write a tool that basically logs the DWM's composition rate so I can detect rendering lag in external applications. Tools like fraps accomplish such functionality, so I know this is possible somehow. Since I am running in windowed mode, DwmGetCompositionTimingInfo seems like the exact function I need. However, its behavior does not appear to match the MSDN documentation. From what I understand, this code snippet should work:

void main()
{
std :: uint64_t dwm_frames_rendered(0);
std :: uint64_t dwm_frames_skipped(0);
for(size_t interval_count(0); interval_count< 500; ++ interval_count)
{
DWM_TIMING_INFO initial_timing_info {};
initial_timing_info.cbSize = sizeof(initial_timing_info);
DwmGetCompositionTimingInfo(NULL,& initial_timing_info);

DWM_TIMING_INFO current_timing_info {};
current_timing_info.cbSize = sizeof(current_timing_info);
do
{
DwmGetCompositionTimingInfo(NULL,& current_timing_info);
} while(initial_timing_info.qpcVBlank == current_timing_info.qpcVBlank);

if(initial_timing_info.cFrameConfirmed!= current_timing_info.cFrameConfirmed)
{
++ dwm_frames_rendered;
}
其他
{
++ dwm_frames_skipped;
}
}
std :: cout<< "渲染的帧:" << dwm_frames_rendered<< std :: endl
<< "跳过框架:" << dwm_frames_skipped<<的std :: ENDL;
}

void main (){ std::uint64_t dwm_frames_rendered (0); std::uint64_t dwm_frames_skipped (0); for (size_t interval_count (0); interval_count < 500; ++interval_count) { DWM_TIMING_INFO initial_timing_info {}; initial_timing_info.cbSize = sizeof (initial_timing_info); DwmGetCompositionTimingInfo (NULL, &initial_timing_info); DWM_TIMING_INFO current_timing_info {}; current_timing_info.cbSize = sizeof (current_timing_info); do { DwmGetCompositionTimingInfo (NULL, &current_timing_info); } while (initial_timing_info.qpcVBlank == current_timing_info.qpcVBlank); if (initial_timing_info.cFrameConfirmed != current_timing_info.cFrameConfirmed) { ++dwm_frames_rendered; } else { ++dwm_frames_skipped; } } std::cout << "Frames rendered: " << dwm_frames_rendered << std::endl << "Frames skipped: " << dwm_frames_skipped << std::endl;}

但是,dwm_frames_skipped永远不会增加。使用调试器逐步执行它,看起来每次调用DwmGetCompositionTimingInfo时,无论何时调用它们,以下值都会增加1。你可以注入
睡眠,立即打电话等等,所有DwmGetCompositionTimingInfo似乎都会返回一个稳定增加1的值:

But instead, dwm_frames_skipped never gets incremented. Stepping through it with the debugger, it appears that every time that DwmGetCompositionTimingInfo is called, the following values get incremented by 1 regardless of when they are invoked. You can inject sleeps, call immediately, etc., and all DwmGetCompositionTimingInfo appears to do is return a steady incremented by 1 value for:


  • cRefresh
  • cDXRefresh
  • C框架
  • cDXPresent
  • cRefreshFrame
  • cFrameSubmitted
  • cFrameConfirmed
  • cDXPresentConfirmed
  • cRefreshConfirmed

有没有人对究竟出了什么问题有任何想法?

Does anyone have any ideas on what exactly is going wrong?

谢谢,

Jason Stern

Jason Stern







推荐答案

感谢您在此发帖。

我已经测试了你的代码,在成功工作之前,我应该配置添加Dwmapi.lib库的属性页面。

I have tested you code, before working successfully, I should configure the property page adding Dwmapi.lib library.

看我的屏幕截图:

根据测试结果,dwm_frames_skipped变量始终为零。我认为这主要是因为。 


According to test result, the dwm_frames_skipped variable always is zero. I think that this is mainly reason. 

cFrameConfirmed上次确认为呈现的DWM帧号。 

cFrameConfirmed The DWM frame number that was last confirmed as presented

我认为我们无法比较一个程序中的值,因为现在总是在变化。

I think that we cannot compare the value inside one program, because the present is always changing.

最好的问候,

Hart


这篇关于使用DwmGetCompositionTimingInfo确定DWM的合成率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 10:01