Computer Science (24) 썸네일형 리스트형 [게임 프로그래밍 패턴] 16. 데이터 지역성 패턴 데이터 지역성 패턴 (Data Locality Pattern) 321 : CPU 캐시를 최대한 활용할 수 있도록 데이터를 배치해 메모리 접근 속도를 높인다. 326 : 자료구조를 잘 만들어서 처리하려는 값이 메모리 내에서 서로 가까이 붙어 있도록 하는 것이 목표다. 데이터 지역성 패턴 데이터 지역성을 높일수록, 즉 데이터를 처리하는 순서대로 연속된 메모리에 둘수록 캐시를 통해서 성능을 향상할 수 있다. 언제 쓸 것인가? 성능 문제가 캐시 미스 때문일 경우 사용한다. 다른 이유 때문이라면 도움되지 않는다. 주의사항 데이터 지역성 패턴을 위해서는 추상화를 일부 희생해야한다. 최적화에 대한 추가적인 설명들 많은 프로그래머들은 메모리에서 객체를 복사로 옮기기를 꺼린다. 여러 바이트를 옮기는 것이 포인터를 할당하.. [게임 프로그래밍 패턴] 15. 서비스 중개자 패턴 서비스 중개자 패턴 (Service Mediator Pattern) 303 : 서비스를 구현한 구체 클래스는 숨긴 채로 어디에서나 서비스에 접근할 수 있게 한다. 서비스 중개자 패턴 서비스는 여러 기능을 추상 인터페이스로 정의한다. 구체 서비스 제공자는 이런 서비스 인터페이스를 상속받아 구현한다. 이와 별도인 서비스 중개자는 서비스 제공자의 실제 자료형과 이를 등록하는 과정은 숨긴채 적절한 서비스 제공자를 찾아 서비스에 대한 접근을 제공한다. 언제 쓸 것인가? 무엇이든지 프로그램 어디에서나 접근할 수 있게 하면 문제가 생기기 쉽다. 접근해야 할 객체가 있다면 필요한 객체를 인수로 넘겨줄 수는 없는지부터 생각해보자. 하지만 객체를 직접 넘기는 방식이 불필요하거나 코드를 어렵게 만들 경우, 그리고 본질적으로.. [게임 프로그래밍 패턴] 14. 이벤트 큐 패턴 이벤트 큐 패턴 (Event Queue Pattern) 281 : 메시지나 이벤트를 보내는 시점과 처리하는 시점을 디커플링한다. 이벤트 큐 패턴 큐는 요청이나 알림을 들어온 순서대로 저장한다. 알림을 보내는 곳에서는 요청을 큐에 넣은 뒤에 결과를 기다리지 않고 리턴한다. 요청을 처리하는 곳은 큐에 들어 있는 요청을 나중에 처리한다. 요청은 그곳에서 직접 처리될 수도 있고, 다른 여러 곳으로 보내질 수도 있다. 이를 통해 요청을 보내는 쪽과 받는 쪽을 코드뿐만 아니라 시간 측면에서도 디커플링한다. 언제 쓸 것인가? 메시지를 보내는 시점과 받는 시점을 분리하고 싶을 때 사용한다. 보내는 쪽에서 처리 응답을 받지 않아도 될 때 유용하다. 주의사항 중앙 이벤트 큐는 전역 변수와 같다. - 이벤트 큐는 모든 게임.. [게임 프로그래밍 패턴] 13. 컴포넌트 패턴 컴포넌트 패턴 (Component Pattern) 259 : 한 개체가 여러 분야를 서로 커플링 없이 다룰 수 있게 한다. 컴포넌트 패턴 여러 분야를 다루는 하나의 개체가 있다. 분야 별로 각각의 코드를 별도의 컴포넌트 클래스에 둔다. 개체 클래스는 단순히 이들 컴포넌트들의 컨테이너 역할만 한다. 언제 쓸 것인가? 한 클래스에서 여러 분야를 건드리고 있어서, 이들을 서로 디커플링하고 싶다. 클래스가 거대해져서 작업하기가 어렵다. 여러 다른 기능을 공유하는 다양한 객체를 정의하고 싶다. 상속으로는 원하는 부분만 골라서 재사용할 수가 없다. 주의사항 컴포넌트끼리 통신하기도 더 어렵고, 컴포넌트들을 메모리 어디에 둘지 제어하는 것도 더 복잡하다. 코드베이스 규모가 크면 이런 복잡성에서 오는 손해보다 디커플링과.. [게임 프로그래밍 패턴] 12. 타입 객체 패턴 타입 객체 패턴 (Type Object Pattern) 239 : 클래스 하나를 인스턴스별로 다른 객체형으로 표현할 수 있게 만들어, 새로운 '클래스들'을 유연하게 만들 수 있게 한다. 타입 객체 패턴 타입 객체 클래스와 타입 사용 객체 클래스를 정의한다. 타입 사용 객체는 자신의 타입을 나타내는 타입 객체를 참조한다. 상속 처리를 하드코딩하지 않고서도 마치 상속받는 것처럼 비슷한 객체끼리 데이터나 동작을 공유할 수 있다. 언제 쓸 것인가? 나중에 어떤 타입이 필요할 지 알 수 없다. 컴파일이나 코드 변경 없이 새로운 타입을 추가하거나 타입을 변경하고 싶다. 주의사항 타입 객체를 직접 관리해야 한다. - 타입 객체를 생성하고, 이를 필요로 하는 몬스터가 있는 한 메모리에 유지해야 한다. 몬스터 인스턴스를.. [게임 프로그래밍 패턴] 11. 하위 클래스 샌드박스 패턴 하위 클래스 샌드박스 패턴 (Subclass Sandbox Pattern) 225 : 상위 클래스가 제공하는 기능들을 통해서 하위 클래스에서 행동을 정의한다. 227 : 하위 클래스 샌드박스 패턴을 쓰면클래스 상속 구조가 얇게 퍼진다. 많은 클래스가 Superpower를 상위 클래스로 두기 때문에 코드 입장에서는 전략적 요충지를 확보할 수 있다. 하위 클래스 샌드박스 패턴 상위 클래스는 추상 샌드박스 메서드와 여러 제공 기능을 정의한다. 제공 기능은 protected로 만들어져 하위 클래스용이라는 걸 분명히 한다. 각 하위 클래스는 제공 기능을 이용해 샌드박스 메서드를 구현한다. 패턴을 쓰지 않는다면? 중복 코드가 많아진다. 거의 모든 게임 코드가 초능력 클래스와 커플링된다. 외부 시스템이 변경되면 초능.. [게임 프로그래밍 패턴] 10. 바이트코드 패턴 바이트코드 패턴 (Bytecode Pattern) 203 : 명령어 집합은 실행할 수 있는 저수준 작업들을 정의한다. 명령어는 일련의 바이트로 인코딩된다. 가상 머신은 중간 값들을 스택에 저장해가면서 이들 명령어를 하나씩 실행한다. 명령어를 조합함으로써 복잡한 고수준 행동을 정의할 수 있다. 바이트코드의 사용 언어가 너무 저수준이라 만드는 데 손이 많이 가거나 오류가 생기기 쉽다. 컴파일 시간이나 다른 빌드 환경 때문에 반복 개발하기가 너무 오래 걸린다. 보안에 취약하다. 정의하려는 행동이 게임을 깨먹지 않게 하고 싶다면 나머지 코드로부터 격리해야 한다. 디자인 결정 스택 기반 VM - 명령어가 짧다. - 코드 생성이 간단하다. - 명령어 개수가 많다. 레지스터 기반 VM - 명령어가 길다. - 명령어 .. [게임 프로그래밍 패턴] 9. 업데이트 메서드 패턴 업데이트 메서드 패턴 (Update Method Pattern) 컬렉션에 들어있는 객체별로 한 프레임 단위의 작업을 진행하라고 알려줘서 전체를 시뮬레이션한다. 182 : 게임월드는 객체 컬렉션을 관리한다. 각 객체는 한 프레임 단위의 동작을 시뮬레이션하기 위한 업데이트 메서드를 구현한다. 매 프레임마다 게임은 컬렉션에 들어 있는 모든 객체를 업데이트한다. 업데이트 메서드의 사용 동시에 동작해야 하는 객체나 시스템이 게임에 많다. 각 객체의 동작은 다른 객체와 거의 독립적이다. 객체는 시간의 흐름에 따라 시뮬레이션되어야 한다. 주의사항 코드를 한 프레임 단위로 끊어서 실행하는게 더 복잡하다. 다음 프레임에서 다시 시작할 수 있도록 현재 상태를 저장해야 한다. → 이럴 때 상태 패턴이 유용하다. 모든 객체는.. 이전 1 2 3 다음