Archived

This topic is now archived and is closed to further replies.

Jumpman

Question about latest IPicture Code

Recommended Posts

I've noticed in the latest Ipicture code, nehe has moved the update() and draw() functions from the message pump to the WM_PAINT() window message.. I'm just wondering if there is any performance benifits to that. I've been using the following message pump (which allows me to limit the MAX fps (based on the generic directX loop) or run it flat out..
HRESULT MyProgram::MainMsgLoop()
{
	DWORD fps = 75;				// the maximum frame rate, set this to 0 for unlimited

	BOOL fConsumed;				// do we have to dispatch the windows message
	MSG msg;				// memory for a windows message

	LONGLONG cur_time;			// actual time at the start of a check for the next frame
	DWORD time_count;			// time for a frame at the given fps rate
	LONGLONG perf_cnt;			// speed of the performance timer
	BOOL perf_flag = FALSE;			// are we using the mmsystem timer or the win32 one
	LONGLONG next_time = 0;			// start time of the next frame (will be calculated after a frame was rendered)
	LONGLONG elapsed_time = 0;		// time a frame really need to render

	// are we able to use the precion timer from mmsystem?
	if (QueryPerformanceFrequency((LARGE_INTEGER*) &perf_cnt))
	{
		// yes, fine
		perf_flag = TRUE;

		// length of a frame in ticks
		if ( fps )
			time_count = (DWORD) perf_cnt/fps;
		else
			time_count = 0;

		// init the time for the next frame (simply set it to now)
		QueryPerformanceCounter((LARGE_INTEGER*) &next_time);
	}
	else
	{
		// use wim32 timer ticks

		// length of a frame in ticks
		if ( fps )
			time_count = 1000/fps;
		else
			time_count = 0;

		// init the time for the next frame (simply set it to now)
		next_time = timeGetTime();
	}

	for (;
	{
		fConsumed = FALSE;

		// first hanlde win32 messages
		if (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if (msg.message == WM_QUIT)
				break;

			ApcHost_OnTranslateMessage(&msg, &fConsumed);

			if (!fConsumed)
			{
				DispatchMessage(&msg);
			}
		}
		else 
		{
			// are we in game mode?
			if (g_pPlayer && !g_pPlayer->m_fPause)
			{
				// get the current timer ticks depending on measuring method (mmsystem or win32)
				if (perf_flag)
					QueryPerformanceCounter((LARGE_INTEGER*) &cur_time);
				else
					cur_time = timeGetTime();

				// is it time for rendering the next frame?
				if ( cur_time > next_time )
				{
					// Fine, so do it
					g_pPlayer->Render();
					fConsumed = TRUE;

					// calculate the start of the next frame
					// (start of the current frame) + (time slice of a frame) - (the time we used to render this frame)
					next_time = cur_time + time_count;
				}
			}
			else
			{
				// not in game mode, simply wait for the next message
				WaitMessage();
			}
		}
	}
	return S_OK;
}
  
and the render loop
void Player::Render()
{
	LARGE_INTEGER liNewTime;
	QueryPerformanceCounter(&liNewTime);

	float timepassed = (float)(liNewTime.LowPart - m_liOldTime.LowPart) / (float)m_liCounterFrequency.LowPart;

	// Get time in milliseconds since last render loop
	m_timeCur = (int)(((liNewTime.QuadPart - m_liStartTime.QuadPart)*1000)/m_liCounterFrequency.LowPart);

etc..
}
  
I know ev everybodys loops are different, just wondering why the move the PAINT message Hope somebody can help.. Cheers Chris [edited by - jumpman on May 1, 2003 11:34:25 PM]

Share this post


Link to post
Share on other sites