簡體   English   中英

窗口/全屏切換之間滯后

[英]Lag between windowed/fullscreen switch

我正在創建XNA游戲,並添加了在全屏或窗口模式下使用游戲的選項。

         // full screen on
        if (optionsMenu.buttonWithIndexPressed(7) && !game.graphics.IsFullScreen)
        {
            game.settings.fullScreen = true;
            game.graphics.ToggleFullScreen();
        }
        //fullscreen off
        if (optionsMenu.buttonWithIndexPressed(8) && game.graphics.IsFullScreen)
        {
            game.settings.fullScreen = false;
            game.graphics.ToggleFullScreen();

        }

當我更改此選項時,除了會導致所有屏幕變黑幾秒鍾的延遲之外,其他所有功能都可以正常工作。 這種滯后真的困擾着我。 是否可以通過一種方法來減少延遲時間?

您可以嘗試使用以下方法(無經驗)進行無邊界窗口方法(即使XNA並不真正支持這種方法):

IntPtr hWnd = this.Window.Handle;
var control = System.Windows.Forms.Control.FromHandle( hWnd );
var form = control.FindForm();
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
form.WindowState = System.Windows.Forms.FormWindowState.Maximized;

但是,每次調整大小時,您的游戲都會停頓一會兒,因為需要重新初始化后緩沖。 有一些巧妙的方法可以避免調整大小時出現問題,但實際上並不能全屏顯示,因此建議使用無邊界的窗口。

另外,請使您的LoadContent()實現盡可能短,並且僅加載當時所需的內容。 每當您的D3D(XNA)窗口更改上下文時,將調用LoadContent()並將暫停游戲,直到完成重新加載所有資源為止,因此請考慮更動態地加載資源。


附加信息

考慮制作游戲渲染所有通過的紋理。 然后,使用一個非常簡單的點樣本着色器,將最終的游戲紋理(在較低的所需分辨率上)繪制到實際的后緩沖(即較高的屏幕分辨率)上。

//yourxnarenderclass.cs
graphicsDevice.SetRenderTarget(null); //targets your backbuffer, which should be your full screen resolution
yourEffect.Parameters["InputTexture"].SetValue(finalGameTexture);
yourEffect.CurrentTechnique = yourEffect.Techniques["Simple"];
foreach (EffectPass pass in yourEffect.CurrentTechnique.Passes)
{
    pass.Apply();
    quadRender.Render(Vector2.One * -1, Vector2.One);
}

要了解有關使用四邊形渲染的更多信息,請參見在紋理上使用基本效果(MSDN)

您的輸入采樣器是標准的:

//HLSL effect.fx
texture InputTexture; 
sampler inputSampler = sampler_state      
{
            Texture   = <InputTexture>;
            MipFilter = Point;
            MinFilter = Point;
            MagFilter = Point;
            AddressU  = Clamp;
            AddressV  = Clamp;
};

還有您的像素着色器:

VS_OUTPUT FullScreenVS( float3 InPos  : POSITION,
                        float2 InTex  : TEXCOORD0)
{
    VS_OUTPUT Out = (VS_OUTPUT)0;
    // Offset the position by half a pixel to correctly align texels to pixels
    Out.Position = float4(InPos,1) + 0.5f* float4(-1.0f/renderTargetSize.x, 1.0f/renderTargetSize.y, 0, 0);
    Out.TexCoords = InTex;
    return Out;
}

這是經過嘗試和測試的。 其中涉及更多代碼,但是太復雜了,無法在此處進行詳細介紹。 我建議您閱讀有關如何在XNA中實現自己的Effects的知識 ,以便上面的代碼在上下文中更有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM