每秒锁定帧数至 60fps

本文关键字:60fps 锁定 | 更新日期: 2023-09-27 18:31:58

我从 FPS 上的 Extra Credits 看到了这一集,他们提到您通常应该将 fps 锁定为 30 的倍数,因为它与显示器的刷新率相匹配并减少伪影。我的代码以 60fps 的速度运行,但我在运动中仍然出现非常微妙的伪影。

https://www.youtube.com/watch?v=zL5kOyHWI_E

它在 Windows 窗体中,所以也许真的没有什么可做的。

我的渲染循环如下所示:

private void Render() {
    Update();
    if (RenderDelegate != null)
        RenderDelegate(_renderFunctions);
    var msPause = 1000 / (double)FpsLimit - _gameTime.DeltaTime;
    if (msPause > 0)
        System.Threading.Thread.Sleep((int)msPause);
    _attachedSystem.NextFrame(); // Will call Invalidate();
}

WinForms 控件中的实现

protected void FormOnPaint(object sender, PaintEventArgs paintEventArgs) {
    _graphic = paintEventArgs.Graphics;
    _render();
}
void IGameMessages.DrawImage(Image image, Rectangle rect) {
    _graphic.DrawImage(image, rect);
}
void IGameMessages.NextFrame() {
    Control.Invalidate();
}

我猜按动态值睡觉不是首选方式,因为它可能与显示器刷新率不同步 1% 或其他什么?fps 输出在 58 到 63 fps 之间摆动(DeltaTime 计算也可能有问题)

每秒锁定帧数至 60fps

WinForm并不理想。原因是屏幕更新不依赖于您的应用程序。WinForms 中没有屏幕中断。

我保留了一个计时器,并从左到右移动了一个对象,800 像素,类似"精灵"的对象有一个起始计数器整数。根据过去了多少时间,采取了新的职位。

if(!x.AtEnd) {
    X.DeltaTime = X.Startime-currentTime;
    int x = myStartTime - currentTime;
    x.position = X.DeltaTime % 430; //time was in ms and 430 just a number 
    if (x.postion > x.end) {
        x.position=x.end;
        x.AtEnd=true;
    }
}

有点取决于它移动的速度和外观(这也取决于计算机速度,因为较慢的计算机也需要更多时间在其他线程上执行)。使用上面这样的东西,我得到了一个合理的平滑移动对象,不像游戏中那样流畅,但它运行良好,并且其中没有阻塞(延迟)代码(因为我尝试使用线程延迟,所以每个移动花费相同的时间,但这也没有变得流畅,屏幕更新太随机了)