【问题标题】:XNA fullscreen: differing behavior based on buffer widthXNA 全屏:基于缓冲区宽度的不同行为
【发布时间】:2013-07-13 09:29:47
【问题描述】:

我很难理解 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 上按预期工作)。

【问题讨论】:

  • 你能不能不使用真正的全屏,而只是增加视口大小来填满屏幕?
  • 这可能不相关,但如果您在全屏模式下工作,则值得注意 - 即将进入全屏模式的应用程序应执行以下操作之一:A-set应用程序分辨率与屏幕分辨率完美匹配,B-在窗口应用程序中询问用户使用哪种分辨率。有些屏幕可能对您设置的分辨率非常挑剔。 (另外,请始终包含一个窗口选项!)
  • 哦,另外,请使用graphics.IsFullScreen = true; graphics.ApplyChanges(); 而不是ToggleFullScreen,以确保正确应用设置。
  • @mcmonkey4eva 我可以做这些事情(我的最终目标是提示用户选择适当的屏幕分辨率),但我仍然希望我的程序能够始终如一地运行,无论选择哪种分辨率。我已经尝试切换到您提到的 graphics.ApplyChanges() 模式,但没有任何区别。
  • 为什么你有两个视口?通常,视口应与后台缓冲区的宽度和高度相对应(从(0, 0) 开始。除非有充分的理由,否则不应更改此行为。

标签: c# xna fullscreen


【解决方案1】:

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

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

}

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多