在应用程序启动时调用XNA GraphicsDeviceManager.ApplyChanges()会导致闪烁

我有一个函数,其中包含以下代码:

GameStateManagementGame.GraphicsDeviceManager.PreferredBackBufferWidth = width; GameStateManagementGame.GraphicsDeviceManager.PreferredBackBufferHeight = height; GameStateManagementGame.GraphicsDeviceManager.IsFullScreen = isFullScreen; GameStateManagementGame.GraphicsDeviceManager.ApplyChanges(); 

在应用程序启动时调用它时,如果isFullScreen = true,即使宽度和高度与桌面分辨率相同,也会有一秒钟或2的非常明显的屏幕闪烁。 如果我没有ApplyChanges(); 调用此操作不会发生(但设置确实应用)。 如果我在没有ApplyChanges()调用的情况下完全启动游戏后调用该函数,则不会应用这些设置。

现在我可以通过在启动时跳过ApplyChanges()调用来解决这个问题,但我想知道为什么会发生这种情况。

我设法找到的关于此问题的唯一信息表明,如果您使用与桌面相同的分辨率或提供过于复杂和破坏的变通方法,则不应发生闪烁。

所以我的问题是上述行为的原因是什么,最好的解决方法是什么?

您在GraphicsDeviceManager上设置的设置适用于以下情况:

  1. 如果你调用ApplyChanges()
  2. 如果你调用ToggleFullScreen()
  3. 通过Game调用Game.Run()时(它创建图形设备)

请注意,修改任何设置都不会导致立即应用这些设置。

你闪烁的可能原因是你正在做#3然后立即做#1(你连续两次应用设置)。

对于初始启动,您应该在游戏类的构造函数中在GraphicsDeviceManager实例上设置正确的设置。 然后,当Game.Run()时,这些设置将是正确的。

仅当用户在游戏运行时更改设置时,才使用ApplyChanges()