|This is retired content. This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This content may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.|
When the IDirectDrawSurface5::Flipmethod 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 IDirectDrawSurface5::Flipcall continues to loop until it returns DD_OK. Also, a IDirectDrawSurface5::Flipcall 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 IDirectDrawSurface5::GetFlipStatusmethod 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 IDirectDrawSurface5::GetBltStatusmethod in much the same way to determine whether a blit has finished. Because IDirectDrawSurface5::GetFlipStatusand IDirectDrawSurface5::GetBltStatusreturn immediately, you can use them periodically in your application with little loss in speed.
Last updated on Tuesday, May 18, 2004