DDRAW: prim/back-flip shaking! I need smooth scrolling.

Started by
4 comments, last by Hans 24 years, 3 months ago
Hmmm, does it look like things are sorta, transparent?

It *sounds* like your not giving it enough time to draw everything before you flip the surfaces, however looking at your code, it looks like you wait for everything to finish, so I'm not sure. I guesse it would depend on what you have inside of the DrawAll function... Good luck!

Advertisement
The only thing I would change would be this line:

ddrval = lpDDSPrimary->Flip(NULL,0)

try using

ddrval = lpDDSPrimary->Flip(NULL,DDFLIP_WAIT)

but your surface must specify these flags:
DDSCAPS_FLIP and DDSCAPS_FRONTBUFFER
I'm sure you have the both flagged because you are using the Primary surface in your code, and the flip function seems to be working currently.

Why not try and wait for a vertical refresh!

directdrawobject->WaitForVerticalBlank(DDWAITVB_BLOCKEND, 0);

Thanks but.. still not working
I tried all your suggestions with no luck. Wasn't sure thought where that directdrawobject->WaitForVerticalBlank(DDWAITVB_BLOCKEND, 0); should be placed so I tried putting it everywhere.. Still didn't look any better.

Yes you fiqured my problem right: it seems like I have *four* 25% transparent pictures on my screen. One is the current frame and the other three are the last three frames.
Yes they are so noticeable I could count how many there were.

And the problem is not in drawAll() because it just draws it all...

Someone here must have succeeded in making a smooth scroller! Please tell me what should I do.

I copied some code from ddex3 and did a scrolling screen to my game. But when fps's get low, the picture starts to shake! It only shakes when I move the view, not when I stay still. And shaking is little, but annoying. Well.. here's some code. drawAll() draws the level to the lpsurface:
---------
ddsd.dwSize = sizeof(ddsd);

do {
result = lpDDSBack->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
} while (result == DDERR_SURFACEBUSY | | result == DDERR_WASSTILLDRAWING);

if (result != DD_OK) return;

drawAll((short*)(ddsd.lpSurface),ddsd.lPitch);
lpDDSBack->Unlock(NULL);

// Flip the surfaces (this is from ddex3)
while( 1 )
{
ddrval = lpDDSPrimary->Flip( NULL, 0 );
if( ddrval == DD_OK ) {break;}
if( ddrval == DDERR_SURFACELOST )
{
ddrval = restoreAll(); if( ddrval != DD_OK ) {break;}
}
if( ddrval != DDERR_WASSTILLDRAWING )
{break;}
}
-----
I don't use any blits yet, only my own slow code to draw things in drawAll().

The shaking actually looks like .. the program would flip before drawing is actually complete. Or it skips the drawing every second frame. But my code doesn't allow this to happen. Or does it? I don't know about Window's evil tricks yet...

And if fps's are high, the shaking disappears!

Any ideas about this shaking screen problem?
Anybody here with a smooth scroller?

Thanks already.

"the program would flip before drawing is actually complete"

...then...
"And the problem is not in drawAll() because it just draws it all... "

In drawAll(), I assume you're using BltFast? Are you using the DDBLTFAST_WAIT flag with it?

btw- WaitForVerticalBlank should be called before the flip. You could try the WaitForSync method, but I think Vore is correct in thinking that your problem is in your DrawAll function.

good luck,

Six

This topic is closed to new replies.

Advertisement