关闭VSync但在我的DirectX 9应用程序中仍然获得60FPS

时间:2013-05-31 11:22:01

标签: c++ frame-rate directx-9 vsync

我有一个只在屏幕上呈现三角形的DirectX9应用程序,但无论我是否启用了VSync,我的帧速率都是60 FPS。这是为什么?

这是我为计算FPS所做的代码,但我不知道这是否是它的问题。

GameTimer.h

#pragma once

#include "Windows.h"

class GameTimer {
public:
    GameTimer();
    ~GameTimer(){}

    void Update();

    float GetFrameTime();

    inline float GetFramePerSec(){return framesPerSec;}
    inline float GetMillSecPerFrame(){return millSecPerFrame;}

private:
    float secsPerCount;
    _int64 prevTimeStamp;

    float framesPerSec;
    float millSecPerFrame;
};

GameTimer.cpp

#include "GameTimer.h"

GameTimer::GameTimer()  {

    _int64 countsPerSec = 0;
    QueryPerformanceFrequency((LARGE_INTEGER*)&countsPerSec);
    secsPerCount = 1.0f / (float)countsPerSec;

    prevTimeStamp = 0;
    QueryPerformanceCounter((LARGE_INTEGER*)&prevTimeStamp);

    framesPerSec = 0.0f;
    millSecPerFrame = 0.0f;
}

void GameTimer::Update()
{
    static float numFrames = 0.0f;
    static float timeElapsed = 0.0f;

    numFrames += 1.0f;
    timeElapsed += GetFrameTime();

    if(timeElapsed >= 1.0f)
    {
        framesPerSec = numFrames;
        millSecPerFrame = 1000.0f / numFrames;

        numFrames = 0;
        timeElapsed = 0;
    }
}

float GameTimer::GetFrameTime() {
    _int64 currentTimeStamp = 0;
    QueryPerformanceCounter((LARGE_INTEGER*)&currentTimeStamp);
    float timeDiff = (currentTimeStamp - prevTimeStamp) * secsPerCount;
    prevTimeStamp = currentTimeStamp;

    return timeDiff;
}

知道它只是屏幕上的一个三角形(没有复杂的东西被绘制),如果我有VSync关闭,它应该每秒渲染超过1000帧吗?

3 个答案:

答案 0 :(得分:1)

CreateDevice来电中,将PresentationInterval参数的D3DPRESENT_PARAMETERS设置为D3DPRESENT_INTERVAL_IMMEDIATE

答案 1 :(得分:0)

如果你在Windows下,如果你将主题更改为Windows 7 Basic,帧速率是否仍然有限? (关闭桌面组合)我认为DWM在很多场景中强制执行VSync,一些强制缓冲区翻转的旧软件通常需要很长时间才能重新绘制窗口内容。

答案 2 :(得分:0)

你有自己的显示器限制,这意味着GPU可以在1000FPS执行,但显示器显示在60FPS