• Advertisement
Sign in to follow this  

Help: Switching Windowed - Fullscreen takes too long

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

Hi, I've got a switching method for toggling windowed - fullscreen, which works good - if I don't render anything. The time needed to switch then is hardly 1 second. If I render a simple cube, it takes almost 10 seconds! But there are neither D3D errors nor warnings, and the device is never lost. Here are my switching methods:
bool CSingleView::SwitchWindowed(void)
{

	// Get current mode
	VIDEOMODE stCurrMode;

	this->GetVideoMode(&stCurrMode);

	stCurrMode.bWindowed = !stCurrMode.bWindowed;

	// a) fullscreen => windowed
	if (stCurrMode.bWindowed)
	{
		stCurrMode.enBBFormat = this->m_stDesktopMode.enFormat;
		stCurrMode.enAdapterFormat = this->m_stDesktopMode.enFormat;
	}

	// b) windowed => fullscreen
	else
	{
		stCurrMode.wHrzRes = this->m_wModeWidth;
		stCurrMode.wVrtRes = this->m_wModeHeight;
		stCurrMode.enBBFormat = this->m_enModeFormat;
		stCurrMode.enAdapterFormat = this->m_enModeFormat;

		// Resize depth buffer if necessary
		if (this->m_pcDepthStencil != NULL)
		{
			if (this->m_wDSWidth < this->m_wModeWidth)
				this->m_wDSWidth = this->m_wModeWidth;

			if (this->m_wDSHeight < this->m_wModeHeight)
				this->m_wDSHeight = this->m_wModeHeight;
		}
	}

	this->AdjustRenderWindow();

	if (!this->InitalizeMode(&stCurrMode, this->m_RenderParams.enSwapEffect, 
		this->m_wDSWidth, this->m_wDSHeight, this->m_RenderParams.nBBCount, 
	this->m_hFocusWnd, this->m_RenderParams.dwPresInterval, this->m_RenderParams.dwFlags, 
		this->m_RenderParams.dwFlags)
        return false

	// Re-position the window
	if(stCurrMode.bWindowed)
		SetWindowPos((HWND) this->m_apcRenderViews[0]->GetRenderWindow(), HWND_NOTOPMOST, 
			this->m_stRect.dwLeft, this->m_stRect.dwTop, this->m_stRect.dwRight - 
			this->m_stRect.dwLeft, this->m_stRect.dwBottom - this->m_stRect.dwTop, 
			SWP_SHOWWINDOW);

	return true;
}

void CSingleView::AdjustRenderWindow(void)
{

	if (!this->m_RenderParams.bWindowed)
	{
		SetWindowLong((HWND) this->m_apcRenderViews[0]->GetRenderWindow(), GWL_STYLE, 
			m_dwWindowStyle);
	}

	else
	{
		SetWindowLong((HWND) this->m_apcRenderViews[0]->GetRenderWindow(), GWL_STYLE, 
			WS_POPUP | WS_SYSMENU | WS_VISIBLE);
	}

	return ;
}

Can someone tell me why it takes 10 seconds if I render?

Share this post


Link to post
Share on other sites
Advertisement
I don't know what you should do about your problem, but I would like to point out that your code includes a lot of unnecesary characters. You keep writing
this->(some class function)
The
this->
is totally unnecessary; it is implied. For example, on line 7, you wrote
this->GetVideoMode(&stCurrMode);
Unless you have another function in your program called GetVideoMode() with a VIDEOMODE object as its only argument, you can and should simply write
GetVideoMode(&stCurrMode);
The this keyword does not exist to allow one to access class member variables and functions inside of member functions -- they can be accessed directly as I showed above. The purpose of the this keyword is mostly so that if an object needs a pointer to itself to pass to another non-member function or to initialize some variable external to the class object, it has one. Unless you have something really weird in the rest of your code, the following code should work just as well as what you have in your post.

bool CSingleView::SwitchWindowed(void)
{

// Get current mode
VIDEOMODE stCurrMode;

GetVideoMode(&stCurrMode);

stCurrMode.bWindowed = !stCurrMode.bWindowed;

// a) fullscreen => windowed
if (stCurrMode.bWindowed)
{
stCurrMode.enBBFormat = m_stDesktopMode.enFormat;
stCurrMode.enAdapterFormat = m_stDesktopMode.enFormat;
}

// b) windowed => fullscreen
else
{
stCurrMode.wHrzRes = m_wModeWidth;
stCurrMode.wVrtRes = m_wModeHeight;
stCurrMode.enBBFormat = m_enModeFormat;
stCurrMode.enAdapterFormat = m_enModeFormat;

// Resize depth buffer if necessary
if (m_pcDepthStencil != NULL)
{
if (m_wDSWidth < m_wModeWidth)
m_wDSWidth = m_wModeWidth;

if (m_wDSHeight < m_wModeHeight)
m_wDSHeight = m_wModeHeight;
}
}

AdjustRenderWindow();

if (!InitalizeMode(&stCurrMode, m_RenderParams.enSwapEffect,
m_wDSWidth, m_wDSHeight, m_RenderParams.nBBCount,
m_hFocusWnd, m_RenderParams.dwPresInterval, m_RenderParams.dwFlags,
m_RenderParams.dwFlags)
return false

// Re-position the window
if(stCurrMode.bWindowed)
SetWindowPos((HWND) m_apcRenderViews[0]->GetRenderWindow(), HWND_NOTOPMOST,
m_stRect.dwLeft, m_stRect.dwTop, m_stRect.dwRight -
m_stRect.dwLeft, m_stRect.dwBottom - m_stRect.dwTop,
SWP_SHOWWINDOW);

return true;
}

void CSingleView::AdjustRenderWindow(void)
{

if (!m_RenderParams.bWindowed)
{
SetWindowLong((HWND) m_apcRenderViews[0]->GetRenderWindow(), GWL_STYLE,
m_dwWindowStyle);
}

else
{
SetWindowLong((HWND) m_apcRenderViews[0]->GetRenderWindow(), GWL_STYLE,
WS_POPUP | WS_SYSMENU | WS_VISIBLE);
}

return ;
}



EDIT: Oops! I forgot to actually remove the
this->
stuff from my revised source code. Now it should be ok.

Share this post


Link to post
Share on other sites
I know that I can leave "this->" out, but I got used to do it like that so I always see what variables and functions are class members, it's just a visual thing.

But that is'nt my problem.

Had anybody got the same problem with switching taking soooo long?

Share this post


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

  • Advertisement