Partager via


Getting the Flip and Blit Status

Send Feedback

When the IDirectDrawSurface::Flip method is called, the primary surface and back buffer are exchanged. However, the exchange may not occur immediately.

For example, if a previous flip has not finished, or if it did not succeed, this method returns DDERR_WASSTILLDRAWING.

In the samples included with the SDK, the IDirectDrawSurface::Flip call continues to loop until it returns DD_OK. Also, a IDirectDrawSurface::Flip call does not complete immediately. It schedules a flip for the next time a vertical blank occurs on the system.

An application that waits until the DDERR_WASSTILLDRAWING value is not returned is very inefficient. Instead, you could create a function in your application that calls the IDirectDrawSurface::GetFlipStatus method on the back buffer to determine if the previous flip has finished.

If the previous flip has not finished and the call returns DDERR_WASSTILLDRAWING, your application can use the time to perform another task before it checks the status again. Otherwise, you can perform the next flip.

The following example demonstrates this concept.

while(lpDDSBack->GetFlipStatus(DDGFS_ISFLIPDONE) == 
DDERR_WASSTILLDRAWING); 
 
// Waiting for the previous flip to finish. The application can 
// perform another task here. 
 
ddrval = lpDDSPrimary->Flip(NULL, 0); 
 

You can use the IDirectDrawSurface::GetBltStatus method in much the same way to determine whether a blit has finished. Because IDirectDrawSurface::GetFlipStatus and IDirectDrawSurface::GetBltStatus return immediately, you can use them periodically in your application with little loss in speed.

Send Feedback on this topic to the authors

Feedback FAQs

© 2006 Microsoft Corporation. All rights reserved.