2013-02-25 24 views
2

甚至可以在調整窗口大小的同時繼續渲染和更新,以使其不會延伸?XNA如何在調整大小時進行渲染和更新

+0

我不認爲這是可能的,雖然他們可能是系統調用的一些技巧,並防止窗口暫停,但我必須說,繪圖(更新部分可能是好的),並在調整大小時更改視口大小可能如果在調整大小時最好不要繪製,那麼速度會變慢並且反應遲鈍。 – user1306322 2013-02-25 21:22:40

+0

[此問題/答案對](http://gamedev.stackexchange.com/q/51376/288)可能會有幫助。它告訴你如何繼續渲染(儘管它不能修復拉伸)。 – 2013-03-20 03:08:30

回答

2

這是深入XNA的Game類的行爲。 我正在處理這個確切的問題,但我還沒有一個好的解決方案。 編輯:我現在怎麼找到一個解決方案 - 但它不回答縮放的位 - 所以我已經發布它作爲question/answer pair over here

您可以用反射潛入並斷開在您開始調整大小時暫停遊戲計時器的事件(並在停止時取消暫停)。我還沒有嘗試過這一點,如果不理解爲什麼它們首先存在,我有點不高興。我個人認爲讓我的遊戲訂閱調整大小的開始/結束事件,然後在合適的計時器上自動抽取Update,直到XNA回來爲止。我不會擔心縮放比例顯示)。


解決此問題的一種方法是完全替換Game類。 XNA WinForms Sample提供了一個合適的替換 - 雖然你必須實現你自己的繪製/更新循環和時間。我剛剛在一箇舊的關卡編輯器中測試過它,它的工作原理與您調整大小時一樣。

儘管當窗口變大時它確實放慢了一點,因爲它不斷地重新分配backbuffer使它更大。您可以替換該行爲以使其過度分配後臺緩衝區大小,因此不會經常重新分配。


解決根本問題是與Win32和一些細節在此thread on GameDev.net描述。但它並不真正提供令人滿意的解決方案。

注意到WinForms示例使用其OnPaint方法(並通過不斷調用Invalidate得到一個循環)可能會很有趣。而XNA的內置Game類訂閱Application.Idle

+0

僅僅因爲我是一個新的思考。我如何訪問this.host.suspend並繼續? – 2013-03-27 00:11:35

+0

這應該讓你開始:var fieldInfo = type.GetField(「host」,BindingFlags.NonPublic | BindingFlags.Instance); object host = fieldInfo.GetValue(this);'。其中'type'是'this.GetType()'可能帶有幾個'.BaseType'結尾。在'host'上再次執行'Suspend'和'Resume' - 雖然我認爲你可能需要'GetProperty',而不是在這裏。 (恐怕我沒有確切的代碼,因爲我使用了ExposedObject的修改版本。) – 2013-03-27 01:22:18

+0

我已經設法找到了足夠簡單的主機,但掛起和恢復讓我難倒了。我很積極,我嘗試了所有可能的組合來找到他們,但我想我錯過了一個。無論如何,如果可以讓我知道他們位於何處,它將不勝感激。 – 2013-04-07 06:38:08

相關問題