728x90
반응형

Game Development, 게임개발/디자인패턴 21

Data Locality, 데이터 지역성 [디자인패턴](최적화)

지역성이란 단어에서 알 수 있듯이 캐시와 관련되어 있다. CPU 캐시를 최대한 활용할 수 있도록 데이터를 배치해 메모리 접근 속도를 높이기 위함이다. 우리는 무어의 법칙으로 CPU 성능이 18~24개월마다 반도체 성능이 거의 2배로 증가한다고 그랬지만.. 이제 한계에 봉착했다. 즉, 우리는 있는 것을 더 잘 돌릴 수 있는 능력이 필요해졌다. 칩은 계속해서 연산 속도가 빨라지지만 데이터의 접근 속도는 그렇지 못했다. 즉, 캐시를 쓰는 것은 여전하다. 아무튼 각설하고 우리는 프로세서의 성능이 메모리의 성능보다 높아서 생기는 그 차이에 대한 비용을 어떻게 최소화할 것인가? 에 대해 생각해 봐야 한다. 우리가 회사 직원이라고 생각해보자 우리 업무는 숫자가 빽뺵이 쓰여있는 문서에 대해 작업한다. 이런 문서들은 해..

Spatial Partition, 공간분할 [디자인패턴](최적화)

이 패턴을 사용하는 의도는 객체를 효과적으로 찾기 위해 객체 위치에 따라 구성되는 자료구조에 저장하기 위함이다. 게임 자체는 다른 세상을 경험하게 해준다. 나는 현실의 한국 서울에 사는 대학생일지 몰라도 중세시대 성을 지키는 기사가 될 수도 있다. 하지만 몰입을 위해 실제 현실적인 것들을 게임에 다 반영하다보니 게임에서도 현실감을 느낄 수 있다. 이 말을 왜했느냐? 현실 감을 줄 수 있는 요소 중 하나인 위치, location(not position)에 대해 알아보려고 한다. 게임 월드에는 공간, space에 대한 개념이 존재해서 객체는 공간 어딘가의 위치에 존재하게 된다. 위치 개념은 여러 형태로 확인 가능하다. 가장 분명한 것은 객체가 움직이고 충돌하고 상호작용하는 물리이지만 다른 예도 있다. 오디오..

Event Queue, 이벤트 큐 [디자인패턴](디커플링)

