I've been working on a DirectX application in C#, and I noticed that when I lock the workstation, the DirectX "Device" becomes lost. After looking up the information about what to do upon when a device is lost (and when a DeviceLostException
is thrown by Device.Present
), I re-wrote the code to reset the Device
. This simply meant that I made a call to Device.Reset
.
Calling Device.Reset
recovered the Device
. No problem. But when I lost the device a second time (for example, when the computer was locked, went to sleep, or activated a screen-saver), an exception was thrown by Device.Reset
.
The exception was InvalidCallException
, which (according to the documentation) means something went wrong with the call. So I assumed it was a problem with the arguments to the function. So instead of passing the same copy of PresentParams
that I used to create the Device, I created a new instance of PresentParams (at first using the copy constructor, and later by re-creating without it) and passed that to Device.Reset
.
Doesn't work. Device.Reset
still dies with the InvalidCallException
. Oh, and the message of the exception? "Error in application." Not helpful.
Can you point me in the direction of either a solution, or some documentation about how to get more debug information out of DirectX?
-
OK, I know how silly is seems to answer my own question, but I figured someone else might need this, eh?
The answer is: there were too many calls to the
Dispose
method of theVertexBuffer
s in the scene. The reason being that the internalDevice
reset-handlers were calling theDispose
method. And why was that happening? Because I had neglected to read the .NET DirectX SDK documentation regarding the Pool Enumeration, and was allocating theVertexBuffer
s usingPool.Default
instead ofPool.Managed
.So obviously, after a few thousand badly done allocate-and-release cycles, something went wrong.
Oh, and how did I discover this? I attached a listener to
VertexBuffer.Dispose
which incremented a counter that I displayed on-screen. Imagine my suprise when I noticed this counter kept growing as I resized the window! -
Thanks a lot for the answer :) It really helped me and saved hours of my time. Thanks again
scraimer : I'm glad I could help! :-)
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.