DirectDraw - Lost surfaces problems

Started by
7 comments, last by illuna 24 years, 6 months ago
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 :-( )
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( );

~CGameProgrammer( );Developer Image Exchange -- New Features: Upload screenshots of your games (size is unlimited) and upload the game itself (up to 10MB). Free. No registration needed.
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

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

Founder, Cuttlefish Industries
The Cuttlefish Engine lets anyone develop great games for iPad, iPhone, Android, WP7, the web, and more!
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.

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

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( );

~CGameProgrammer( );Developer Image Exchange -- New Features: Upload screenshots of your games (size is unlimited) and upload the game itself (up to 10MB). Free. No registration needed.
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;
}

An alternative might be to use your own buffers, not direct draw surfaces? That way they never get lost.

This topic is closed to new replies.

Advertisement