2011-09-26 66 views
1

我想在SlimDX Direct3d9設備中設置狀態。SlimDX - 設置狀態塊

我有在frameRender函數beging的代碼。

 device.BeginStateBlock(); 
     device.SetRenderState(RenderState.ZEnable, false); 
     device.SetRenderState(RenderState.Lighting, false); 
     device.SetRenderState(RenderState.CullMode, Cull.None);    
     device.EndStateBlock(); 

但我發現了這個錯誤在調試窗口:

Object of type SlimDX.Direct3D9.StateBlock was not disposed. Stack trace of object creation: 

我得到數以百萬計的線。他們都說同樣的事情。 我應該如何處理這些狀態?如何正確使用它?

回答

1

根據你的信息,我可以給你的唯一提示就是EndStackeBlock應該返回一個StateBlock對象,它是一次性的。我的猜測是,你在LostDevice事件後得到這些信息?在重置設備之前,您需要釋放所有這些資源。 當然,製作StateBlocks的全部原因是讓你創建一次並重用它們,但似乎你每次都在重新創建它們,並且從不應用它們。因此,過了一段時間,您創建了很多狀態塊,而不使用或丟棄它們中的任何一個。 但也許你可以發佈更多的代碼或提供更多信息。

+0

那麼我應該如何使用它們?在哪裏創建它們以及如何應用它們?我應該把它們應用到每一幀?我應該每幀處理它們嗎? – Hooch

+1

我不得不說,我不是那方面的專家,所以我可以或多或少地猜測。我會在應用程序的開始部分創建一個狀態塊,一個用於您需要的每個獨特的狀態塊。然後,您可以使用Apply方法來使用該塊,繪製該塊需要繪製的所有內容。請記住,directx是一種狀態機,一旦設置它保持設置,除非未設置或其他設置。在丟失設備並且您想要重置或關閉應用程序時,應該在另一方面進行處置。不幸的是,這就是我所能說的,我會試試這種方式。 – dowhilefor