我很难理解 XNA 中的全屏模式如何影响视口。在窗口模式下一切正常,但是当我调用 时graphics.ToggleFullScreen()
,会根据调用前后台缓冲区宽度的大小发生不同的事情。这是让我印象深刻的潜在相关代码;它分为两个类:
// in the Game class
GraphicsDeviceManager graphics;
Viewport defaultViewport;
Viewport mainViewport;
// in the constructor:
graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferWidth = Settings.BufferWidthInPixels;
graphics.PreferredBackBufferHeight = Settings.BufferHeightInPixels;
// in the initialize method, setting up the two viewports:
defaultViewport = GraphicsDevice.Viewport;
mainViewport = new Viewport();
mainViewport.Width = (int)(Settings.DefaultBufferWidth * Settings.StretchFactor);
mainViewport.Height = (int)(Settings.DefaultBufferHeight * Settings.StretchFactor);
mainViewport.X = (Settings.BufferWidthInPixels - mainViewport.Width) / 2;
mainViewport.Y = (Settings.BufferHeightInPixels - mainViewport.Height) / 2;
// in the Settings class:
public static readonly int DefaultBufferWidth = 800;
public static readonly int DefaultBufferHeight = 480;
// the following two variables are what I change to get different window sizes and hence different performance in fullscreen mode:
public static readonly int BufferWidthInPixels = 1200;
public static readonly int BufferHeightInPixels = 800;
public static readonly float StretchFactor = Math.Min((float)BufferWidthInPixels / DefaultBufferWidth, (float)BufferHeightInPixels / DefaultBufferHeight);
public static readonly Vector3 ScreenScalingFactor = new Vector3(StretchFactor, StretchFactor, 1);
public static readonly Matrix BaseScreenSizeTransformation = Matrix.CreateScale(ScreenScalingFactor);
我要更改的唯一变量是BufferWidthInPixels
和BufferHeightInPixels
。以下是一些示例行为:
(800, 480) --defaultViewport
展开以填满整个屏幕,而mainViewport
留在左上角。到目前为止没有问题,尽管理想情况下我也希望mainViewport
扩展,或者至少在其他情况下居中。
(800, 600) -- 大小都defaultViewport
没有mainViewport
变化,尽管它们位于屏幕中间。屏幕的其余部分变为纯黑色。仍然很好,尽管理想情况下视口会扩大以填满屏幕。
(1200, 800) -- 程序挂起,将我的屏幕变成纯白灰色。片刻后任务栏出现,但我必须进入任务管理器并结束该过程,然后才能重新控制我的计算机。
任何对此的见解将不胜感激;我无法弄清楚为什么在这些情况下全屏模式的行为如此不同。我的显示器分辨率是 1280x800,如果有帮助的话(请注意,这不是导致我的计算机挂起的分辨率;全屏按预期工作1280x800
)。