1

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

我遇到的问题是,仅在我的 Windows7 塔上,而不是在我朋友的任何计算机上,从 MainMenu 切换屏幕时出现紫屏死机。我将以去 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 thatGame1.currentScreen` 从 MainMenu 更改为 Gaming。

但是由于某种原因,Draw()最准确地说是在EndDraw() (据我所知, GraphicsDevice.Present),屏幕变成紫色。

我尝试了很多方法来调试和解析这些论坛,但无济于事。暂停抽奖(例如等待 GamingScreen 更新)是不够的,因为屏幕会再次变为紫色。

重要提示:我已将其设置为 MainMenuScreen Draws AND GamingScreen Updates before GameingScreen dars。发生的事情很奇怪:是MainMenu的Draw导致了紫屏!

所以我的观点是:从更新中的点击部分到EndDraw()某个时间点,在 GamingScreen 甚至进入任何操作之前,后台缓冲区会无缘无故地自行拧紧。

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

在出现紫色屏幕后: - 在 Game1 -> GamingScreen 上仍然成功调用更新,甚至翻过隐藏在紫色作品下的按钮(我听到按钮悬停的声音) - 也调用了 Draws,但没有成功,因为屏幕保持紫色。- 最小化窗口并重新打开它可以去除紫色并使其正常工作。这听起来很重要,这就是我打电话的原因this.UponActivate()

总结一下,我不知道是什么导致后台缓冲区因为空而发疯。它必须通过单击按钮进行更改,但奇怪的部分是如何仅单击就已经搞砸了屏幕。

很难为您提供重要部分的类之间调用的所有代码。在 changeGameState 之后,按钮完成了他的 execute(),然后它的面板完成了更新,然后大面板自己更新了另一个面板。然后,我们回到 Game1 的代码,它简单地以结束Update()base.Update()我也尝试将base.Update()Update 放在顶部,但无济于事),然后转到 BeginDraw。稍后,EndDraw()清空屏幕。

调用 base.Update的顺序(Draw 的第一个或 Draw 的 laft、Update 的第一个或最后一个Update())是否重要?--> 是什么导致后台缓冲区像这样发疯?哦,上帝,可以在Draw()之前和Update()完成之前拨打电话吗?还是其他Update()的?

非常感谢你的帮助!

4

1 回答 1

1

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

调用SetRenderTarget(包括 with null,后缓冲目标)将清除您设置为紫色的目标,除非该目标已RenderTargetUsage.PreserveContents在其上设置(这会影响性能)。

通常,您希望设置渲染,以便首先渲染渲染目标,然后渲染后备缓冲区。永远不要换回您之前绘制的缓冲区。

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

于 2013-03-30T06:10:05.830 回答