窗口/全屏切换之间的滞后

时间:2014-05-05 12:11:17

标签: c# xna fullscreen

我正在创建一个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();

        }

当我更改此选项时,一切正常,除了延迟导致所有屏幕变黑几秒钟。这种滞后真让我烦恼。是否有可能以这种或那种方式减少延迟的时间?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用以下(未经测试)进行无边框窗口方法(即使通过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;

然而,每当你调整大小时,你的游戏都会因为需要重新初始化而需要断断续续。有一些hacky方法可以避免在调整大小时出现任何打嗝,但实际上并不是实际全屏,因此无边框窗口的推荐。

此外,尽可能缩短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);
}

要了解有关使用四边形渲染的更多信息,请参阅Using a Basic Effect with Texturing (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,以便上面的代码在上下文中更有意义。

相关问题