【问题标题】:What's the simples way of adjusting frame rate in c++?在c ++中调整帧速率的简单方法是什么?
【发布时间】:2015-02-21 19:07:38
【问题描述】:

我有一个 while 循环,它使用 openGL 在窗口上显示内容,但与它在其他计算机上的运行方式相比,动画太快了,所以我需要在循环中设置一些内容,它只允许在上一个之后显示 1/40 秒显示,我该怎么做? (我是 C++ 菜鸟)

【问题讨论】:

  • 请向我们展示您的代码。
  • 你做错了,事情不应该依赖于FPS。但是你可以去阅读一些游戏源代码,例如。
  • @SargeBorsch 实际上,游戏以固定帧速率运行是很常见的。当然有些游戏使用可变帧速率,但我不认为 FIFA 或英雄公司(仅举出许多固定帧速率游戏中的两个)开发人员“做错了”。
  • @mattnewport 这是错误的,因为固定帧速率会限制运动平滑度并增加显示延迟(不是每个人都可以拥有 120+ fps,将 60fps 设置为硬限制对于那些可以拥有 120+ fps 的人来说是不利的)。简而言之,固定的 FPS 限制了游戏潜力,而且很糟糕。
  • @ĬnfernalSeraphím 如果您的计算机因软件而损坏,那么从一开始就不好。设计合理的计算机具有过热保护功能。

标签: c++ opengl animation while-loop frame-rate


【解决方案1】:

您需要在循环开始时检查时间,在完成所有渲染和更新逻辑后在循环结束时再次检查时间,然后 Sleep() 以了解经过时间之间的差异和目标帧时间(40 fps 为 25 毫秒)。

【讨论】:

    【解决方案2】:

    这是我在 C++ 中与 SDL 库一起使用的一些代码。基本上,您需要有一个函数在循环开始时启动计时器(StartFpsTimer())和一个函数来等待足够的时间,直到根据您想要的恒定帧速率(WaitTillNextFrame() )。

    m_oTimer 对象是一个简单的计时器对象,您可以启动、停止、暂停。 GAME_ENGINE_FPS 是您想要的帧速率。

    // Sets the timer for the main loop
    void StartFpsTimer()
    {
        m_oTimer.Start();
    }
    
    // Waits till the next frame is due (to call the loop at regular intervals)
    void WaitTillNextFrame()
    {
        if(this->m_oTimer.GetTicks() < 1000.0 / GAME_ENGINE_FPS) {
            delay((1000.0 / GAME_ENGINE_FPS) - m_oTimer.GetTicks());
        }
    }
    
    while (this->IsRunning())
    {
        // Starts the fps timer
        this->StartFpsTimer();
    
        // Input
        this->HandleEvents();
    
        // Logic
        this->Update();
    
        // Rendering
        this->Draw();
    
        // Wait till the next frame
        this->WaitTillNextFrame();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多