【问题标题】:Turned off VSync but still getting 60FPS in my DirectX 9 application关闭 VSync 但在我的 DirectX 9 应用程序中仍然获得 60FPS
【发布时间】:2013-05-31 11:22:00
【问题描述】:

我有一个 DirectX9 应用程序,它只在屏幕上渲染一个三角形,但无论我是否启用了垂直同步,我都能获得 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;
}

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

【问题讨论】:

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


    【解决方案1】:

    CreateDevice调用中,将D3DPRESENT_PARAMETERS参数的PresentationInterval设置为D3DPRESENT_INTERVAL_IMMEDIATE

    【讨论】:

      【解决方案2】:

      如果您在 Windows 下,如果您将主题更改为 Windows 7 Basic,帧率是否仍然受到限制? (关闭桌面合成)我认为 DWM 在很多情况下都会强制执行垂直同步,一些强制缓冲区翻转的旧软件通常需要很长时间才能重绘其窗口内容。

      【讨论】:

      • 感谢您的回复。我不知道您是如何关闭桌面合成的,但我将其更改为 Windows 7 Basic,但问题仍然存在 - 仍然在 60FPS 左右
      • 一些驱动程序提供强制垂直同步的能力。你的 nVidia 控制面板/AMD/ATi/Intel 等价物有什么吗?
      • 我使用的是 nVidia 显卡,我确实使用控制面板关闭了垂直同步
      • 在这种情况下,我认为很可能没有正确禁用垂直同步。你是怎么做到的?
      • NVIDIA 控制面板 > 管理 3D 设置 > 全局设置 > 垂直同步(关闭)
      【解决方案3】:

      你得到了显示器本身的限制,这意味着 GPU 可能可以以 1000FPS 执行,但显示器以 60FPS 显示它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-26
        • 2012-05-07
        • 1970-01-01
        • 2015-09-28
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        相关资源
        最近更新 更多