XNA全屏:基于缓冲区宽度的不同行为

时间:2013-07-13 09:29:48

标签: c# xna fullscreen

我很难理解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);

我要更改的唯一变量是BufferWidthInPixelsBufferHeightInPixels。以下是一些示例行为: (800,480) - defaultViewport展开以填充整个屏幕,而mainViewport则保留在左上角。到目前为止没有任何问题,尽管理想情况下我希望mainViewport也可以扩展,或者至少在其他方面集中。
(800,600) - defaultViewportmainViewport的大小都没有变化,尽管它们位于屏幕中间。屏幕的其余部分变为纯黑色。仍然很好,虽然理想情况下视口会扩大以填满屏幕 (1200,800) - 程序挂起,将我的屏幕变为纯白灰色。过了一会儿,任务栏出现了,但我必须进入任务管理器并结束这个过程才能再次控制我的电脑。

任何有关这方面的任何见解都将受到赞赏;我无法弄清楚为什么全屏模式在这些情况下表现得如此不同。我的显示器分辨率是1280x800,如果这有助于任何(请注意,这导致我的计算机挂起的分辨率;全屏按预期在1280x800工作)。

1 个答案:

答案 0 :(得分:0)

您的显卡很可能只能全屏处理certian分辨率。您可以通过SupportedDisplayModes进行迭代,以找出设备支持的内容。请注意,这包括刷新率,因此可能会有重复。

foreach (DisplayMode mode in GraphicsAdapter.DefaultAdapter.SupportedDisplayModes) {

}