Jump to content

View more

Image of the Day

Boxes as reward for our ranking mode. ヾ(☆▽☆)
#indiedev #gamedev #gameart #screenshotsaturday https://t.co/ALF1InmM7K
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

Sign up now

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

4: Adsense

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   


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   


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   Members   


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.