HOME

ํด๋ž˜์‹ ๊ฒŒ์ž„ ๋””์ž์ธ ํŒจํ„ด - ๋ ˆํŠธ๋กœ ๊ฒŒ์ž„์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ๋ฅผ ๋งŒ๋“  ๋ฐฉ๋ฒ•

์˜ค๋Š˜๋‚ ์˜ AAA ๊ฒŒ์ž„๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด๋“ค์€ ๋ ˆํŠธ๋กœ ์•„์ผ€์ด๋“œ ๊ฒŒ์ž„์—์„œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทน๋„์˜ ํ•˜๋“œ์›จ์–ด ์ œ์•ฝ(64KB RAM, 1MHz CPU) ์†์—์„œ, 1980๋…„๋Œ€ ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ์˜ค๋Š˜๋‚ ์—๋„ ์‚ฌ์šฉ๋˜๋Š” ์šฐ์•„ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์†”๋ฃจ์…˜์„ ๋ฐœ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ„ด๋“ค์„ ์ดํ•ดํ•˜๋ฉด ๋” ๋‚˜์€ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฒŒ์ž„ ์—ญ์‚ฌ์— ๋Œ€ํ•œ ๊นŠ์€ ํ†ต์ฐฐ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ๋ฃจํ”„: ๋ชจ๋“  ๊ฒƒ์˜ ์‹ฌ์žฅ

๊ฒŒ์ž„ ๋ฃจํ”„๋Š” ๋ชจ๋“  ๊ฒŒ์ž„์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์ด์ง€๋งŒ ์™„๋ฒฝํ•˜๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: while(running) { processInput(); update(); render(); }. ์ด ๋ฃจํ”„๋Š” ์ดˆ๋‹น 60ํšŒ ์‹คํ–‰๋˜์–ด ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๋ฐ˜์‘ํ˜• ์ œ์–ด๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ฒŒ์ž„๋“ค์€ ๊ณ ์ • ํƒ€์ž„์Šคํ…์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ”„๋ ˆ์ž„์€ ์ •ํ™•ํžˆ 16.67ms(60 FPS)์˜€์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, ๋А๋ฆฐ ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ๊ฒŒ์ž„์ด ๋А๋ ค์กŒ์Šต๋‹ˆ๋‹ค. ์šฐ์ฃผ ์ŠˆํŒ… ๊ฒŒ์ž„(1978)์€ CRT ํ™”๋ฉด์˜ ์ˆ˜์ง ๋™๊ธฐํ™”(V-sync)์— ๊ฒŒ์ž„ ๋กœ์ง์„ ๋™๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์ด ์ƒˆ๋กœ๊ณ ์นจ๋  ๋•Œ๋งˆ๋‹ค ๊ฒŒ์ž„์ด ์—…๋ฐ์ดํŠธ๋˜์–ด ์ฐข์–ด์ง ์—†๋Š” ๋งค๋„๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ณด์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด "60 FPS" ํ‘œ์ค€์˜ ํƒ„์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋กœ ๊ฒŒ์ž„(1980)์€ ์ƒํƒœ ๊ธฐ๋ฐ˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ผ์‹œ์ •์ง€ํ•˜๋ฉด ๊ฒŒ์ž„์€ ์ž…๋ ฅ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋Š” ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๋ฉ”๋‰ด์—์„œ๋Š” ๋ฉ”๋‰ด ๋กœ์ง๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ˜„๋Œ€ ์ƒํƒœ ๋จธ์‹ ์˜ ์”จ์•—์ด์—ˆ์Šต๋‹ˆ๋‹ค. 1980๋…„๋Œ€ ํ›„๋ฐ˜ ๊ฒŒ์ž„๋“ค์€ ๋ธํƒ€ ํƒ€์ž„์„ ์‹คํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์›€์ง์ž„์„ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. 60 FPS๋“  30 FPS๋“  ๊ฒŒ์ž„ ์†๋„๋Š” ์ผ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๋ชจ๋“  ๊ฒŒ์ž„ ์—”์ง„(Unity, Unreal)์€ ์ด์™€ ๋™์ผํ•œ ๊ฒŒ์ž„ ๋ฃจํ”„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ๋จธ์‹ : ๋ณต์žก์„ฑ ๊ด€๋ฆฌํ•˜๊ธฐ

