2013-03-30 36 views
1

我在XNA 4.0和朋友一起嘗試我的手,我們正在實現一個遊戲,意味着切換屏幕,像MainMenu,GamingScreen ,多人屏幕等等。XNA 4.0中的紫色屏幕在切換屏幕時 - backbuffer數據消失(最有可能嗎?)

我現在的問題是,只有在我的Windows7塔臺上,沒有任何朋友的電腦,當從MainMenu切換屏幕時,我得到了死亡的紫色屏幕。我將以GamingScreen爲例。

我們的Game1有一個currentScreen(ENUM WhichScreen)屬性。它從MainMenu開始,在每個Draw和每個更新中,我們打開當前屏幕選擇要調用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的到遊戲改變。

但由於某種原因,在Draw(),最準確地在EndDraw()(據我瞭解,GraphicsDevice.Present),屏幕變成紫色。

我已經試過噸的方式來調試和解析這些論壇,但無濟於事。暫停繪圖(例如等待GamingScreen更新)是不夠的,因爲屏幕會再次變成紫色。

重要注意事項:我已經設置了它,以便MainMenuScreen在GameingScreen達斯之前繪製並且GamingScreen更新。發生的事情非常奇特:這是MainMenu的Draw,引起了紫色屏幕!

因此,我所處的位置是:從更新到EndDraw()的更新部分的某個位置,有一點,後置緩衝器在沒有任何明顯原因的情況下自行擰螺絲,然後GamingScreen甚至會輸入任何操作。

當屏幕變成紫色時,我檢查並檢測到this.UponDeactivate()被調用。然而,撥打this.UponActivate()並沒有幫助我。

的pruple屏幕後會出現: -The更新仍然成功地呼籲的Game1 - > GamingScreen,甚至在紫色的作品下隱藏的按鈕去(我得到的按鈕懸停聲音) -The繪製也被稱爲,但屏幕保持紫色不成功。 - 最小化窗口並重新打開窗口消除紫色並使其工作。這聽起來很重要,這就是我叫this.UponActivate()

作爲一個總結,我不知道是什麼原因導致back buffer變得空虛而生氣。它必須通過點擊按鈕來改變,但奇怪的部分是如何點擊已經擰了屏幕。

很難給你所有在重要部分的類之間調用的代碼。 changeGameState後,按鈕完成他的execute(),然後它的面板完成更新,然後大面板本身更新另一個面板。然後,我們重新回到了Game1的代碼中,它簡單地完成Update()base.Update()(我也嘗試將base.Update()放到Update的頂部,無濟於事),然後繼續前進到BeginDraw。稍後,EndDraw()清空屏幕。

其中base.Update被調用的順序(Draw的第一個,Draw的第一個更新還是最後一個Update())是否重要? - >什麼會導致backbuffer像這樣瘋狂?哦,上帝,可以打電話給Draw()之前和Update()完成?或其他Update() s?

非常感謝您的幫助!

回答

1

紫色屏幕顯示未初始化的緩衝區。

調用SetRenderTarget(包括null,後備緩衝目標)將清除您設置爲紫色,除非該目標上有RenderTargetUsage.PreserveContents集(其中有性能問題)的目標。

通常,您要設置渲染,以便渲染目標先渲染,然後渲染緩衝區。切勿切換回先前繪製的緩衝區。

前後緩衝區也都是紫色的。因此,即使您沒有使用渲染目標,如果您將緩衝區交換到前端(Present,從EndDraw),而不實際繪製緩衝區,您也會看到這一點。

+0

那麼我該如何解決我的問題?我(尚未)使用Renderer,並且我不知道何時應用它們來解決我的問題。你的意思是我應該使用setRenderTarget(null)每次我的緩衝區是這樣的空嗎? –

+0

恐怕您的問題中提供的信息不足以縮小問題的位置(您告訴我們有關您所調用的功能 - 但它們是*您的*功能 - 我不知道它們的功能!)。所以我給你提供了在XNA中可以發生紫色屏幕的兩種合理方式。如果你(或任何第三方庫)永遠不會調用SetRenderTarget,那麼很可能你沒有繪製到後臺緩衝區,或者沒有將後臺緩衝區翻到前面(例如:通過重寫'Game.EndDraw '但沒有調用'base.EndDraw()')。問題出在你的代碼中。 –