ÀÌ ±ÛÀº Á¶¸¸°£ ÃâÆÇµÉ Game Programming Gems 2 Çѱ¹¾îÆÇ(·ù±¤ ¿ª, Á¤º¸¹®È­»ç)ÀÇ ÀϺÎÀÔ´Ï´Ù. ÀÌ ±Û¿¡ ´ëÇÑ ¸ðµç ±Ç¸®´Â Á¤º¸¹®È­»ç°¡ °¡Áö°í ÀÖÀ¸¸ç, »çÀü Çã¶ô ¾øÀÌ´Â À¥ »çÀÌÆ® °Ô½Ã¸¦ ºñ·ÔÇÑ ¾î¶°ÇÑ ÇüÅÂÀÇ Àç¹èÆ÷µµ ±ÝÁöµÇ¾î ÀÖ½À´Ï´Ù.

ÀÌ ±ÛÀº ÃÖÁ¾ ±³Á¤ ÀüÀÇ »óÅÂÀ̹ǷΠ¿ÀŸ³ª ¿À¿ªÀÌ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ À¥ ÆäÀÌÁöÀÇ ÇÑ°è »ó, ½ÇÁ¦·Î Á¾ÀÌ¿¡ ÀμâµÈ ÇüÅ¿ʹ ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù.

