2013-07-13 28 views
0

我很難理解視口如何受到XNA全屏模式的影響。在窗口模式下一切正常,但是當我打電話給graphics.ToggleFullScreen()時,根據調用前後緩衝區寬度的大小,會發生不同的事情。這就是我認爲潛在的相關代碼。它拆分爲兩大類:XNA全屏:基於緩衝區寬度的不同行爲

// 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)。

+0

你可能不使用真正的全屏,而只是增加視口尺寸來填滿屏幕? – user1306322

+0

它可能不相關,但它是值得,如果你在全屏工作提 - 一個應用程序,即將進入全屏模式,第一次應執行下列操作之一:A-設置應用程序分辨率屏幕完美匹配分辨率,B - 在窗口應用程序中詢問用戶使用哪種分辨率。某些屏幕可能會對你設置的分辨率產生很大的挑剔。 (另外,請始終包含窗口選項!) – mcmonkey4eva

+0

哦,另外,使用'graphics.IsFullScreen = true; graphics.ApplyChanges();'而不是'ToggleFullScreen',以確保設置正確應用。 – mcmonkey4eva

回答

0

您的圖形卡很可能只能在全屏幕下處理certian分辨率。您可以遍歷SupportedDisplayModes來找出設備支持的內容。請注意,這包括刷新率,因此可能會有重複。

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

}