ํด๋์ ๊ฒ์ ๋์์ธ ํจํด - ๋ ํธ๋ก ๊ฒ์์ด ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด๋ฅผ ๋ง๋ ๋ฐฉ๋ฒ
์ค๋๋ ์ 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๋ ์ด ์ง๋ ์ง๊ธ๋ ์ฌ์ ํ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐจ์ธ๋ ๊ฒ์์ ๋ง๋ค ๋๋ ๋ ํธ๋ก ๊ฒ์์์ ๋ฐฐ์ฐ์ธ์. ๊ทธ ์ ์ฝ๋ค์ด ๊ฐ์ฅ ์์ํ๊ณ ํจ์จ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ๋ง๋ค์์ต๋๋ค.
์ด ๋์์ธ ํจํด๋ค์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด๊ณ ์ถ์ผ์ ๊ฐ์? ์ฐ๋ฆฌ์ ๋ ํธ๋ก ๊ฒ์ ์ปฌ๋ ์ ์ ํ๋ ์ดํ๊ณ ํด๋์ ๊ฒ์ ์ํคํ ์ฒ๋ฅผ ๊ฒฝํํ์ธ์!
์ง๊ธ ํ๋ ์ด >