Game Programming Gem 2 Çѱ¹¾îÆÇ¿¡ ´ëÇÑ Á¤º¸´Â GPG ½ºÅ͵ð(http://www.gpgstudy.com/)¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

1.12 À©µµ¿ìÁî ±â¹Ý °ÔÀÓÀ» À§ÇÑ ¼±ÇüÀû ÇÁ·Î±×·¡¹Ö ¸ðµ¨

Javier F. Otaegui, Sabarasa Entertainment
jJavier(at)sabarasa.com.ar

DOS°¡ ¼¼»óÀ» Áö¹èÇÏ´ø ½ÃÀý, ¿ì¸®´Â °ÔÀÓÀ» °ÅÀÇ ¼±ÇüÀûÀÎ ¹æ½ÄÀ¸·Î ÇÁ·Î±×·¡¹ÖÇß´Ù. DirectX·Î °ÔÀÓÀ» ¸¸µéÁö ¾ÊÀ¸¸é ¾ÈµÇ´Â ½ÃÀýÀÌ ¿À¸é¼­, ¿ì¸®´Â À©µµ¿ìÁîÀÇ ¸Þ½ÃÁö ÆßÇÁ(message pump)¶ó´Â ±«¹°À» ¸¸³ª°Ô µÇ¾ú´Ù. ¸Þ½ÃÁö ÆßÇÁ¶ó´Â ±¸Á¶´Â °ÔÀÓ ÇÁ·Î±×·¡¹Ö¿¡´Â ÀüÇô ¸ÂÁö ¾Ê´Â´Ù. ÀÌ ±Û¿¡¼­´Â ¸Þ½ÃÁö ÆßÇÁ¸¦ ĸ½¶È­ÇÏ°í ¼±ÇüÀû ÇÁ·Î±×·¡¹Ö ¸ðµ¨(linear programming model)À» Á¦°øÇϱâ À§ÇÑ È¿À²ÀûÀÎ ¹æ¹ýÀ» À̾߱âÇϰڴÙ. ±×¸®°í ±×¸¦ ÀÌ¿ëÇØ¼­ Alt-Tab¿¡ ÀÇÇÑ ÀÀ¿ë ÇÁ·Î±×·¥ ÀüȯÀÌ Á¦´ë·Î Áö¿øµÇµµ·Ï ÇÏ´Â ¹æ¹ý°ú ¼Õ½ÇµÈ Ç¥¸é(lost surface)À» Á¦´ë·Î º¹±¸ÇÏ´Â ¹æ¹ýµµ À̾߱âÇϰڴÙ.

¼±ÇüÀûÀ¸·Î ÇÁ·Î±×·¡¹ÖÇØ º» µ¶ÀÚ¶ó¸é ÀÌ ±Û¿¡¼­ ¸»ÇÏ´Â ¹æ¹ýÀÇ Á߿伺À» ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸ÀÏ À©µµ¿ìÁî·ÎºÎÅÍ °ÔÀÓ ÇÁ·Î±×·¡¹ÖÀ» ½ÃÀÛÇÑ µ¶ÀÚ¶ó¸é °ÔÀÓ ÇÁ·Î±×·¡¹Ö¿¡¼­ÀÇ ¸Þ½ÃÁö ÆßÇÁ¸¦ º°·Î ºÒÆíÇÏ°Ô »ý°¢ÇÏÁö ¾Ê°ÚÁö¸¸, ÀÏ´Ü ¼±ÇüÀû ÇÁ·Î±×·¡¹ÖÀ» °æÇèÇØ º»´Ù¸é ¸Þ½ÃÁö ÆßÇÁ·Î ´Ù½Ã µ¹¾Æ°¡´Â ÀÏÀÌ ¾øÀ» °ÍÀÌ´Ù. ¸Þ½ÃÁö ÆßÇÁÀÇ °Å´ëÇÑ À¯ÇÑ »óÅ ±â°èº¸´Ù´Â ¼±ÇüÀû ¸ðµ¨ÀÌ ÈξÀ ´õ ±ò²ûÇϰí ÀÌÇØÇϱ⠽¬¿ì¸ç µð¹ö±ëµµ ÆíÇÏ´Ù. Á» ´õ ¼±ÇüÀûÀÎ ¹æ½ÄÀ¸·Î ÀÛ¾÷À» ÇÏ¸é ¼³°è³ª ÇÁ·Î±×·¡¹Ö, µð¹ö±ë ½Ã°£À» Å©°Ô ÁÙÀÏ ¼ö ÀÖÀ¸¸ç, °ñÄ¡µµ ´ú ¾ÆÇÁ´Ù.

°ÔÀÓ ¼¼°èÀÇ °»½Å

¿äÁò °ÔÀÓµéÀº UpdateWorld °°Àº À̸§ÀÇ ÇÔ¼ö¸¦ °¡Áö°ï ÇÑ´Ù. ±×·± ÇÔ¼ö´Â ¸Þ½ÃÁö ÆßÇÁ ¾È¿¡ ÀÖ´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Çٽɺο¡ À§Ä¡Çϸç, ¸Þ½ÃÁö¸¦ ¹ÞÁö ¾Ê¾ÒÀ» ¶§¿¡µµ ¹«Á¶°Ç È£ÃâµÇ°ï ÇÑ´Ù. ¾ð¶æ »ý°¢Çϱ⿡, UpdateWorld ÇÔ¼ö¸¦ ¸¸µå´Â °ÍÀº ¸Å¿ì °£´ÜÇØ º¸ÀÏ °ÍÀÌ´Ù. ¸ðµç Àü¿ª º¯¼öµé, Ç¥¸éµé, ±×¸®°í ÀÎÅÍÆäÀ̽ºµéÀÌ ÀÌ¹Ì ÃʱâÈ­µÇ¾î ÀÖÀ» °ÍÀ̹ǷÎ, ±× ÇÔ¼ö ¾È¿¡¼­´Â ±×³É ±×°ÍµéÀ» °»½ÅÇÏ°í ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ÀÌ Á¤µµ¸é ¸Å¿ì °£´ÜÇÑ ÀÏÀÌÁö¸¸, ÀÌ´Â °ÔÀÓ¿¡ ¿ÀÁ÷ ÇÑ Á¾·ùÀÇ È­¸é¸¸ Á¸ÀçÇϸç, ÄÆ¾À(cut-scene)µµ ¾ø°í, ¸Þ´º³ª ¿É¼Çµµ ¾ø´Â °æ¿ì¿¡¸¸ ÇØ´çÇÏ´Â À̾߱âÀÌ´Ù.

¹®Á¦´Â, UpdateWorld°¡ °á±¹¿¡´Â Á¾·áµÇ¾î¼­ ¸Þ½ÃÁö ÆßÇÁ·Î µ¹¾Æ°¡¾ß¸¸ ½Ã½ºÅÛÀ¸·ÎºÎÅÍ Àü´ÞµÈ ´ÙÀ½ ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ÀÌ ¶§¹®¿¡ DOS ½ÃÀýó·³ ÇϳªÀÇ ¿¬¼ÓÀûÀÎ for ·çÇÁ ¾È¿¡¼­ ¸ðµç °ÍÀ» ó¸®ÇÏ´Â °ÍÀÌ ºÒ°¡´ÉÇÏ´Ù. DOS °ÔÀӵ鿡¼­´Â ¸Þ½ÃÁö ÆßÇÁ·Î µ¹¾Æ°¡¼­ ´ÙÀ½ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿Ã Çʿ䰡 ¾ø±â ¶§¹®¿¡ Ç×»ó ¼±ÇüÀûÀÎ ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇϸç, µû¶ó¼­ ¸ðµç ¼­ºê·çƾµéÀº Àڽſ¡ ÇÊ¿äÇÑ ¸ðµç ·çÇÁµéÀ̳ª Áö¿¬µé, ¶Ç´Â ÄÆ¾ÀµéÀ» Á¦ÇѾøÀÌ °¡Áú ¼ö ÀÖ¾ú´Ù. ±×³É ÇØ´ç Äڵ带 ¼­ºê·çƾ ¾È¿¡ Áý¾î³Ö±â¸¸ ÇÏ¸é µÇ¾ú´ø °ÍÀÌ´Ù. ±×·¯³ª ¸Þ½ÃÁö ÆßÇÁ´Â ²÷ÀÓ¾øÀÌ Á¶»çµÇ¾î¾ß ÇÒ Çʿ䰡 Àֱ⠶§¹®¿¡, ·çÇÁ°¡ ÇÑ ¹ø µ¹ ¶§¸¶´Ù ¸Å¹ø ¸Þ½ÃÁö ÆßÇÁ·Î µ¹¾Æ°¡¾ß ÇÑ´Ù. ¿©·¯ Á¾·ùÀÇ °ÔÀÓ È­¸éµéÀÌ Á¸ÀçÇÏ´Â °æ¿ì ¸Å ¹øÀÇ ¹Ýº¹¸¶´Ù ÇÔ¼ö°¡ ¹ÝȯµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀº ¸Å¿ì ¹ø°Å·Î¿î Á¦¾àÀÌ´Ù.

À̸¦ ÇØ°áÇÏ´Â ÇÑ °¡Áö ¹æ¹ýÀº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸ðµç ¼­ºê·çƾµéÀ» ÇϳªÀÇ À¯ÇÑ »óÅ ±â°è·Î ¸¸µå´Â °ÍÀÌ´Ù. °¢ ¼­ºê·çƾÀº ÀÚ½ÅÀÇ ³»ºÎ »óŸ¦ °£Á÷Çϸç, ±× »óÅ¿¡ ±â¹ÝÇØ¼­ ¾î¶°ÇÑ ÀÛ¾÷À» ó¸®Çϰųª ´Ù¸¥ ¼­ºê·çƾµéÀ» È£ÃâÇÑ´Ù. ±×·¯ÇÑ ´Ù¸¥ ¼­ºê·çƾµé ¿ª½Ã ÇϳªÀÇ À¯ÇÑ »óÅ ±â°è·Î ÀÛµ¿Çϸç, ÀÚ½ÅÀÇ ÀÛ¾÷À» ¸¶ÃÆÀ¸¸é(Áï ´õ ÀÌ»ó ¼öÇàÇØ¾ß ÇÒ »óŵéÀÌ ³²¾ÆÀÖÁö ¾Ê°Ô µÇ¸é) ÀÚ½ÅÀ» È£ÃâÇÑ ¼­ºê·çƾ¿¡°Ô 'ÀÌÁ¦ ³× »óÅ¿¡ ¸Â°Ô ÀÏÀ» ÁøÇàÇ϶ó'¶ó´Â ¶æÀÇ °ªÀ» ¹ÝÈ¯ÇØ¾ß ÇÑ´Ù. ¹°·Ð ÀÛ¾÷À» ¸¶Ä£ °¢ ¼­ºê·çƾÀÌ ÀÚ½ÅÀÇ »óŸ¦ 0À¸·Î ´Ù½Ã ¼³Á¤ÇØ¾ß ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ±× ¼­ºê·çƾÀ» ´Ù½Ã È£ÃâÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

¸¸ÀÏ ±×·± ½ÄÀ¸·Î ÀÛµ¿ÇÏ´Â ¼­ºê·çƾµéÀÌ 30-40°³ Á¤µµ¿¡ À̸£¸ç °¢ ¼­ºê·çƾ¸¶´Ù 20¿©°³ÀÇ »óŵéÀ» °¡Áö°í ÀÖ´Ù¸é, ÀÀ¿ë ÇÁ·Î±×·¥Àº ¼ÓÀ» ¾Ë ¼ö ¾ø´Â °Å´ëÇÑ ±«¹°ÀÌ µÇ¾î ¹ö¸°´Ù. µð¹ö±ëÀº °í»çÇϰí Äڵ带 ÀÐÀ¸¸é¼­ ½ÇÇàÀÇ È帧À» ÂѾư¡´Â °Íµµ ¸Å¿ì ¾î·Á¿î ÀÏÀÌ µÉ °ÍÀÌ´Ù. À¯ÇÑ »óÅ ÇÁ·Î±×·¡¹Ö ¸ðµ¨Àº ¿¾³¯ÀÇ ¼±ÇüÀûÀÎ DOS ÇÁ·Î±×·¥¿¡¼­ ¾²ÀÌ´ø ´Ü¼øÇÑ ¸ðµ¨º¸´Ù ÈξÀ ´õ º¹ÀâÇÏ´Ù.

ÇØ°áÃ¥: ´ÙÁß ½º·¹µù

¸Þ½ÃÁö ÆßÇÁ·ÎºÎÅÍ, ±×¸®°í ±Ã±ØÀûÀ¸·Î´Â º¹ÀâÇÑ À¯ÇÑ »óÅ ÇÁ·Î±×·¡¹Ö ¸ðµ¨·ÎºÎÅÍ ¹þ¾î³¯ ¼ö ÀÖ´Â ÁÁÀº ´ë¾ÈÀº ¹Ù·Î ´ÙÁß ½º·¹µù ¸ðµ¨(multithreading model)ÀÌ´Ù.

À©µµ¿ìÁî´Â ´ÙÁß ½º·¹µùÀ» Áö¿øÇÑ´Ù. ÀÌ´Â ÇϳªÀÇ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ³»ºÎÀûÀ¸·Î ¿©·¯ °³ÀÇ ½º·¹µåµéÀ» µ¿½Ã¿¡ ½ÇÇà½Ãų ¼ö ÀÖ´Ù´Â ¶æÀÌ´Ù. °³³äÀº ¸Å¿ì °£´ÜÇÏ´Ù - ¸Þ½ÃÁö ÆßÇÁ¸¦ ÇϳªÀÇ ½º·¹µå¿¡ ³Ö°í °ÔÀÓÀ» ´Ù¸¥ ½º·¹µå¿¡ ³ÖÀÚ´Â °ÍÀÌ´Ù. ¸Þ½ÃÁö ÆßÇÁ¸¦ Ãʱâ(¸ÞÀÎ) ½º·¹µå¿¡ ±×´ë·Î µÎ°í, UpdateWorld ÇÔ¼ö¸¦ °ÔÀÓ ½º·¹µå¿¡ ³ÖÀ¸¸é UpdateWorld¸¦ °¡Àå ÃÖ¼ÒÇÑÀÇ ÇüÅÂ(¼±ÇüÀûÀÎ ÇÁ·Î±×·¡¹Ö ¸ðµ¨)·Î À¯ÁöÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº °ÔÀÓ ½º·¹µå¸¦ ÃʱâÈ­Çϴµ¥ ÇÊ¿äÇÑ doInit ÇÔ¼öÀÌ´Ù.


HANDLE hMainThread;	// ¸ÞÀÎ ½º·¹µå ÇÚµé

	static BOOL
	doInit( ... )
	{
		... // DirectX¿Í ±âŸ ÇÊ¿äÇÑ °ÍµéÀ» ÃʱâÈ­ÇÑ´Ù...

		DWORD tid;

		hMainThread=CreateThread( 0,
			0,
			&MainThread,
			0,
			0,
			&tid);

		return TRUE;
	}

MainThread´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵȴÙ.


	DWORD WINAPI
	MainThread( LPVOID arg1 )
	{
		RunGame();
		PostMessage(hwnd, WM_CLOSE, 0, 0);
		return 0;
	};

MainThread´Â RunGame ÇÔ¼ö¸¦ È£ÃâÇϸç, ±× ÇÔ¼ö°¡ ¹ÝȯµÇ¸é WM_CLOSE ¸Þ½ÃÁö¸¦ Àü¼ÛÇØ¼­ ¸Þ½ÃÁö ÆßÇÁ ½º·¹µåÀÇ ½ÇÇàÀ» Á¾·á½ÃŲ´Ù.

ÃʱâÈ­ ÄÚµå

±×·±µ¥ ÃʱâÈ­ ÄÚµå(DirectX ÃʱâÈ­ ÄÚµå µî)´Â doInit ÇÔ¼ö¿¡ ³Ö¾î¾ß ÇÒ±î, ¾Æ´Ï¸é RunGame ÇÔ¼ö¿¡ ³Ö¾î¾ß ÇÒ±î? WM_CLOSE¿¡ ´ëÇÑ ¸ðµç Á¾·á Äڵ带 ¸Þ½ÃÁö 󸮺ο¡ Áý¾î ³Ö´Â´Ù¸é ÃʱâÈ­ ÄÚµå´Â doInit ÇÔ¼ö¿¡ Áý¾î ³Ö´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. ±×·¯³ª ¸ðµç ÃʱâÈ­ Äڵ带 RunGame ÇÔ¼ö¿¡ ³Ö´Â °Íµµ ³ª»ÚÁö ¾Ê´Ù - ±×·¸°Ô µÇ¸é °ÔÀÓ¿¡ °ü·ÃµÈ ¸ðµç Áß¿äÇÑ Äڵ带 RunGame ÇÔ¼ö, Áï »õ·Î¿î ¼±ÇüÀû °ÔÀÓ ÇÁ·Î±×·¡¹Ö ÇÔ¼ö¿¡ Æ÷ÇÔ½Ãų ¼ö ÀÖ°Ô µÈ´Ù.

"Alt-Tab" ¹®Á¦

À©µµ¿ìÁî´Â ¸ðµç ÀÀ¿ë ÇÁ·Î±×·¥µéÀÌ ¼­·Î ÇùÁ¶ÀûÀ¸·Î ÀÛµ¿Çϱ⸦ ¹Ù¶õ´Ù. À̸¦ À§ÇØ ²À ÇØ°áÇØ¾ß ÇÏ´Â ¹®Á¦´Â, Alt-TabÀ¸·Î ÇÁ·Î±×·¥À» ÀüȯÇÏ´Â ÀÛµ¿ÀÌ Á¦´ë·Î ÀϾµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î¼­ °ÔÀÓÀ» ½ÇÇàÇÏ´Ù°¡µµ Alt-TabÀ» ´­·¯¼­ ¸ÞÀÏÀ» Á¡°ËÇϰí, ´Ù½Ã Alt-TabÀ» ´­·¯ °ÔÀÓÀ¸·Î µ¹¾Æ¿Ã ¼ö ÀÖ°Ô ¸¸µé¾î¾ß Çϴµ¥, À̸¦ Á¦´ë·Î ¶Ç´Â '¿ì¾ÆÇϰÔ' Çã¿ëÇÏ´Â °ÔÀӵ麸´Ù´Â ¾Æ¿¹ Alt-TabÀ» ¸·¾Æ¹ö¸®´Â °ÔÀÓµéÀÌ ´õ ¸¹Àº °Í °°´Ù.

´ÙÁß ½º·¹µå ¸ðµ¨ÀÇ °æ¿ì SuspendThread¿Í ResumeThread °°Àº Ç¥ÁØ ½º·¹µå ÇÔ¼öµéÀ» ÀÌ¿ëÇÒ ¼öµµ ÀÖÁö¸¸, Alt-Tab ¹®Á¦¸¦ ±ò²ûÇÏ°Ô ÇØ°áÇϱ⿡´Â ¸¹Àº ¹«¸®°¡ µû¸¥´Ù. ±× ´ë½Å ½º·¹µå°£ÀÇ Åë½ÅÀ» À§ÇÑ µµ±¸ÀÎ À̺¥Æ®¸¦ »ç¿ëÇϱâ·Î ÇÏÀÚ. À̺¥Æ®(event)´Â ¼­·Î ´Ù¸¥ ½º·¹µåµéÀ» µ¿±âÈ­½Ã۴µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â ±ê¹ß(flag) °°Àº °ÍÀÌ´Ù. ½ÇÇàÀ» Àá½Ã Áß´ÜÇØ¾ß ÇÒ Çʿ䰡 ÀÖ´Â °æ¿ì ¸ÞÀÎ ÇÁ·Î±×·¥ÀÌ ±ê¹ßÀ» ¹øÂ½ µé¾î ¿Ã¸®¸é, °ÔÀÓ ½º·¹µå°¡ ±× ±ê¹ßÀ» º¸°í ÀÚ½ÅÀÇ ÀÛ¾÷À» ÁߴܽÃŰ´Â ¹æ½ÄÀ̶ó°í »ý°¢ÇÏ¸é µÈ´Ù.

°ÔÀÓÀÇ ½ÃÀÛ ½ÃÁ¡¿¡¼­ ¼öµ¿ Àç¼³Á¤ À̺¥Æ®(manual reset event)¸¦ Çϳª ¸¸µç´Ù. ÀÌ À̺¥Æ®´Â ÇÁ·Î±×·¥ÀÌ ºñȰ¼ºÈ­µÇ¸é °ÅÁþÀ¸·Î, ´Ù½Ã Ȱ¼ºÈ­µÇ¸é ÂüÀ¸·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù. °ÔÀÓ ½º·¹µåÀÇ ¸ÞÀÎ ·çÇÁ¿¡¼­´Â À̺¥Æ®°¡ ÂüÀÎÁö °ÅÁþÀÎÁö¿¡ µû¶ó °ÔÀÓÀÇ ½ÇÇàÀ» Àç°³Çϰųª ÁßÁöÇÑ´Ù.

À̺¥Æ®¸¦ ¸¸µé±â À§Çؼ­´Â ¿ì¼± HANDLE ÇüÀÇ Àü¿ª º¯¼ö°¡ ÇÊ¿äÇÏ´Ù.


	HANDLE	task_wakeup_event;

À̺¥Æ®¸¦ »ý¼ºÇÏ°í ¼³Á¤ÇÒ ¶§¿¡´Â ´ÙÀ½°ú °°ÀÌ CreateEvent¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.


	task_wakeup_event =
		CreateEvent(
			NULL,		// º¸¾È Ư¼ºµé ¾øÀ½
			TRUE,		// ¼öµ¿ Àç¼³Á¤À» Ȱ¼ºÈ­
			FALSE,		// Ãʱ⠻óÅ = ÅëÁö¹ÞÁö ¾ÊÀº »óÅÂ
			NULL		// À̸§ ¾øÀ½
		);

´ëºÎºÐÀÇ °ÔÀӵ鿡´Â »õ È­¸éÀ» ±×¸®´Â ¿ªÇÒÀ» ´ã´çÇÏ¸ç ¸ÞÀÎ ·çÇÁ ¾È¿¡¼­ ¸Å¹ø È£ÃâµÇ´Â ÇÔ¼ö°¡ Á¸ÀçÇÑ´Ù. ¿¹¸¦ µé¾î DirectX °ÔÀÓÀ̶ó¸é ±âº» ¹öÆÛ¿Í ÈÄ¸é ¹öÆÛ¸¦ Çø³½ÃŰ´Â ÇÔ¼ö°¡ ¹Ýµå½Ã ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö´Â ²÷ÀÓ¾øÀÌ È£ÃâµÇ¹Ç·Î, À̺¥Æ®ÀÇ º¯°æÀ» °¨ÁöÇÏ´Â Äڵ带 ³Ö±â¿¡ ¾È¼º¸¶ÃãÀÌ´Ù. ´ÙÀ½°ú °°Àº Äڵ带 ³ÖÀ¸¸é µÈ´Ù.


WaitForSingleObject( task_wakeup_event, INFINITE );

¿î¿µÃ¼Á¦°¡ ´Ù¸¥ ÀÀ¿ë ÇÁ·Î±×·¥À» Ȱ¼ºÈ­ÇÒ ¶§¸¶´Ù ½º·¹µå¸¦ ¸ØÃç¾ß Çϴµ¥, ±×·¯·Á¸é À©µµ¿ì ÇÁ·Î½ÃÀú ·çÇÁ ¾È¿¡¼­ APP_ACTIVATE ¸Þ½ÃÁö¸¦ Àâ¾Æ³»°í ÇöÀç ÀÌ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ È°¼ºÈ­µÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù. ¸¸ÀÏ ºñȰ¼ºÈ­ »óŶó¸é °ÔÀÓÀÇ ½ÇÇàÀ» Áß´Ü(Á¾·á°¡ ¾Æ´Ï¶ó À¯º¸)ÇØ¾ß Çϴµ¥, ´ÙÀ½À» È£ÃâÇÏ¸é µÈ´Ù.


ResetEvent( task_wakeup_event );

´Ù½Ã ½ÇÇàÀ» Àç°³ÇÒ ¶§¿¡´Â ´ÙÀ½À» È£ÃâÇÑ´Ù.


SetEvent( task_wakeup_event );

ÀÌó·³ ¸î ÁÙÀÇ Äڵ常 Ãß°¡Çϸé, »ç¿ëÀÚ°¡ Alt-TabÀ» ´­·¶À» ¶§ °ÔÀÓÀÌ ÀÚ¿¬½º·´°Ô ½ÇÇàÀ» ¸ØÃ߹ǷÎ(´õ ÀÌ»ó CPU¸¦ Àâ¾Æ¸ÔÁö ¾Ê°Ô µÈ´Ù), »ç¿ëÀÚ´Â ´Ù¸¥ ÀÀ¿ë ÇÁ·Î±×·¥µéÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¸¸ÀÏ °ÔÀÓÀÌ ºñȰ¼ºÈ­µÈ »óÅ¿¡¼­µµ °ÔÀÓ ¼¼°è°¡ °è¼Ó °»½ÅµÇ¾î¾ß ÇÑ´Ù¸é, °ÔÀÓ ½º·¹µå Àüü°¡ ¾Æ´Ï¶ó ·»´õ¸µ ÆÄÀÌÇÁ¶óÀθ¸ À¯º¸½ÃŰ°í °ÔÀÓ ¼¼°èÀÇ °»½Å ·çƾÀº °è¼Ó ½ÇÇàµÇ°Ô ¸¸µé¸é µÈ´Ù. ÀÌ·¯ÇÑ À̺¥Æ® ¸ðµ¨Àº ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÇÊ¿äÇÑ ½º·¹µåµéÀÌ ¿©·¯ °³¶ó°í ÇØµµ ¾ó¸¶µçÁö Àû¿ëÇÒ ¼ö ÀÖ´Ù(°¢ ½º·¹µå¸¶´Ù ÀÌ·± ½ÄÀ¸·Î »õ·Î¿î À̺¥Æ®µéÀ» Áý¾î ³ÖÀ¸¸é µÈ´Ù).

¼Õ½ÇµÈ Ç¥¸éÀÇ Ã³¸®

°ÔÀÓÀÇ ±×·¡ÇÈÀÌ ±×·ÁÁö´Â Ç¥¸é(surface)ÀÌ ºñµð¿À ¸Þ¸ð¸®¿¡ Á¸ÀçÇÑ´Ù¸é, ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ºñȰ¼ºÈ­µÉ ¶§ Ç¥¸éÀÌ ¼Õ½ÇµÇ´Â ¹®Á¦°¡ »ý±ä´Ù. ¼±Çü ÇÁ·Î±×·¡¹Ö ¸ðµ¨ÀÇ °æ¿ì ¼­ºê·çƾÀÌ ½ÇÇàµÇ´Â µµÁß¿¡ °ÔÀÓÀÌ ºñȰ¼ºÈ­µÇ¸é ¸ðµç Ç¥¸éµéÀÌ ¼Õ½ÇµÇ´Â »çŰ¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

ÀÌ·¯ÇÑ »óȲ¿¡ ´ëÇÑ ÇØ°áÃ¥Àº ¿©·¯ °¡Áö°¡ Àִµ¥, ±× Áß Çϳª°¡ ¸í·É ÆÐÅÏ(Command pattern)ÀÌ´Ù[GoF94]. ±×·¯³ª ¸í·É ÆÐÅÏÀº Äڵ带 ºÒ¸íÈ®ÇÏ°Ô ¸¸µé ¼ö ÀÖÀ¸¸ç, ÀÌ ±ÛÀÌ ÁÖµÇ°Ô À̾߱âÇÏ´Â °Íµµ 'Á» ´õ ¸í·áÇÑ °ÔÀÓ ÇÁ·Î±×·¡¹Ö ¸ðµ¨'¿¡ °üÇÑ °ÍÀ̹ǷΠ¸í·É ÆÐÅÏÀº ÇÇÇϱâ·Î ÇϰڴÙ. ÀÌ ±Û¿¡¼­ Á¦½ÃÇÏ´Â ¹æ¹ýÀº Äݹé ÇÔ¼ö¿Í lpVoid ½ÖÀ» ´ã´Â ½ºÅÃÀ» °ü¸®Çϰí Ç¥¸éÀÌ º¹±¸µÉ Çʿ䰡 ÀÖÀ» ¶§¸¶´Ù ±× ½ºÅÿ¡ ½×ÀÎ Äݹé ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. Ç¥¸éÀÌ º¹±¸µÇ¾î¾ß Çϸé Äݹé_ÇÔ¼ö(lpVoid)¸¦ È£ÃâÇÑ´Ù. ÀÌ ¶§ lpVoid ¸Å°³º¯¼ö¿¡´Â ÇÊ¿äÇÑ ¸ðµç Ç¥¸éµé¿¡ ´ëÇÑ Æ÷ÀÎÅ͵éÀÌ Æ÷Ç﵃ ¼ö ÀÖ´Ù. ÀÌ·± ¹æ½ÄÀÌ ¼±ÇüÀû ÇÁ·Î±×·¡¹Ö ¸ðµ¨¿¡ Á» ´õ ÀûÇÕÇÏ´Ù.

¿¹¸¦ µé¾î¼­, °ÔÀÓÀÇ ½ºÇ÷¡½Ã È­¸é(splash screen. ¿ªÁÖ: ÇÁ·Î±×·¥ÀÌ Ã³À½ ½ÃÀÛµÉ ¶§ Ç¥½ÃµÇ´Â È­¸é. ÈçÈ÷ Áö·çÇÑ ·ÎµùÀ» °¨Ãß±â À§ÇÑ ¿ëµµ·Î ¾²ÀδÙ)À» Ç¥½ÃÇÏ´Â Splash¶ó´Â ¼­ºê·çƾÀÌ ÀÖ´Ù°í ÇÏÀÚ. ½ºÇ÷¡½Ã È­¸éÀÌ ¶° ÀÖ´Â »óÅ¿¡¼­ »ç¿ëÀÚ°¡ Alt-TabÀ» ´­·¯ ´Ù¸¥ ÇÁ·Î±×·¥À¸·Î °¬´Ù°¡ ´Ù½Ã °ÔÀÓÀ¸·Î µ¹¾Æ¿Ô´Ù¸é, °ÔÀÓÀº ´Ù½Ã ½ºÇ÷¡½Ã È­¸éÀ» Ç¥½ÃÇØ¾ß ÇÑ´Ù. ±×·±µ¥ ¸¸ÀÏ Alt-Tab °úÁ¤¿¡¼­ Ç¥¸éÀÌ ¼Õ½ÇµÇ¾ú´Ù¸é À̸¦ ´Ù½Ã º¹±¸ÇØ¾ß ÇÒ °ÍÀÌ´Ù. À§¿¡¼­ ¸»ÇÑ ½ºÅà ¹æ½ÄÀ» »ç¿ëÇÑ´Ù¸é, ÄÚµå´Â ´ÙÀ½°ú °°Àº ¸ð½ÀÀÌ µÉ °ÍÀÌ´Ù.


	int LoadSplashGraphics( lpvoid Params )
	{

		Surface *pMySurface;
		pMySurface = (Surface *) Params;

		//  ...
		//  (ÆÄÀϷκÎÅÍ ±×·¡ÇÈ µ¥ÀÌÅ͸¦ Àоî¿Â´Ù)
		return 1;
	}

	int Splash()
	{
		Surface MySurface;

		// ÇÔ¼ö¸¦ ½ºÅÿ¡ ³Ö´Â´Ù.
		gReloadSurfacesStack.Push( &LoadSplashGraphics, &MySurface );

		// Á¦ÀÏ Ã³À½¿¡ ±×·¡ÇÈÀ» ·ÎµåÇÏ´Â °Íµµ ÀÖÁö ¸»¾Æ¾ß ÇÑ´Ù.
		LoadSplashGraphics( &MySurface );

		// ... ±âŸ ½ºÇ÷¡½Ã È­¸é¿¡¼­ ÇÊ¿äÇÑ ÀϵéÀ» ¼öÇàÇÑ´Ù...

		// ÇÔ¼ö¸¦ »Ì´Â´Ù.
		gReloadSurfaceStack.Pop();
	}

Ç¥¸éÀ» ´Ù·ç´Â °¢ ¼­ºê·çƾ¸¶´Ù ÀÌ·± ½ÄÀ¸·Î Àڽſ¡°Ô ÇÊ¿äÇÑ Ç¥¸é º¹±¸¿ë ÇÔ¼ö¸¦ ½ºÅÿ¡ Áý¾î ³ÖÀ¸¸é, º¹±¸ ¼ø¼­°¡ Ʋ·Á¼­ È­¸éÀÌ ±úÁö´Â ÀÏÀ» ¹æÁöÇÒ ¼ö ÀÖ´Ù. ½ºÅà ´ë½Å Ä÷º¼Ç Ŭ·¡½º¸¦ ÀÌ¿ëÇÑ ±¸Çöµµ »ý°¢ÇÒ ¼ö ÀÖ°ÚÁö¸¸, Ç¥¸éÀÇ º¹±¸ ¹®Á¦´Â ÇÔ¼ö È£ÃâµéÀÇ Áßø(nesting)¿¡ Å©°Ô °ü·ÃµÈ °ÍÀ̸ç, ÇÔ¼ö È£ÃâÀÇ Áßø¿¡ ´ëÇÑ °¡Àå È¿À²ÀûÀÌ°í ¸íÈ®ÇÑ ÇØ¹ýÀº ½ºÅÃÀÌ´Ù.

Âü°íÀÚ·á