๋ ˆํŠธ๋กœ ๊ฒŒ์ž„๋“ค์€ ๋ณต์žกํ•œ ํ–‰๋™์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ ๋จธ์‹ ์„ ๊ฐœ์ฒ™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํฌ๋จธ ๊ฒŒ์ž„(1981)์˜ ์ ๋“ค์€ ๋ช…ํ™•ํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค: PATROL(์ขŒ์šฐ ์ด๋™), CHASE(ํ”Œ๋ ˆ์ด์–ด ์ถ”์ ), CLIMB(์‚ฌ๋‹ค๋ฆฌ ์˜ค๋ฅด๊ธฐ), STUNNED(์ผ์‹œ์ ์œผ๋กœ ๋ฌด๋ ฅํ™”). ๊ฐ ์ƒํƒœ๋Š” ๊ณ ์œ ํ•œ ๋กœ์ง์„ ๊ฐ€์กŒ๊ณ , ํŠน์ • ์กฐ๊ฑด์—์„œ๋งŒ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค: switch(enemy.state) { case PATROL: moveLeftRight(); if(playerNearby()) enemy.state = CHASE; break; case CHASE: moveTowardPlayer(); if(playerFar()) enemy.state = PATROL; break; }. ์ด ํŒจํ„ด์€ ๋ณต์žกํ•œ AI๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค. ๊ฒฉํˆฌ ๊ฒŒ์ž„๋“ค์€ ํ”Œ๋ ˆ์ด์–ด ์ƒํƒœ์— ์ƒํƒœ ๋จธ์‹ ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค: IDLE, WALKING, JUMPING, ATTACKING, HIT, BLOCKING. ์ƒํƒœ๋Š” ์–ด๋–ค ์ž…๋ ฅ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ATTACKING ์ƒํƒœ์—์„œ๋Š” ์ ํ”„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. HIT ์ƒํƒœ์—์„œ๋Š” ๋ธ”๋กํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฒฌ๊ณ ํ•œ ์ „ํˆฌ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ŠˆํŒ… ๊ฒŒ์ž„๋“ค์€ ๊ฒŒ์ž„ ์ „์ฒด ์ƒํƒœ์— ์ƒํƒœ ๋จธ์‹ ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค: TITLE_SCREEN, PLAYING, PAUSED, GAME_OVER, HIGH_SCORE_ENTRY. ๊ฐ ์ƒํƒœ๋Š” ํ™”๋ฉด์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋ Œ๋”๋งํ•˜๊ณ  ์ž…๋ ฅ์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊น”๋”ํ•˜๊ณ  ๋ฒ„๊ทธ๊ฐ€ ์ ์€ ์ฝ”๋“œ์˜€์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๋ชจ๋“  ๊ฒŒ์ž„ AI์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์Šคํ…œ์€ ์ƒํƒœ ๋จธ์‹ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Unity์˜ Animator Controller, Unreal์˜ Behavior Tree - ๋ชจ๋‘ 1980๋…„๋Œ€ ์•„์ผ€์ด๋“œ ๊ฒŒ์ž„์—์„œ ์‹œ์ž‘๋œ ๋™์ผํ•œ ๊ฐœ๋…์˜ ์ง„ํ™”์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด ํ’€๋ง: ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”

