Vsync lag in DirectX 9 Fullscreen

Started by
2 comments, last by AgentC 11 years, 3 months ago

I have vsync enabled in my game. In windowed mode, input lag seems to be much less than compared to fullscreen mode. I've tried to pinpoint where this input lag is coming from while in fullscreen, but I just don't know where to look anymore.

This is my windows message loop:


do
	{
		MSG msg;
		while(PeekMessage(&msg,0,0,0,PM_REMOVE) > 0)
		{
			if(msg.message == WM_QUIT)
			{
				return false;
			}

			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
		
		if(m_bPaused)
		{	
			Sleep(20);
		}

	} while(m_bPaused);

	return true;

And this is how I init directx 9:


D3DPRESENT_PARAMETERS m_D3DParameters;

m_D3DParameters.BackBufferWidth            = width;
m_D3DParameters.BackBufferHeight           = height;
m_D3DParameters.BackBufferFormat           = D3DFMT_X8R8G8B8;
m_D3DParameters.BackBufferCount            = 1;
m_D3DParameters.MultiSampleType            = D3DMULTISAMPLE_NONE;
m_D3DParameters.MultiSampleQuality         = 0;
m_D3DParameters.SwapEffect                 = D3DSWAPEFFECT_DISCARD; 
m_D3DParameters.hDeviceWindow              = windowHandle;
m_D3DParameters.Windowed                   = false;
m_D3DParameters.EnableAutoDepthStencil     = true;
m_D3DParameters.AutoDepthStencilFormat     = D3DFMT_D24S8;
m_D3DParameters.Flags                      = 0;
m_D3DParameters.FullScreen_RefreshRateInHz = RefreshRate;
m_D3DParameters.PresentationInterval       = D3DPRESENT_INTERVAL_DEFAULT;

Advertisement

Try using D3DPRESENT_INTERVAL_ONE instead of D3DPRESENT_INTERVAL_DEFAULT - see the "Remarks" section at http://msdn.microsoft.com/en-us/library/windows/desktop/bb172585%28v=vs.85%29.aspx for more info on the difference between the two (specifically - if you're not calling timeBeginPeriod yourself then the lower system timer resolution may screw up your input timing too).

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

This does not seem to fix the lag I'm experiencing. For input, I'm using a combination of Raw Input for the mouse along with the keyboard messages from the windows msg queue.

Edit: It seems that creating the directx device with D3DCREATE_SOFTWARE_VERTEXPROCESSING, tends to reduce the input lag. Interesting...

I believe the lag is caused by Direct3D rendering frames ahead of time, which means that the actually displayed frames will seem to lag. In Direct3D9 itself, unlike Direct3D11 where the number of frames to render ahead can be altered, there is no good way to control this, except artificially reducing the run-ahead by executing a query and stalling by waiting for its result. I wouldn't necessarily recommend this.

See http://www.gamedev.net/topic/580048-dx9-vsync-lag/

Software vertex processing reducing the lag is likely caused by the CPU having more work to do, therefore it doesn't get that much ahead.

This topic is closed to new replies.

Advertisement