Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA全屏:基于缓冲区宽度的不同行为_C#_Xna_Fullscreen - Fatal编程技术网

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

C# XNA全屏:基于缓冲区宽度的不同行为,c#,xna,fullscreen,C#,Xna,Fullscreen,我很难理解XNA中的全屏模式是如何影响视口的。在窗口模式下一切正常,但当我调用graphics.ToggleFullScreen()时,根据调用前backbuffer宽度的大小,会发生不同的情况。以下是让我印象深刻的潜在相关代码;它分为两类: // in the Game class GraphicsDeviceManager graphics; Viewport defaultViewport; Viewport mainViewport; /

我很难理解XNA中的全屏模式是如何影响视口的。在窗口模式下一切正常,但当我调用
graphics.ToggleFullScreen()
时,根据调用前backbuffer宽度的大小,会发生不同的情况。以下是让我印象深刻的潜在相关代码;它分为两类:

    // 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
。以下是一些示例行为:
(800480)--
defaultViewport
展开以填充整个屏幕,而
mainViewport
保持在左上角。到目前为止没有问题,尽管理想情况下我希望
mainViewport
也能展开,否则至少要居中。
(800, 600)无论是<代码> Debug查看端口>代码>,也不是<代码>主视图端口>代码>大小改变,尽管它们位于屏幕中间。屏幕的其余部分变成纯黑色。仍然很好,但理想情况下,视口会扩展以填充屏幕。
(1200,800)--程序挂起,将我的屏幕变成纯白灰色。过了一会儿,任务栏出现了,但我必须进入任务管理器并结束该过程,然后才能重新控制我的计算机


如能对此有所了解,将不胜感激;我不明白为什么全屏模式在这些情况下表现得如此不同。我的显示器分辨率是1280x800,如果这有帮助的话(请注意,这不是导致我的计算机挂起的分辨率;全屏在
1280x800
时按预期工作)。

您的图形卡很可能只能在全屏时处理特定分辨率。您可以反复查看
支持的显示模式
,以了解设备支持的内容。注意:这包括刷新率,因此可能会有重复

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

}

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