64KB RAM๋งŒ์œผ๋กœ๋Š” ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์ด์•Œ์„ ๋ฐœ์‚ฌํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”์™€ ๋А๋ฆฐ ์„ฑ๋Šฅ์„ ์ดˆ๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…? ๊ฐ์ฒด ํ’€๋ง์ž…๋‹ˆ๋‹ค. ์šฐ์ฃผ ์ŠˆํŒ… ๊ฒŒ์ž„์€ ์‹œ์ž‘ ์‹œ 100๊ฐœ์˜ ์ด์•Œ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค: Bullet bulletPool[100]; int nextBullet = 0;. ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฐœ์‚ฌํ•˜๋ฉด ๊ฒŒ์ž„์€ ํ’€์—์„œ ๋น„ํ™œ์„ฑ ์ด์•Œ์„ ์ฐพ์•„ ์žฌ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค: bulletPool[nextBullet].active = true; bulletPool[nextBullet].x = playerX; bulletPool[nextBullet].y = playerY; nextBullet = (nextBullet + 1) % 100;. ์ด์•Œ์ด ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚˜๋ฉด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žฌ์‚ฌ์šฉ์„ ๊ธฐ๋‹ค๋ ธ์Šต๋‹ˆ๋‹ค. ํ• ๋‹น๋„ ํ•ด์ œ๋„ ์—†์ด, ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ๋งŒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋น ๋ฅด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ŠˆํŒ… ๊ฒŒ์ž„๋“ค์€ ๋ชจ๋“  ๊ฒƒ์— ํ’€๋ง์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค: ์ , ํŒŒ์›Œ์—…, ํญ๋ฐœ, ํŒŒํ‹ฐํด. ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๊ณ , ๋Ÿฐํƒ€์ž„ ์ค‘์—๋Š” ์žฌ์‚ฌ์šฉ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฒŒ์ž„์ด ์ ˆ๋Œ€ ํ”„๋ ˆ์ž„ ๋“œ๋กญ ์—†์ด 60 FPS๋ฅผ ์œ ์ง€ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ํผ์ฆ ๊ฒŒ์ž„๋“ค์€ ๋ธ”๋ก์— ํ’€๋ง์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋ธ”๋ก์ด ๋–จ์–ด์ง€๊ณ  ์‚ฌ๋ผ์ง€๊ณ  ์žฌ์ƒ์„ฑ๋˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋™์ผํ•œ 50๊ฐœ ๊ฐ์ฒด๋ฅผ ์žฌํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๋ชจ๋“  ๊ณ ์„ฑ๋Šฅ ๊ฒŒ์ž„์€ ๊ฐ์ฒด ํ’€๋ง์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Unity์˜ ObjectPool, Unreal์˜ PooledActors - 1978๋…„ ์šฐ์ฃผ ์ŠˆํŒ… ๊ฒŒ์ž„์—์„œ ์‹œ์ž‘๋œ ๋™์ผํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ํŒจํ„ด: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ

์ดˆ๊ธฐ ๊ฒŒ์ž„๋“ค์€ ๋ชจ๋†€๋ฆฌ์‹ ์ฝ”๋“œ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด ํด๋ž˜์Šค๋Š” ๋ Œ๋”๋ง, ๋ฌผ๋ฆฌ, ์ž…๋ ฅ, ์‚ฌ์šด๋“œ ๋ชจ๋‘๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. 1980๋…„๋Œ€ ์ค‘๋ฐ˜, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค: ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๋””์ž์ธ. ๊ฐ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋Š” ์ž‘์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์ปฌ๋ ‰์…˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํฌ๋จธ ๊ฒŒ์ž„์˜ ์ : GameObject enemy; enemy.add(new SpriteComponent("enemy.png")); enemy.add(new PhysicsComponent(gravity=true)); enemy.add(new AIComponent(behavior="patrol")); enemy.add(new HealthComponent(hp=3));. ์ด์ œ ์ƒˆ๋กœ์šด ์ ์„ ๋งŒ๋“ค๋ ค๋ฉด? ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตํ™˜ํ•˜์„ธ์š”. ๋น„ํ–‰ํ•˜๋Š” ์ ? PhysicsComponent๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”. ๋” ์Šค๋งˆํŠธํ•œ ์ ? ๋‹ค๋ฅธ AIComponent๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ํผ์ฆ ๊ฒŒ์ž„๋“ค์€ ๋ธ”๋ก ํƒ€์ž…์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ธ”๋ก์€ RotatableComponent๋ฅผ ๊ฐ€์กŒ๊ณ , ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ColorMatchComponent๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ธ”๋ก ํƒ€์ž…? ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•˜์„ธ์š”. ์ŠˆํŒ… ๊ฒŒ์ž„๋“ค์€ ๋ฌด๊ธฐ ์‹œ์Šคํ…œ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฌด๊ธฐ๋Š” FirePatternComponent(spread/single/burst), DamageComponent(damage amount), SoundComponent(firing sound)๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ๋ฌด๊ธฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฅธ ๋ฌด๊ธฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๋ชจ๋“  ๊ฒŒ์ž„ ์—”์ง„์€ ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค. Unity์˜ GameObject + Component ์‹œ์Šคํ…œ, Unreal์˜ Actor + ActorComponent - 1980๋…„๋Œ€ ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๊ฐœ์ฒ™ํ•œ ๋™์ผํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

