切换屏幕时XNA 4.0中的紫色屏幕 - 后备缓冲数据消失(最有可能?)

时间:2013-03-30 04:58:46

标签: .net xna screen

我正在和朋友一起尝试XNA 4.0,我们正在实施一个暗示切换屏幕的游戏,常见的东西,如MainMenu,GamingScreen,MultiplayerScreen等。

我遇到的问题是,仅在我的Windows7塔上,而不是在我朋友的任何计算机上,当我从主菜单切换屏幕时,我会看到一个紫色的死屏。我将以GamingScreen为例。

我们的Game1有一个currentScreen(ENUM WhichScreen)属性。它从MainMenu开始,在每次Draw和每次Update时,我们打开currentScreen来选择调用Draw和Update的屏幕。因此,当Game1.UpdateGame1.Draw交替时,它可能按顺序排列如下:

MainMenuScreen.Draw
MainMenuScreen.Update
GamingScreen.Draw
GamingScreen.Update
GamingScreen.Draw

在MainMenuScreen s update, its components (homemade class) are updated, and it happens that中,Game1.currentScreen`从MainMenu更改为Gaming。

但出于某种原因,在Draw()上,最准确地在EndDraw()(根据我的理解,GraphicsDevice.Present),屏幕变为紫色。

我已经尝试了大量的调试方法并解析了这些论坛,但无济于事。暂停Draw(例如等待GamingScreen更新)是不够的,因为屏幕将再次变为紫色。

重要说明:我已将其设置为在GameingScreen dars之前MainMenuScreen绘制AND GamingScreen更新。发生的事情非常奇怪:它的MainMenu的画画引起了紫色的画面!

所以,我所处的位置是:从更新中的一部分到EndDraw()的某个地方,在某一点上,后备缓冲器在没有明显原因的情况下自行拧紧,然后GamingScreen即使进入任何行动也是如此。

当屏幕变为紫色时,我检查并检测到this.UponDeactivate()被调用。但是,拨打this.UponActivate()并没有帮助我。

在pruple屏幕之后: - 在Game1上仍然成功地调用了更新 - > GamingScreen,甚至覆盖紫色作品下隐藏的按钮(我得到按钮悬停的声音) - 画面也被称为,但没有成功,因为屏幕保持紫色。 - 最小化窗口并重新打开窗口去除紫色并使其工作。这听起来非常重要,这就是我致电this.UponActivate()的原因。

为了做一个总结,我不知道是什么原因导致后台缓冲区变得空虚。它必须通过单击按钮进行更改,但奇怪的部分是单击已经拧紧屏幕的方式。

很难给出重要部分中类之间调用的所有代码。在changeGameState之后,按钮完成了他的execute(),然后它的面板完成了更新,然后大面板本身更新了另一个面板。然后,我们回到了Game1的代码中,它只使用Update()完成base.Update()(我也尝试将base.Update()置于更新的顶部,但无效),然后转到BeginDraw。稍后,EndDraw()清空屏幕。

调用base.Update的顺序(Draw或Laft的第一个,更新的第一个或Update()的最后一个)是否重要? - >是什么导致后备人员像这样发疯?天啊,可以在Draw()完成前拨打Update()来拨打电话吗?或其他Update() s?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

紫色屏幕表示未初始化的缓冲区。

调用SetRenderTarget(包括null,后备缓冲区目标)将清除您设置为该紫色的目标,除非该目标设置了RenderTargetUsage.PreserveContents(具有性能)影响)。

通常,您需要设置渲染,以便首先渲染渲染目标,然后再渲染后备缓冲区。永远不要换回你之前吸引的缓冲区。

背面和前面的缓冲区也都是紫色的。因此,即使您没有使用渲染目标,如果您将缓冲区交换到前面(Present,来自EndDraw)而不实际绘制它,您将看到这一点。