webForumDet fria alternativet

BitBlt med synkronisering (Slippa flimmer) ??

C/C++

4 svar · 384 visningar · startad av JimmyPalm

Medlem sedan nov. 200114 inlägg
Frågan#1

Hej!

Jag använder mig av tekniken att använda dubbel buffring - dock uppstår ett flimmer med jämna mellanrum. I Direct X så inväntar man en s.k. V-sync innan man blittar backbuffer till frontbuffer. Hur skall man göra i "vanlig" WIN32 miljö?

Tacksam för svar... :)

Nedan följer ett kodexempel:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC		hdc;
	PAINTSTRUCT           ps;
	static HINSTANCE	hInstance;
	static HBITMAP	hBitmapGubbe, hBitmapBuff;
	static HDC	hdcGubbe, hdcBuff;	
	static POINT	ptGubbePos;
	

	

	switch(message)
	{
	case WM_CREATE:
		{
			hInstance = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);

			hdc = GetDC(hwnd);
			hBitmapGubbe = (HBITMAP) LoadImage(hInstance, TEXT("gubbe.bmp"), IMAGE_BITMAP, 
				0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

			hBitmapBuff = (HBITMAP) CreateCompatibleBitmap(hdc, 400, 200);

			ReleaseDC(hwnd, hdc);
			
			SetTimer(hwnd, 1, 50, NULL);
			
			return 0;
		}

	case WM_TIMER:
		{
			switch(wParam)
			{
			case 1:
				{
					if(ptGubbePos.x < 360)
					ptGubbePos.x += 1;

					if(ptGubbePos.x >= 360)
						ptGubbePos.x = 0;
						

					InvalidateRect(hwnd, NULL, TRUE);
				}
			}
			
			return 0;
		}
	
	case WM_PAINT:
		{
			
			hdc = BeginPaint(hwnd, &ps);

			hdcGubbe = CreateCompatibleDC(hdc);
			SelectObject(hdcGubbe, hBitmapGubbe);

			hdcBuff = CreateCompatibleDC(hdc);
			SelectObject(hdcBuff, hBitmapBuff);
			Rectangle(hdcBuff, -1, -1, 400, 200);

			BitBlt(hdcBuff, ptGubbePos.x, 0, 66, 77, hdcGubbe, 0, 0, SRCCOPY); 
			
			
			//	Visa gubbe:
			BitBlt(hdc, 0, 0, 400, 200, hdcBuff, 0, 0, SRCCOPY);
			

			DeleteDC(hdcGubbe);
			DeleteDC(hdcBuff);
			
			EndPaint(hwnd, &ps);
			return 0;
		}

	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}
Medlem sedan feb. 20001 590 inlägg
#2

Vad jag kan se så använder du redan dubbelbuffring...
hdc och hdcbuff
/T

Medlem sedan nov. 200114 inlägg
#3

Oki

Oki!

Problemet är att jag Blittar grafik när JAG känner för det.. inte när det är mest lämpligt för HÅRDVARAN...Man bör nämligen blitta och SAMTIDIGT låta skärmen ritas om HELT innan man blittar igen.

Frågan är alltså... hur får man reda på om skärmen är redo eller inte?

Medlem sedan feb. 2001107 inlägg
#4

En lösning för att bli av med flimret är att inte låta DefWindowProc radera bakgrunden.
Detta gör du genom att helt enkelt processa WM_ERASEBKGND och returnera icke noll värde från meddelandet.

case WM_ERASEBKGND:
{
        return (LRESULT)1; 
}
Medlem sedan nov. 200114 inlägg
#5

Min favvo elev!!

Hehehe!!

Reza är min favvo elev!!

250 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)