728x90
반응형

Game Development, 게임개발 182

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

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

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

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

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

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

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

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

Update Method, 업데이트 메서드 ** [디자인패턴]

업데이트 메서드의 목적은 컬렉션에 들어있는 객체별로 한 프레임 단위의 작업을 진행하려고 알려줘서 전체를 시뮬레이션한다. 예를 들어 설명해보자 보석을 훔치는 퀘스트를 진행하고 있다. 보석은 오래 전에 죽은 마술사왕의 유골에 놓여 있다. 플레이어는 살금살금 마술사왕의 장엄한 무덤 입구로 다가갔고, 공격을 받..지 않았다. 저주받은 석상은 번개를 쏘지 않았고, 언데드 전사는 입구를 지키고 있지 않았다. 그냥 무덤으로 들어가 보석을 가져왔다. 게임은 끝났고, 우리는 승리했다. ???? 이게 게임인가 ????? 무덤은 무찔러야 하는 경비병이 지키고 있어야 한다. 해골 병사부터 되살려서 문 주위를 순찰하게 만들자. 게임 프로그래밍을 전혀 모른다고 가정했을 때 해골 병사가 비틀거리면서 왔다 갔다 하는 코드를 가장 간..

Game Loop Pattern, 게임 루프 패턴 ** [디자인패턴]

요약하자면 게임 시간 진행을 유저 입력, 프로세서 속도와 디커플링하는 것이다. 더 쉽게 말하자면 입력이 없어도 프로세서가 잘 돌아간다는 말이다. **저자는 이 패턴이 가장 중요하고 많이 쓰인다고 말했다. 이 패턴은 특수한데 이름만 봐도 게임 분야에서만 쓸 것 같고 실제로 게임 분야 외에서는 찾아보기 힘들다. 게임 루프가 얼마나 유용한지 알아보면서 배워보자 예전의 프로그래머들은 코드를 모두 짜고 나서야 프로그램을 돌릴 수 있었다. 중간에 확인하는 것은 거의 불가능에 가까웠다. 이런 것을 배치모드, batch mode 프로그램이라고 하는데 모든 작업이 끝나고 나면 프로그램이 멈췄다. 요즘도 배치 모드 프로그램이 있지만 예전과 같이 카드에 구멍을 뚫어서 기계에 넣는 과정은 하지 않아도 되었다. 즉, 여기서 나..

Double Buffer Pattern, 이중 버퍼 패턴 [디자인패턴]

이중 버퍼의 목적은 여러 순차 작업의 결과를 한 번에 보여준다는 데에 있다. 그렇다면 어떻게 이렇게 할 수 있는지 알아보자 본질적으로 컴퓨터는 한 번에 하나를 수행한다. CPU에서 Instruction에 대해 클럭을 소모하면서 순차적으로 하나씩 처리해나간다. 우리한테는 무척 빠른속도로 동작하기 때문에 동시에 하는 것처럼 보인다. 빠른 속도를 위해서는 큰 일을 잘 쪼개는 등 pipeline을 구현하면 더 빨라진다. 아무튼 컴퓨터는 빠른 속도로 작동하더라도 한 번에 하나씩 처리하는 것이 본질이다. 하지만 게임 유저의 입장으로 한 번에 여러 작업의 결과물을 봐야할 때가 있다. 대표적으로 렌더링, rendering을 생각해보자 유저에게 보여줄 게임 화면을 그릴 때는 멀리 있는 산, 구불구불한 언덕, 나무 전부를..

State Pattern, 상태 패턴 [디자인패턴]

사실 이 상태 패턴이란 것은 우리도 이미 알 수도 있고 모르더라도 이미 쓰고 있을 수 있다. [Unity, 유니티/Programming, 응용] - FSM,유한 상태 기계, Finite State Machines [Unity] 위 글과 밀접한 관련이 있다. 알아보자 간단한 횡스크롤 플랫포머를 만든다고 해보자. 플랫포머는 슈퍼 마리오와 비슷한 게임이라고 생각하면 된다. 게임 월드의 주인공이 사용자 입력에 따라 반응하도록 구현한다. //B를 누르면 점프하게끔 구현하는 코드 void Heroine::handleInput(Input input){ if(input == PRESS_B) { yVelocity_ = JUMP_VELOCITY; setGraphics(IMAGE_JUMP); } } 위에서 버그가 발생할 수..

Singletone Pattern, 싱글톤 패턴 [디자인패턴]

아마도 디자인 패턴은 몰라도 그냥 싱글톤이라는 말은 어디서든 한 번쯤 들어봤을만한 단어가 아닌가 나도 디자인 패턴을 배우기 전에도 이미 뭐 싱글 뭐시기는 들어봤었다. 그럼 진짜로 알아보자. 싱글톤은 오직 한 개의 클래스 인스턴스만을 갖도록 보장해야하고 이에 대한 전역적인 접근을 통해 조작한다. 이 패턴은 편리해서 문제다. 즉, 남발해서 문제가 된다. 그래서 싱글톤을 피하거나 쓸 거면 제대로 써야하기에 배우는 것이다. 남발하게 된다면 열나는 애한테 이마에 붕대를 감아주는 꼴이나 다름이 없다. 싱글톤의 특징인 오직 한 개의 클래스 인스턴스만 가지게 보장한다라는 점이 있다. 인스턴스가 여러 개면 제대로 작동하지 않는 상황이 종종 생기는데 외부 시스템과 상호작용하면서 전역 상태를 관리하는 클래스가 그런 일이 많..

Socket으로 통신 라이브러리 만들기

**읽고 외운다기보다 그냥 이런 식으로 진행되며 각 라인을 의미를 파악하는 것이 중요 라이브러리를 만드는 이유는 간단하다. 지속적으로 통신을 유지하기 위함이다. 통신의 기본은 접속, 송신, 수신, 접속 종료로 나눌 수 있다. 이를 실행하려면 Socket 클래스의 인스턴스를 참조해야 하므로 송수신이 이루어지는 곳마다 Socket 클래스의 인스턴스를 참조하는 코드를 작성해야 한다. 하지만 게임 프로그램 전체로 보면 Socket 클래스의 인스턴스는 게임 처리와 별도로 관리하고 싶다는 생각이 든다. 게임 프로그램에는 다른 단말과 통신만 하면 되는 것이지 굳이 Socket 클래스의 인스턴스를 다뤄야 하는가? 라는 의문이 생긴다. 그래서 모든 통신 방식이 비슷하다면 게임마다 따로 작성할 필요 없이 라이브러리에서 가..

728x90
반응형