이 패턴의 의도는 메시지와 이벤트를 보내는 시점과 처리하는 시점을 다르게 하기 위함이다. 큐라는 이름대로 실제로 큐를 이용한다. 이벤트와 큐는 각각 들어봤는데 이벤트 큐는 뭘까? 싶지만 그냥 이벤트가 들어있는 큐다. 걱정말자. 예를 들어 UI 프로그래밍을 해봤다면 이벤트에 대해서 조금이라도 더 알텐데 버튼 같은 것을 User가 누르면 이벤트가 발생하고 프로그램에서 해당 이벤트를 이용해 작동하는 형식이다. 다시 말해서 버튼 클릭이든 뭐든 프로그램과 상호작용을 위해 OS가 이벤트를 발생시켜서 프로그램으로 전달하는 것이다. 프로그램에서는 이벤트를 받아서 행위를 처리하도록 이벤트 핸들러, Event Handler에게 전달한다. 예를 들어 아래처럼 이벤트 루프가 있는 것이다. while (running) { Ev..

Component, 컴포넌트 [디자인패턴](디커플링)**

이 패턴을 사용하는 의도는 한 개체가 여러 분야를 서로 커플링 없이 다룰 수 있도록 한다. 완전 많이 쓰이는 패턴이다. 이것만큼은 잘 해보자. 플랫포머 게임을 만든다고 해보자. 플레이어 한 명을 정했다면 클래스를 하나 만들어서 주인공이 게임에서 하는 모든 것들을 넣는 것이 당연해 보인다. 플레이어를 조정해야 하니 컨트롤러 입력 값을 읽어 행동으로 바꿔야 한다. 지형이나 플랫폼 같은 레벨과도 상호작용할 수 있도록 물리 및 충돌 처리도 필요하다. 주인공이 화면에 나와야 하니 애니메이션과 렌더링도 넣자. 소프트웨어 구조 입문 수업에서 분야가 다른 코드는 서로 격리해야 한다고 배웠다. ** 클래스는 한 번에 하나의 역할만 하게끔 만드는 것이 OOP의 원칙이다. 예를 들어서 워드 프로세서라면 인쇄 코드가 문서를 ..

Type Object, 타입 객체 [디자인패턴](행동)

이러한 패턴을 만드는 의도는 클래스 하나를 인스턴스 별로 다른 객체형으로 표현할 수 있게 만들어서 새로운 "클래스들"을 유연하게 만드는 것이다. 이것은.. 객체지향프로그래밍의 원칙, SOLID에서 비슷한 것이 있었지 아마? ?? 왜..?? 게임에서 플레이어가 잡을 몬스터 무리를 구현해보자. 몬스터는 체력, 공격, 그래픽 리소스, 사운드 등 다양한 속성이 있다. 다만.. 예제에서는 체력과 공격 속성만 고려해보자. class Monster { public: virtual ~Monster() {} virtual const char* getAttack() = 0; protected: Monster(int startingHealth) : health_(startingHealth) {} private: int he..

Dirty Flag, 더티 플래그 [디자인패턴](최적화)

의도는 불필요한 작업을 피하기 위해 실제로 필요할 때까지 그 일을 미루는 것이다. 게으른 초기화랑 비슷한 느낌을 가지고 있다. 한 번 알아보자 많은 게임에서 월드에 들어있는 모든 객체를 장면 그래프라는 큰 자료구조에 저장한다. 렌더링 코드에서는 장면 그래프를 이용해서 어떤 것을 화면에 그려야 하는지를 결정한다. 장면 그래프를 가장 간단하게 만들겠다면 그냥 객체 리스트 하나만 있으면 된다. 모든 객체에는 모델 혹은 그래픽에 관련된 기본 단위 데이터와 함께 변환 값이 들어 있다. 변환 값은 객체의 위치, 회전, 크기 조절 (Position, Rotation, Scale) 등이 있다. 변환 값만 바꾸면 쉽게 객체를 옮기거나 회전시킬 수 있다. 렌더러가 객체를 그릴 때에는 먼저 객체 모델을 받아서 변환을 적용한..

Service Locator, 서비스 중개자 [디자인패턴](디커플링)

이 패턴을 쓰는 의도는 서비스를 구현한 구체 클래스는 숨긴 채로 어디에서나 서비스에 접근할 수 있게 하기 위함이다. 무슨 말인지는 알아보도록 하자 객체나 시스템 중에서는 거의 모든 코드에서 사용되는 것들이 있다. 게임 코드 중에서 메모리 할당, 로그, 난수 생성을 쓰지 않는 곳을 찾아보기는 어렵다. (패턴을 쓰게 되는 계기) 이런 시스템은 게임 전체에서 사용 가능해야 하는 일종의 서비스라고 할 수 있다. 예를 들자면 오디오 시스템 같은 경우도 메모리 할당같은 저수준까지는 아니지만 여러 게임 시스템과 연결되어 있다. (당연히 소리가 날만한 동작들은 무지하게 많다.) 돌이 굴러 떨어지는 소리라든가, 총을 쏘는 소리라든가, 사용자가 인터페이스를 조작한다는 등 많은 시스템과 연관되어 있다. 즉, 이런 코드에서는..

Object Pool, 오브젝트 풀, 객체 풀 [디자인패턴](최적화)

의도는 객체를 매번 할당, 해제하지 않고 고정 크기 풀에 들어있는 객체를 재사용함으로써 메모리 사용 성능을 개선한다. ?? 해제하지 않는데.. 어떻게 메모리 사용 성능이 개선된다는거지??? 알아보자 게임에서는 시각적 효과가 필요하다. 플레이어가 마법을 쓰면 빛이 나고 플레이어가 총을 쏘면 총알이 날라간다. 그 중에서 빛은 파티클 시스템이 필요하다. 마법을 몇 번 쓰는 것만으로도 수많은 파티클 생성되어야 하기 때문에.. 굉장히 빠르게 만들 수 있어야 한다. 더욱 중요한 것은 파티클을 생성, 제거하는 과정에 메모리 단편화가 생겨서 안 된다는 점이다. **메모리 단편화는 경계해야 한다. 단편화란 힙에 사용 가능한 메모리 공간이 크게 뭉쳐 있지 않고 작게 조각나 있는 상태를 말한다. 그림을 보자 ?? 메모리는 ..

Subclass Sandbox, 하위 클래스 샌드박스 [디자인패턴](행동)

목적은 상위 클래스가 제공하는 기능들을 통해서 하위 클래스에서 행동을 정의하는 것이다. 알아보자 아이들은 누구나 슈퍼히어로가 되고 싶어 하지만, 지구에는 우주 광선이 공급 부족 상태다. 이런 아이들이 슈퍼히어로를 가장 그럴싸하게 체험할 수 있는 수단이 바로 게임이다. 기획자는 게임으로 뭐든 만들 수 있다고 생각하는 사람들이기 때문에 우리가 만들 슈퍼히어로 게임에서는 수십 가지가 넘는 초능력을 선택할 수 있다. 먼저 Superpower라는 상위 클래스를 만든 후에 초능력별로 이를 상속받는 클래스를 정의하려한다. 기획서를 나눠서 받은 프로그래머들이 구현을 마치고 나면 수십 개가 넘는 초능력 클래스가 만들어져 있을 것이다. 어떠한 초능력이라도 다 쓸 수 있는 풍부한 게임 월드를 제공하고 싶다. 이를 위해서는 ..

Bytecode, 바이트코드 [디자인패턴](행동)

이 패턴은 가상 머신 명령어를 인코딩한 데이터로 행동을 표현할 수 있게 해준다. ?? 뭐라는거야 ?? 알아보자 게임 개발이 재밌을 수는 있다. 나도 그렇게 느낀다. 그렇다고 해서 쉽진 않다. 게임은 모든 기술의 집약체이기 때문이다. 네트워크가 발전해서 실시간 게임이 나왔고 램이 늘어나서 방대한 게임이 나왔고, CPU가 발전해서 실제와 같은 물리현상을 적용한 게임이 나왔고 GPU가 발전해서 실제와 구분이 안가는 그래픽을 보여주는 게임이 나오는 등.. 모든 기술의 발전이 게임과 연관되어있다. 그만큼 게임은 엄청나게 볼륨이 커졌고 재미있어도 쉽지는 않게 되었다. 또한 모든 플랫폼을 넘나들 수 있게 만들어야.. 수익도 유저도 많이 확보할 수 있다. 또한 플랫폼이 바뀌더라도 게임의 품질이 어느정도 보장되어야 한다..

728x90
반응형