C# 窗口/全屏开关之间的延迟

C# 窗口/全屏开关之间的延迟,c#,xna,fullscreen,C#,Xna,Fullscreen,我正在创建一个XNA游戏,并添加了全屏或窗口使用游戏的选项 // full screen on if (optionsMenu.buttonWithIndexPressed(7) && !game.graphics.IsFullScreen) { game.settings.fullScreen = true; game.graphics.ToggleFullScreen();

我正在创建一个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;
但是,每当您调整大小时,您的游戏都会停顿片刻,因为需要重新初始化backbuffers。有很多方法可以避免在调整大小时出现任何问题,但实际上不适合全屏显示,因此无边界窗口推荐

另外,让LoadContent实现尽可能短,并且只加载您当时需要的内容。每次你的D3D XNA窗口改变上下文,都会调用LoadContent,直到它完成所有资源的重载,才会停止你的游戏,所以考虑更动态地加载你的资源。 附加信息 考虑制作一个纹理,让游戏渲染所有过程。然后,用一个非常简单的点采样着色器,将最后一个游戏纹理绘制到实际的backbuffer上,这是一个更高的屏幕分辨率

//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);
}
要了解有关使用四边形渲染的详细信息,请参见

您的输入采样器是标准的:

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

这是经过考验的。这里涉及到更多的代码,但太复杂了,无法在这里详细介绍。我建议大家阅读一下如何在XNA中实现自己的代码,这样上面的代码在上下文中就更有意义了。

事实并非如此。我是xna的noob,但我很确定,切换到/从全屏模式与图形系统有很大关系。你可以做的是不要进入真正的全屏,而是使用一些假的桌面大小的无边框窗口,这肯定会降低成本,不会再给你带来太多麻烦。哇,这真的快了很多,但我真的需要graphics.ToggleFullscreen所做的。这意味着当游戏进入全屏时,我希望保留旧的分辨率。你可以使用此方法,但将backbuffers设置为全屏显示器分辨率,然后使用最终输出着色器,从640x480或任何游戏中,只显示游戏的最终视图,到处于监视器分辨率的backbuffer。请确保您的采样过滤器模式是此点!点采样确保了纹理之间的清晰边缘,这对于保留复古外观和您想要的声音非常有用。你不能用图形来做你要求的事情。切换全屏,因为这会改变视频模式。你能用代码更新答案以保持相同的分辨率吗?我添加了一些信息。在回答中很难涵盖整个XNA渲染管道,所以我只包含了您需要的效果位。希望它至少能让你走上正确的道路,我花了很长时间才弄明白。
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;
}