[英]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.