๊ณต๊ฐ„ ๋ถ„ํ• : ์ถฉ๋Œ ์ตœ์ ํ™”

์ดˆ๊ธฐ ๊ฒŒ์ž„๋“ค์€ ๋‹จ์ˆœํ•œ ์ถฉ๋Œ ๊ฐ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค: ๋ชจ๋“  ์ด์•Œ์— ๋Œ€ํ•ด ๋ชจ๋“  ์ ๊ณผ ๋น„๊ต. N๊ฐœ์˜ ์ด์•Œ๊ณผ M๊ฐœ์˜ ์ ์ด ์žˆ์œผ๋ฉด Nร—M ๋น„๊ต๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. 100๊ฐœ ์ด์•Œ ร— 50๊ฐœ ์  = 5,000๋ฒˆ ์ฒดํฌ. 1MHz CPU์—๋Š” ๋„ˆ๋ฌด ๋А๋ ธ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…? ๊ณต๊ฐ„ ๋ถ„ํ• ์ž…๋‹ˆ๋‹ค. ํ™”๋ฉด์„ 8x8 ๊ทธ๋ฆฌ๋“œ๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ ์…€์— ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค: Cell grid[8][8]; grid[bulletX/32][bulletY/32].add(bullet);. ์ด์ œ ์ถฉ๋Œ ์ฒดํฌ๋Š” ๊ฐ™์€ ๊ทธ๋ฆฌ๋“œ ์…€(๊ทธ๋ฆฌ๊ณ  ์ธ์ ‘ ์…€)์˜ ๊ฐ์ฒด๋งŒ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. 5,000๋ฒˆ ์ฒดํฌ๊ฐ€ 50๋ฒˆ ์ฒดํฌ๋กœ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ์ŠˆํŒ… ๊ฒŒ์ž„๋“ค์€ ์ˆ˜์ง ๋ฐด๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ ๋“ค์€ ์ˆ˜ํ‰์œผ๋กœ ๋งŽ์ด ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ™”๋ฉด์„ ์ˆ˜์ง ์ŠคํŠธ๋ฆฝ์œผ๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค. ์ด์•Œ์€ ์ž์‹ ์˜ ์ŠคํŠธ๋ฆฝ์— ์žˆ๋Š” ์ ๋งŒ ์ฒดํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํฌ๋จธ ๊ฒŒ์ž„๋“ค์€ ํƒ€์ผ ๊ธฐ๋ฐ˜ ์ถฉ๋Œ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งต์ด ์ด๋ฏธ ํƒ€์ผ ๊ทธ๋ฆฌ๋“œ์˜€์œผ๋ฏ€๋กœ, ํ”Œ๋ ˆ์ด์–ด์˜ ํ˜„์žฌ ํƒ€์ผ๊ณผ ์ธ์ ‘ ํƒ€์ผ๋งŒ ์ฒดํฌํ–ˆ์Šต๋‹ˆ๋‹ค. 10,000๊ฐœ ํƒ€์ผ ๋งต์—์„œ๋„ ๋งค ํ”„๋ ˆ์ž„ 9๊ฐœ ํƒ€์ผ๋งŒ ์ฒดํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๊ฒŒ์ž„ ์—”์ง„๋“ค์€ ํ›จ์”ฌ ์ •๊ตํ•œ ๊ณต๊ฐ„ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(QuadTree, Octree, BVH). ๊ทธ๋Ÿฌ๋‚˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด - "๊ฐ€๊นŒ์šด ๊ฒƒ๋งŒ ์ฒดํฌํ•˜๋ผ" - ๋Š” 1980๋…„๋Œ€ ์•„์ผ€์ด๋“œ ๊ฒŒ์ž„์—์„œ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก : ์ œ์•ฝ์ด ์šฐ์•„ํ•จ์„ ๋‚ณ๋‹ค

