2011-09-26 74 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