๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Double Buffering

by eazuooz 2022. 9. 19.

์˜ˆ์ œ :)

https://github.com/eazuooz/WindowAPI/commit/d17c2e8e757274a803f76cb94fb4bb7feee67504

 

Duble Buffering · eazuooz/WindowAPI@d17c2e8

Show file tree Showing 13 changed files with 181 additions and 18 deletions.

github.com

 

์šฐ๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ๋ฌธ์ œ์ ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋น„ํŠธ๋งต  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€  ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์€ ๊ทธ๋ฆผ์„ ์ฝ๋Š” ์ž‘์—…์— ๋น„ํ•ด ํ›จ์”ฌ ๋А๋ฆฌ๋‹ค๋Š”

๋‹จ์ ์ด ์žˆ๋‹ค.

 

๋˜ํ•œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ง€์›Œ์ฃผ๊ณ  ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ณ  ์ง€์›Œ์ฃผ๊ณ  ๋‹ค์‹œ๊ทธ๋ฆฌ๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ค ๋ณด๋ฉด ๊นœ๋นก๊ฑฐ๋ฆผ ํ˜„์ƒ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ Flicking ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋”๋ธ” ๋ฒ„ํผ๋ง์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

์ƒˆ๋กœ์šด HDC์™€ ๋ฐฐ๊ฒฝ์ธ BITMAP ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๋งŒ๋“ค๊ธฐ์— ์•ž์„œ ์‹ค์ œ ์œˆ๋„์šฐ ํฌ๊ธฐ์™€ ์‹ค์ œ์ž‘์—…์˜์—ญ์ด ๋‹ค๋ฅด๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ ์œˆ๋„์šฐ ์˜์—ญ์€ ๋ธŒ๋ผ์šฐ์ € ์ƒ๋‹จ์˜์—ญ ๋ฐ ๊ทธ์™ธ ์ขŒ์šฐ ๋ฐ”๋“ฑ ์œˆ๋„์šฐ ์ „์ฒด์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ํฌ๊ธฐ๋ฅผ

์ •ํ•˜์—ฌ ์œˆ๋„์šฐ์ฐฝ์„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค.

 

 

AdjustWindowRectํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹ค์ œ ์ž‘์—…์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์ค„์ˆ˜ ์žˆ๋‹ค.

bool Application::InitializeWindow(WindowData& data)
	{
		mWindowData.hWnd = data.hWnd;
		mWindowData.hdc = GetDC(mWindowData.hWnd);
		mWindowData.width = data.width;
		mWindowData.height = data.height;


		// ๋น„ํŠธ๋งต ํ•ด์ƒ๋„๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์ œ ์œˆ๋„์šฐ ํฌ๊ธฐ ๊ณ„์‚ฐ
		RECT rect = { 0, 0, mWindowData.width, mWindowData.height };
		AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, false);

		// ์œˆ๋„์šฐ ํฌ๊ธฐ ๋ณ€๊ฒฝ ๋ฐ ์ถœ๋ ฅ ์„ค์ •
		SetWindowPos(mWindowData.hWnd
			, nullptr, 0, 0
			, rect.right - rect.left
			, rect.bottom - rect.top
			, 0);
		ShowWindow(mWindowData.hWnd, true);

		// ์ด์ค‘ ๋ฒ„ํผ๋ง
		// ์œˆ๋„์šฐ ํ•ด์ƒ๋„์™€ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ๋น„ํŠธ๋งต์„ ์ƒ์„ฑ
		// ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋น„ํŠธ๋งต์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ „์šฉ DC ์ƒ์„ฑ
		// ์ƒˆ์†Œ ์ƒ์„ฑํ•œ ๋น„ํŠธ๋งต๊ณผ DC ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐ
		mWindowData.backTexture
			= CreateCompatibleBitmap(mWindowData.hdc, mWindowData.width, mWindowData.height);
		mWindowData.backBuffer = CreateCompatibleDC(mWindowData.hdc);
		HBITMAP defaultBitmap = (HBITMAP)SelectObject(mWindowData.backBuffer, mWindowData.backTexture);
		DeleteObject(defaultBitmap);

		return true;
	}

 

์ด์ œ backBuffer์— ๋ฌผ์ฒด๋ฅผ ๊ทธ๋ ค์ค€ํ›„ ์›๋ž˜ buffer์— ๋ณต์‚ฌํ•ด์„œ ํ•œ๋ฒˆ์— ๊ทธ๋ฆด์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋”๋ธ” ๋ฒ„ํผ๋ง์„ ์ ์šฉ์‹œ์ผœ ๋ณด์ž.

	void Application::Tick()
	{
		// ์—…๋ฐ์ดํŠธ
		Time::GetInstance().Tick();
		InputManager::GetInstance().Tick();
		SceneManager::GetInstance().Tick();

		
		// Clear
		Rectangle(mWindowData.backBuffer, -1, -1, mWindowData.width + 1, mWindowData.height + 1);

		// ๋ Œ๋”๋ง
		SceneManager::GetInstance().Render(mWindowData.backBuffer);
		Time::GetInstance().Render(mWindowData.backBuffer);

		// BitBlt ํ•จ์ˆ˜๋Š” DC ๊ฐ„์— ๊ทธ๋ฆผ์„ ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. 
		BitBlt(mWindowData.hdc, 0, 0, mWindowData.width, mWindowData.height
			, mWindowData.backBuffer, 0, 0, SRCCOPY);
	}

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Path, Resource Load  (1) 2022.09.22
Resources, Brush, Pen  (0) 2022.09.20
Input  (0) 2022.09.15
Scene, Object, Time  (0) 2022.09.15
Singleton Patten  (0) 2022.09.13

๋Œ“๊ธ€