๋ ˆํŠธ๋กœ ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ํ˜„๋Œ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์ƒ์ƒ๋„ ํ•  ์ˆ˜ ์—†๋Š” ์ œ์•ฝ์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค: 64KB RAM(ํ˜„๋Œ€ ์ด๋ฏธ์ง€ 1์žฅ๋ณด๋‹ค ์ ์Œ), 1MHz CPU(ํ˜„๋Œ€ ์Šค๋งˆํŠธํฐ๋ณด๋‹ค 1,000๋ฐฐ ๋А๋ฆผ), ๋””๋ฒ„๊ฑฐ ์—†์Œ, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์—†์Œ, 3๋ช…์˜ ์‚ฌ์šด๋“œ ์ฑ„๋„, ๊ณ ์ • 16์ƒ‰ ํŒ”๋ ˆํŠธ. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ œ์•ฝ์ด ์šฐ์•„ํ•จ์„ ๋‚ณ์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ”์ดํŠธ๊ฐ€ ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  CPU ์‚ฌ์ดํด์ด ์ตœ์ ํ™”๋˜์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ญ๋น„ํ•  ์—ฌ์œ ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ ˆํŠธ๋กœ ๊ฒŒ์ž„ ์ฝ”๋“œ๊ฐ€ ์•„๋ฆ„๋‹ค์šด ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ˜„๋Œ€ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋œ ํŒจํ„ด๋“ค - ๊ฒŒ์ž„ ๋ฃจํ”„, ์ƒํƒœ ๋จธ์‹ , ๊ฐ์ฒด ํ’€๋ง, ์ปดํฌ๋„ŒํŠธ ์‹œ์Šคํ…œ, ๊ณต๊ฐ„ ๋ถ„ํ•  - ์€ ๋ชจ๋‘ ์ด ์‹œ๋Œ€์—์„œ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  Unity๋‚˜ Unreal Engine์„ ์—ด๋ฉด, 1980๋…„๋Œ€ ์•„์ผ€์ด๋“œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ์œ ์‚ฐ์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์†”๋ฃจ์…˜์€ ๋„ˆ๋ฌด ์šฐ์•„ํ•˜๊ณ  ํšจ์œจ์ ์ด์–ด์„œ 40๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฐจ์„ธ๋Œ€ ๊ฒŒ์ž„์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋ ˆํŠธ๋กœ ๊ฒŒ์ž„์—์„œ ๋ฐฐ์šฐ์„ธ์š”. ๊ทธ ์ œ์•ฝ๋“ค์ด ๊ฐ€์žฅ ์ˆœ์ˆ˜ํ•˜๊ณ  ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ ํŒจํ„ด๋“ค์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ์šฐ๋ฆฌ์˜ ๋ ˆํŠธ๋กœ ๊ฒŒ์ž„ ์ปฌ๋ ‰์…˜์„ ํ”Œ๋ ˆ์ดํ•˜๊ณ  ํด๋ž˜์‹ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฝํ—˜ํ•˜์„ธ์š”!

์ง€๊ธˆ ํ”Œ๋ ˆ์ด >