본문 바로가기

Computer Science/Design Pattern

(15)
[게임 프로그래밍 패턴] 7. 이중 버퍼 패턴 이중 버퍼 패턴 (Double Buffer Pattern) 여러 순차 작업의 결과를 한 번에 보여준다. 테어링 현상을 피하기 위해서 코드는 픽셀을 한 번에 하나씩 그리되, 비디오 드라이버는 전체 픽셀을 한 번에 다 읽을 수 있게 해야 된다. 이중 버퍼 패턴을 통해 이것을 해결할 수 있다. 146 : 프레임버퍼를 두 개 준비해, 하나의 버퍼에는 지금 프레임에 보일 값을 둬서 GPU가 언제든 읽을 수 있게 한다. 그 동안 렌더링 코드는 다른 프레임 버퍼를 채운다. 렌더링 코드가 버퍼를 다 채운 뒤, 다음 프레임 버퍼로 전환하고, 이전 프레임버퍼는 새로운 화면을 그리기 시작한다. 이중버퍼의 사용 순차적으로 변경해야 하는 상태가 있다. 이 상태는 변경 도중에도 접근 가능해야 한다. 바깥 코드에서는 작업 중인 상..
[게임 프로그래밍 패턴] 6. 상태 패턴 상태 패턴 (State Pattern) 유한 상태 기계 (FSM) 125 : 유한 상태 기계(FSM) 가질 수 있는 상태가 한정된다. 한 번에 한 가지 상태만 될 수 있다. 입력이나 이벤트가 기계에 전달된다. 각 상태에는 입력에 따라 다음 상태로 바뀌는 전이가 있다. 129 : 상태 패턴 상태 인터페이스 상태별 클래스 동작을 상태에 위임 134 : Heroin 클래스에서는 서기 상태로 변경하기만 하면 서기 상태가 알아서 그래픽까지 챙긴다. 이래야 상태가 제대로 캡슐화되었다고 할 수 있다. 134 : FSM의 단점 엄격하게 제한된 구조를 강제함으로써 복잡하게 얽힌 코드를 정리할 수 있게 해준다. 하지만 그렇기 때문에 상태 기계를 인공지능과 같이 더 복잡한 곳에 적용하면 한계에 부딪히게 된다. 병행 상태 기..
[게임 프로그래밍 패턴] 5. 싱글턴 패턴 싱글턴 패턴 (Singleton Pattern) 103 : 오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공하는 패턴 싱글턴을 부적당한 곳에 사용하면 총상에 부목을 대는 것만큼이나 쓸모가 없다. 104 : 싱글턴의 장점 1. 오직 한 개의 클래스 인스턴스만 갖도록 보장 2. 전역 접근점을 제공 3. 한 번도 사용하지 않으면 인스턴스를 생성하지 않음 4. 런타임에 초기화 5. 싱글턴 상속 가능 108 : 싱글턴의 문제점 1. 전역변수 코드를 이해하기 어렵게 한다. 커플링을 조장한다. 멀티스레딩 같은 동시성 프로그래밍에 알맞지 않다. 2. 인스턴스를 한 개로 강제하고, 전역 접근을 원하는 두 가지를 모두 충족하는 상황에서만 유용하다. 3. Lazy Loading을 제어할 ..
[게임 프로그래밍 패턴] 4. 프로토타입 패턴 프로토타입 패턴 (Prototype Pattern) 기본 원형이 되는 인스턴스를 사용해서 생성할 객체의 종류를 명시하고 이렇게 만들어진 객체를 복사해서 새로운 객체를 생성하는 패턴 89 : 핵심은 어떤 객체가 자기와 비슷한 객체를 스폰할 수 있다는 점이다. public abstract class Monster { int health_, speed_; Monster(int health, int speed) { this.health_ = health; this.speed_ = speed; } public abstract Monster clone() throws CloneNotSupportedException; public void print() { System.out.println(this.getClass(..
[게임 프로그래밍 패턴] 3. 관찰자 패턴 관찰자 패턴 (Observer Pattern) 70 : 관찰자 패턴을 적용하면 어떤 코드에서 흥미로운 일이 생겼을 때 누가 받든 상관없이 알림을 보낼 수 있다. 81 : 대상이나 관찰자를 제거하면 어떻게 될 것인가라는 중요한 문제가 있다. 관찰자를 부주의하게 삭제하다 보면 대사에 있는 포인터가 이미 삭제된 객체를 가리킬 수 있다. 대상이 제거될 경우에는 '사망' 메시지를 관찰자에게 전달함으로써 관찰자가 기다리는 것을 막을 수 있다. 관찰자가 제거될 때 대상에 있는 관찰자도 제거하려면, 관찰자도 대상을 관리하고 있어야하기 때문에 상호참조가 생겨 복잡성이 늘어날 수 있다. 사라진 리스너 문제 해결 필요 83 : 관찰자 패턴을 사용하는 이유는 두 코드 간의 결합을 최소화하기 위해서다. 덕분에 대상은 다른 관찰..
[게임 프로그래밍 패턴] 2. 경량 패턴 경량 패턴 (Flyweight Pattern) 61 : 경량패턴은 어떤 객체의 개수가 너무 많아서 좀 더 가볍게 만들고 싶을 때 사용한다. 모든 객체의 데이터 값이 같아서 공유할 수 있는 데이터를 고유 상태(instrinsic state), 인스턴스별로 값이 다른 데이터를 외부 상태(extrinsic state)라고 부른다. 66 : 경량 패턴을 사용하면 객체를 마구 늘리지 않으면서도 객체지향 방식의 장점을 취할 수 있다. public class Terrain { private final int movementCost; private final boolean isWater; private final Texture texture; public Terrain(int movementCost, boolean i..
[게임 프로그래밍 패턴] 1. 명령 패턴 명령 패턴 (Command Pattern) 43 : 명령 패턴은 메서드 호출을 실체화한 것이다. 함수 호출을 객체로 감쌌다는 의미이다. 점프, 공격, 무기교체 등의 method를 직접 호출하는 것이 아니라 Command라는 객체로 감싸서 실행. 48 : 액터를 사용하면 더 유연한 코드를 만들 수 있다. 49 : 그냥 실행취소 기능을 구현하려면 매우 어렵지만, 명령 패턴을 이용하면 쉽게 만들 수 있다. 이전에 실행했던 명령을 저장하고 반대로 실행하면 된다. 54 : 명령 패턴을 쓰다 보면 수많은 Command 클래스를 만들어야 할 수 있다. 이럴 때에는 구체 상위 클래스에 상위 레벨 메서드를 만들어놓은 뒤, 필요하면 하위 클래스에서 원하는 작동을 재정의할 수 있게 하면 좋다. public abstract ..