2010-02-09 64 views
1

我有一個XNA應用程序呈現到第二個監視器(適配器1),定期它會自己截圖並將其存儲爲Texture2D。同時GraphicsDevice在不同的線程

隨着此應用程序啓動,它還顯示一個帶有面板的Windows窗體。該面板應該由獨立的GraphicsDevice繪製,並顯示Texture2D。

我遇到的問題是,正如我在Windows窗體運行該代碼創建的GraphicsDevice:

mainDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, panel1.Handle, pp); 

我得到一個DeviceLostException。這種情況下的標準建議是捕捉異常,讓線程休眠幾秒鐘然後重試,但這隻會讓我陷入無限循環。

我懷疑這是因爲我的XNA類在同一時間使用硬件,而我正在考慮這是錯誤的方式。但是我無法找到任何關於如何正確執行此操作的文檔。

任何幫助將不勝感激。

回答

1

GraphicsDevice是一個物理設備,不是附加到窗口的東西。如果您有兩個物理設備,則可以使用不同的GraphicsAdapter(不是默認設置)實例化另一個GraphicsDevice。

如果您不打算在設備上施加太多負載,或者其中一個不需要大量硬件加速,則可以改爲創建軟件設備。這些功能可能相似,但會變慢很多。

除此之外,我能想到的唯一的事情就是看看XNA是否支持命令緩衝區(我不確定它是否確實如此)並自己管理/鎖定設備。

0

我希望我錯了,因爲它會很酷。但我不相信XNA API允許您使用雙重圖形設備一次渲染到兩個獨立的顯示器上。

3

如果我沒有錯,您試圖在兩個不同的顯示器上同時繪製兩個不同的應用程序(或者更好地放置兩個不同的GraphicsDevice對象)。

讓我們先看看正確的東西。

物理上你有一個顯示卡和一個顯示器。當然,大多數視頻交互平臺,比如DirectX,OpenGL,XNA等主要在視頻卡上播放,而不是處理器,對吧?

現在,在基於編程的概念中,我們有GraphicsDevice類和GraphicsAdapter類。鈴響了嗎?

雖然GraphicsDevice和Videocart以及GraphicsAdapter和監視器之間沒有確切的關聯,但這些對象之間存在非常密切的關係。

GraphicsDevice實際上並不代表一個顯示卡(儘管Jeff用一種非常簡單的方式使其可以理解)。 GraphicsDevice對象是與視頻卡的INTERACTOR。類似地,我們可以認爲GraphicsDevice對象是一個繪畫教師,指示繪畫師(視頻卡)在哪裏繪畫。它旨在指導如何完成這些任務。

GraphicsAdapter與監視器的關係稍微靠近一點,所以我們將在我們的比喻中看到它作爲畫布。

現在讓我們來看看。想象一下,我們的繪畫師擁有與Videocard支持的GraphicsAdapters一樣多的武器。這意味着它可以在同一時間繪製儘可能多的畫布。

以編程方式,我們可以爲painter及其畫布實例化儘可能多的GraphicsDevice。每位教師都可以告訴繪畫師在不同的畫布上繪製不同的東西。但是,如果兩位導師告訴他在同一張畫布上繪製不同的東西,畫家會不會有點困惑?

當然會。畫家一次只能在畫布上進行繪畫指導(當然,這看起來非常膚淺,但足以理解這個概念)。這就是爲什麼你不能在同一個適配器上實例化和訪問兩個圖形設備的原因。只要適配器更改其圖形設備(教師),其他教師就會「丟失」。意思是說,他在一段時間內沒有注意到,直到另一位老師完成了,無論教師告訴畫家(比如,使用什麼畫筆,畫什麼顏色)都會被遺忘。

GraphicsDevice因此是一個「LostDevice」。因此,當您將另一個應用程序繪製在適配器上時,該視頻卡和適配器的任何設備(最近創建或未創建)都將丟失,直到其他應用程序釋放實際設備(視頻卡)。

只有一個GraphicsDevice可以在一個適配器上同時執行。

正如Jeff所說,在創建其他GraphicsDevice時使用其他適配器(顯示器)。另一種選擇是協調這兩個應用程序的操作,如果您希望繪製到同一個顯示器上。其他選項是,你把所有的東西都放在窗口中,因爲當事情「窗口化」時,操作系統擁有設備,這意味着操作系統負責組合應用程序的繪圖。 (它的問題,不是你的)