분류 전체보기(45)
-
프로토타입(Prototypical) 패턴
프로토 타입 패턴 : 원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다. 한 가지 스포너는 한 가지 몬스터 인스턴스만 만든다고 예를 들면 다음과 같은 클래스 상속 구조를 따르게 된다. 이러한 상속구조를 코드로 그대로 옮기게 된다면 코드의 중복성이 높기 때문에 비 효율적이다. 이러한 구조에서 프로토 타입 패턴으로 해결 할 수 있는 방법이 있다. 핵심은 어떤 객체가 자기가 비슷한 객체를 스폰 할 수 있다는 점이다 이를 구현하기 위해 Monster 클래스에 추상 메서드 clone()을 추가하는 과정이다. 1 2 3 4 5 6 class Monster { public: virtual void ~Monster(); virtual Monster* c..
2024.03.18 -
관찰자(Observer) 패턴
관찰자 패턴 : 객체 사이에 일 대 다의 의존관계를 정의해두어 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지받고 자동으로 업데이트될 수 있게 만듭니다. mvc(model-view-controller) 구조를 쓰는 프로그램이 발에 치일 정도로 많다. GoF 패턴중에 관찰자 패턴은 가장 널리 사용되고 있는 패턴이다. 또한 게임에서도 굉장히 많이 사용된다. 필자도 관찰자 패턴을 애용했다. 몬스터를 몇 마리 잡았는지 관찰하고 다음 스테이지로 가는 포털이 열리게 하는 등 많은 곳에서 사용했다. 예를들어 업적 시스템을 만든다고 해보자. 1 2 3 4 5 6 7 8 class Observer { public: virtual Observer() {} virtual void onNo..
2024.03.15 -
경량 패턴
경량패턴 : 공유 sharing 을 통해 많은 수의 소립 fine-grained 객체들을 효과적으로 지원한다. 게임에서 우리가 화면을 가득 채운 빽빽한 숲을 볼 때 그래픽스 프로그래머는 수백만개의 폴리곤을 본다 나무마다 필요한 데이터가 다음과 같이 있다고 가정해보자 - 줄기, 가지, 잎의 형태를 나타내는 폴리곤 메시 - 나무 껍질과 잎사귀 텍스쳐 - 필드에서의 위치와 방향 - 크기와 음영 등 값 조절이 가능한 매개변수 1 2 3 4 5 6 7 8 9 10 11 class Tree { private: Mesh mesh; Texture bark_; Texture leaves_; Vector position_; double height_; double thickness_ ; Color barkTint_; Co..
2024.03.15 -
명령(command) 패턴
명령 패턴은 메서드 호출을 실체화 한 것이다. 게임에서 버튼, 키보드, 마우스 등 유저 입력을 읽는 코드가 있다. 1 2 3 4 5 6 7 void InputHandler::handleInput() { if (isPressed (BUTTON_X)) jump(); else if (isPressed (BUTTON_Y)) fireGun(); else if (isPressed(BUTTON_A)) swapWeapon(); else if (isPressed (BUTTON_B)) lurchIneffectively(); } Colored by Color Scripter cs 일반적으로 이러한 함수는 매 프레임마다 호출된다. 입력 키 변경을 불가능 하게 만드려면 상관 없지만 많은 게임들은 키 변경이 가능하다. 키 변경을..
2024.03.11 -
게임 구조에 대한 중요성
디커플링 - 양쪽 코드 중에서 한 쪽이 없으면 이해 할 수 없는 코드를 커플링 코드라고 한다. 디 커플링 코드는 각각을 따로 이해 할 수 있다. 디커플링의 목표는 작업에 들어가기 전 알아야 할 지식의 양을 줄이는 데에 있다. 성능과 속도 - 인터페이스를 쓰는 이유는 클래스 뿐 아니라 인터페이스를 구현하는 어떤 클래스가 와도 코드가 문제없이 동작하도록 만들기 위해서이다. - 처음에는 코드를 유연하게 유지하다가 기획이 확실해지면 추상계층을 제거해 성능을 높이는 타협안도 있다. 프로토타이핑 - 버릴 코드를 계속 유지해야 할 가능성이 있다면 방어적으로 잘 만들어야 한다. 1. 추상화와 디커플링을 잘 활용하면 코드를 점차 쉽고 빠르게 만들 수 있지만 지금 고민중인 코드에 유연함이 필요하다는 확인이 없다면 시간낭비..
2024.03.10 -
Module (모듈)
1. 모듈 사용 전 세팅 c++ 언어 표준을 최신 c++ 초안의 기능으로 바꿔줘야 합니다. 모듈에서 내보내고 싶은 부분은 export로 모듈 선언시에는 import를 사용한다. 모듈화의 장점은 간단한 기능 작성 시 헤더와 cpp파일 2개의 파일을 만들 필요가 없다는 점에서 장점이 있지만 아직 큰 프로젝트에서 사용하기에는 버그가 좀 있는것같다.. 모듈의 장점: 1.컴파일 속도 향상: 모듈은 선행 컴파일을 사용하여 컴파일 속도를 크게 향상시킵니다. 전통적인 헤더 파일 방식에서는 전체 코드를 다시 컴파일해야 했지만 모듈은 변경된 부분만 다시 컴파일하므로 대규모 프로젝트의 빌드 시간을 크게 줄일 수 있습니다. 2. 명확한 의존성 관리: 모듈은 물리적인 파일 구조를 사용하여 모듈 간의 명확한 의존성을 정의합니다...
2023.10.27