gpt4 book ai didi

c++ - std::chrono::high_resolution_clock 和屏幕刷新率的准确度(不是精度)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:01 29 4
gpt4 key购买 nike

我使用的是 visual studio 2012,想知道 high_resolution_clock 的准确性。

基本上我正在编写一些代码来显示声音和图像,但我需要它们非常同步,并且图像必须无撕裂。我正在使用 directX 提供无撕裂图像,并使用 high_resolution_clock 定时屏幕刷新。显示器声称为 60 fps,但是,使用 high_resolution_clock 的计时给出了 60.035 fps 的刷新率,平均超过 10000 次屏幕刷新。根据哪个是正确的,我的音频将在一秒后结束 0.5 毫秒,即一小时后大约 2 秒。我希望任何时钟都比这更准确 - 更像是 1 秒在一年内漂移,而不是一个小时。

有没有人以前看过这种东西。我应该期待我的声卡时钟再次不同吗?

编辑这是我的时间代码。这个 while 循环在我的渲染线程中运行。 m_renderData 是包含渲染场景所需数据的结构数组,每个屏幕有一个元素。对于测试,我只在一个屏幕上运行,所以它只有一个元素

while(!TestDestroy())
{
for(size_t i=0; i<m_renderData.size(); ++i)
{
//work out where in the vsync cycle we are and increment the render cycle
//as needed until we need to actually render
D3DRASTER_STATUS rStatus;
m_renderData[i].deviceD3D9->GetRasterStatus(0, &rStatus);
if(m_renderData[i].renderStage==inVBlankRenderingComplete)
{
if(!rStatus.InVBlank)
m_renderData[i].renderStage=notInVBlank;
}
else if(m_renderData[i].renderStage==notInVBlank)
{
if(rStatus.InVBlank)
m_renderData[i].renderStage=inVBlankReadyToRender;
}

//check for missing the vsync for rendering
bool timeOut=false;
if(m_renderData[i].durations.size()>0)
{
double timeSinceLastRender=std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now()-m_renderData[i].durations.back()).count();
if (timeSinceLastRender>expectedUpdatePeriod*1.2)
timeOut=true;

}

if(m_renderData[i].renderStage==inVBlankReadyToRender || timeOut)
{
//We have reached the time to render

//record the time and increment the number of renders that have been performed
m_renderData[i].durations.push_back(std::chrono::high_resolution_clock::now());
++m_renderData[i].nRenders;

//we calculate the fps using 10001 times - i.e. an interval of 10000 frames
size_t fpsUpdatePeriod=10001;
if(m_renderData[i].nRenders<fpsUpdatePeriod)
{
//if we don't have enough times then display a message
m_renderData[i].fpsString = "FPS: Calculating";
}
else
{
//we have enough timing info, calculate the fps
double meanFrameTime = std::chrono::duration_cast<std::chrono::microseconds>(m_renderData[i].durations.back()-*(m_renderData[i].durations.end()-fpsUpdatePeriod)).count()/double(fpsUpdatePeriod-1);
double fps = 1000000.0/meanFrameTime;
saveFps(fps);
}

//render to the back buffer for this screen
renderToBackBuffer(i);

//display the back buffer
if(!TestDestroy())
m_renderData[i].deviceD3D9->Present(NULL, NULL, NULL, NULL);
//make sure we render to the correct back buffer next time
m_renderData[i].bufferToRender--;
//update the render cycle
m_renderData[i].renderStage=inVBlankRenderingComplete;
}
}
}

最佳答案

不幸的是,在 VS 2012 和 2013 中,chrono::high_resolution_clock 没有使用 RDTSC。这对于 future 版本的 VS 是固定的。参见 VS Connect .同时,改用 QPC。

关于c++ - std::chrono::high_resolution_clock 和屏幕刷新率的准确度(不是精度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386078/

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