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

Started by
1 comment, last by 21st Century Moose 12 years, 2 months ago
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
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.
[TheUnbeliever]
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.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

This topic is closed to new replies.

Advertisement