• Advertisement

Archived

This topic is now archived and is closed to further replies.

DirectDraw - Lost surfaces problems

This topic is 6685 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Guest Anonymous Poster
In DirectX 6, you have a sample application that 'simulate' (force) surfaces lost. I don't remember the name though (I don't have DirectX at job :-( )

Share this post


Link to post
Share on other sites
Advertisement
After you restore lost surfaces, do they lock correctly? Mine don't. Blt, BltFast, and GetDC work fine, but Lock returns DDERR_SURFACELOST.

------------------
~CGameProgrammer( );

Share this post


Link to post
Share on other sites
CGameProgrammer,

Well. I wouldn't be able to anwser your question. I'm 19 and I'm a junior programmer. I'm just beginning to master DirectDraw but mayby someone else here would know the anwser?

Illuna

Share this post


Link to post
Share on other sites
Now that you mention it...

I've had all shades of trouble trying to get DDraw surfaces to restore correctly. The only thing that's seemed to work is if I Release() all surfaces (including the primary), Release() the DDraw interface, create a completely new DDraw interface, and then create completely new surfaces.

This solution for me was easier than trying to figure out exactly why surface restoring was sketchy, but I'm still curious, so if anyone's seen this and solved it, I'd love to hear about it.

Mason McCuskey
Spin Studios
www.spin-studios.com

Share this post


Link to post
Share on other sites
Not sure bout locking,but I have had no problems restoring surfaces. Thue I do use a linked list to keep track of all the bitmaps loaded and there flags ect. Then if I detect a lost surface I just call restorallsurfaces(); which is a directx 6 command.

Then i reload in the data for any video bitmaps.

Also system memory bitmaps don't seem to get lost.

Share this post


Link to post
Share on other sites
here's what i do. create a class that manages a directdraw surface. the class will load a bitmap onto the surface, destroy the surface, etc. whenever you need to use the surface (when you need to Blt), check if the surface is lost. if it is, restore it, and then reload the data. it works fine with my game, and you can see an example (together with other garbage) with source at members.xoom.com/mutex0. goto defyengine

Share this post


Link to post
Share on other sites
That's what I do. I wrote a CImage class. I too have a ReloadAll() command, and it works: all surfaces get reloaded. The problem isn't restoring the surfaces; it's getting the Lock command to work after doing so.

Probably mason is right: I gotta reload all surfaces. Probably many games do this, because if you Alt+Tab to something else, then switch back to their game, it takes several full seconds to restore everything.

------------------
~CGameProgrammer( );

Share this post


Link to post
Share on other sites
An alternative might be to use your own buffers, not direct draw surfaces? That way they never get lost.

Share this post


Link to post
Share on other sites
Hi

I programmed the code to restore the surfaces if the display mode changed. It works just right but I need to know how to loose a surface otherwise (it works already when I change the resolution of the screen and the color palette). Can you suggest me other ways to loose a surface so I can check my code?

Thanks!

Here is a sample code

BOOL RestoreAll(void){
HRESULT ddrval;
ddrval = lpDDSPrimary->Restore();

if (ddrval==DDERR_WRONGMODE){
// Display mode changed
// No problem here
}
else if (FAILED(ddrval)){
// Random restore failure
// How can I make this case happen?
}
else{
// We're ok retore everything else
// How can I make this case happen?
}
return TRUE;
}

Share this post


Link to post
Share on other sites

  • Advertisement