我正在创建一个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();
}
当我更改此选项时,一切正常,除了延迟导致所有屏幕变黑几秒钟。这种滞后真让我烦恼。是否有可能以这种或那种方式减少延迟的时间?
答案 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,以便上面的代码在上下文中更有意义。