在不撕裂屏幕的情况下获得较低的帧速率

问题描述 投票:0回答:1

我想在游戏中达到24fps。我可以使用以下代码执行此操作:

IsFixedTimeStep = info.fixedTimeStep;
TargetElapsedTime = TimeSpan.FromSeconds(1f / 24f);

但是,这会导致帧速率不稳定或屏幕破裂,具体取决于是否启用了vsync。我希望情况会是这样,因为显示器的24fps和60fps不匹配。

我决定尝试实现30fps:

IsFixedTimeStep = info.fixedTimeStep;
TargetElapsedTime = TimeSpan.FromSeconds(1f / 30f);

但是此会产生卡顿的图像或屏幕撕裂。我不明白为什么在30fps是60fp监视器刷新的一半时会发生这种情况。也许是因为所涉及的帧速率不精确?

有点谷歌搜索使我发现,通过告诉Monogame同步所有其他屏幕刷新,我可以获得更好的结果:

graphics = new GraphicsDeviceManager(game);
graphics.PreparingDeviceSettings += (sender, e) =>
{
    e.GraphicsDeviceInformation.PresentationParameters.PresentationInterval = PresentInterval.Two;
};

[[编辑1:引起我注意,这是一个坏主意,因为它假定监视器的刷新率为60,所以我甚至需要更好的方法!]

[[编辑1.1:我发现此行指定60fps为基础,然后使用上述达到30fps的技术:

game.TargetElapsedTime = TimeSpan.FromTicks(166666);

]

这给了我大约30fps的速度,但效果平稳。这对我来说是可以接受的结果,但我想知道是否有人能以任何方式完全达到24fps?还是如果没有抖动/撕裂就不可能做到这一点吗?

非常感谢!

[编辑2:在全屏或无边框窗口模式下,我都得到相同的结果。]

c# monogame frame-rate
1个回答
0
投票

嗯,我想出了我认为是最佳的解决方案。这使我获得了24fps的效果,并且效果非常流畅(可能达到24 fps的流畅度)。

IsFixedTimeStep = true;

TargetElapsedTime = TimeSpan.FromTicks(208333); // 48fps (will be halved to 24fps).

// The following effectively halves the frame rate to 24fps by syncing every other refresh.
graphics.PreparingDeviceSettings += (sender, e) =>
{
    e.GraphicsDeviceInformation.PresentationParameters.PresentationInterval = PresentInterval.Two;
};

与使用TimeSpan.FromTicks(416666)将其设置为24fps相比,它提供了更好的结果。我不确定为什么会这样。

30fps可通过将FromTicks值调整为60fps来实现,然后将其减半至30fps。再次,它为我带来的效果要比仅瞄准30fps的效果更好。

© www.soinside.com 2019 - 2024. All rights reserved.