• Advertisement
Sign in to follow this  

Why Present() or Flush() takes so long?

This topic is 2182 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

I have the following codes to draw to my target window. The problem is, either, the IDirect3DDevice9::Present() or ID3DXSprite::Flush() < or End() > sometimes take up to 100 ms to finish the work. But normal it takes no more than 5 ms to finish.


clock_t cInit = clock(), cBS, cGBB, cCF, cSR, cSpB, cDT, cSpE, cES, cFL ;
if( SUCCEEDED( m_pDev->BeginScene() ))
{
cBS = clock() ;
m_pDev->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuf );
cGBB = clock() ;
m_pDev->ColorFill( m_pSurf, &m_SurfRT, 0x00000000 );
cCF = clock() ;
m_pDev->StretchRect( m_pSurf, NULL, pBackBuf, NULL, D3DTEXF_LINEAR );
cSR = clock() ;
m_pSprite->Begin( D3DXSPRITE_ALPHABLEND );
cSpB = clock() ;
m_pFontTC->DrawText( m_pSprite, sTC, -1, &m_SurfRT, DT_CENTER | DT_VCENTER | DT_SINGLELINE,
D3DCOLOR_XRGB( 255, 255, 255 ));
cDT = clock() ;
m_pSprite->Flush() ;
cFL = clock() ;
m_pSprite->End() ;
cSpE = clock() ;
m_pDev->EndScene() ;
cES = clock() ;
}
else
{
OutputDebugString( L"CoreD3D9::UpdateAndRender >> m_pDev->BeginScene error\n" );
return -1 ;
}
m_pDev->Present( NULL, NULL, NULL, NULL );
clock_t cNow = clock() ;




memset( &d3dpp, 0, sizeof( D3DPRESENT_PARAMETERS ));
d3dpp.Windowed = TRUE ;
d3dpp.hDeviceWindow = m_hWnd;
d3dpp.BackBufferWidth = m_nWidth;
d3dpp.BackBufferHeight = m_nHeight;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD ;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN ;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE ;


If I remove the drawing text code, the delay will take place from the Present() function call. So if the text drawing included, the delay will take place on Flush() ( or End(), if the Flush() is comment out). Also, I just don't understand why delay happens totally random, it doesn't come up every time, but just once a while only. -- All other function calls take pretty much no time --

After a bit search on Google, seems like either function has to deal with the hardware / 3D-card, so it means sometime between got locked up for a long time.

Just need some help to find out where the problem is, the hardware, D3D, or my coding?

Thanks for help

Share this post


Link to post
Share on other sites
Advertisement
If I recall, there's a buffer (of 2 frames, maybe?) whereby the CPU can 'get ahead' of the GPU and Present just queues the frame. But, if that buffer's full, Present will block until the GPU has processed a frame. Hence, unpredictable delays on calls to Present.

Share this post


Link to post
Share on other sites
First read this: http://tomsdxfaq.blogspot.com/2006_04_01_archive.html#114482869432550076#114482869432550076

OK, it doesn't account for the 100 ms time. I've no experience with ID3DXFont myself, but it seems like ID3DXFont::PreloadGlyphs may help you out.

There are a few other things that look odd with your code, but I'd need to see the full render function before I say more.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement