Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!

1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!

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

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 dm_3x   Members   -  Reputation: 100


Posted 01 February 2012 - 01:45 AM

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() ;
  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


#2 TheUnbeliever   Members   -  Reputation: 961


Posted 01 February 2012 - 03:09 AM

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.

#3 mhagain   Crossbones+   -  Reputation: 9342


Posted 01 February 2012 - 04:28 AM

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.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.