전체 글 102

[게임 프로그래밍 패턴][8]이중 버퍼

개요이중 버퍼는 지속적으로 갱신되는 데이터가 있을때 아직 완성되지않은 중간 처리 단계에서 해당 데이터에 접근하려하면 현재 상태가 아닌 완성된 가장 최신버전의 데이터를 제공해주는 기법이다. 대표적인 것이 그래픽스의 교환 사슬이다. 비디오 드라이버가 화면을 렌더링하려고하면 교환사슬의 읽기용 버퍼를 제공해주고 쓰기는 쓰기용 버퍼에 진행한다. cpu내에서의 로직에서도 멀티 스레드, 인터럽트등에 의해 데이터 처리 중간에 데이터 접근이 발생할 수 있고 이러한 경우에 이중버퍼 기법을 사용할 수 있다. 동기에서의 사용위 예시처럼 비동기 상황외 동기상황에도 이중버퍼를 쓸 수 있다. A 데이터를 갱신하는 과정에서 참조하는 데이터가 A 데이터에 영향받는 경우이다.Update대표적인 경우는 Update처리이다. 만약 여러 엑..

[게임 프로그래밍 패턴][7]상태 패턴

개요상태 패턴은 FSM과 같이 상태에 따라 다른 동작을 수행하는 클래스를 만드는 기법이다. 그러한 동작을 수행할 클래스를 A라고 하자. 상태를 정의하는 상위 상태 클래스에서 Input처리 메소드, Update 메소드 등을 A의 레퍼런스를 받아 처리하는 가상 메서드로 정의한다. 그리고 각 상태 클래스에서 이를 상속받아 A가 해당 상태일때 해당 메소드에서 처리할 수행을 구현한다. A에서는 현재 상태를 나타내는 상태 객체의 포인터를 가지고 input처리, update등에서 해당 객체의 해당 메소드에 자신을 넘겨 처리한다. 만약 그로인해 상태가 변한다면 상태 클래스의 해당 메서드에서 변한 상태 객체 포인터를 리턴하고 A는 그것을 받아 새로 장착한다.또한 각 상태 객체는 자신의 필드를 가져 상태에서 사용할 변..

[게임 프로그래밍 패턴][6]싱글턴

개요싱글턴 패턴은 오직 한개만 존재하며 전역적으로 접근 가능한 클래스 인스턴스를 운용하는 패턴이다. 특정 클래스의 static 인스턴스와 그를 리턴해주는 static 메소드로 구현한다. 지역 static 변수의 초기화 시점이 최초 도달이라는 점을 이용해서 구현하기도한다.싱글턴은 게으른 초기화, 런타임 초기화, 상속 가능, 유일 인스턴스 보장 및 전역 접근 이라는 특성을 가져 이들이 유용할 때 사용된다. 문제점싱글턴은 남용해서는 안되는데 문제점이 몇가지 있기 때문이다.전역 접근전역 접근은 모든 코드에서의 접근을 허용한다는 이야기이기 때문에 생산성을 낮출 수 있다.두개의 문제를 동시에 해결한다.싱글턴은 유일 인스턴스와 전역 접근 두가지를 동시에 제공한다. 만약 둘 중 하나만 필요한 상황이라면..

[게임 프로그래밍 패턴][5]프로토타입 패턴

개요프로토타입 패턴은 기존에 만들어진 인스턴스를 복사하여 새로운 인스턴스들을 만들어내는 기법을 말한다. 이를 통해 복사할 인스턴스를 갈아끼우거나 수치를 바꿈으로써 클론될 인스턴스들의 값도 바꿀 수 있다. 언리얼 엔진의 CDO와 비슷한 개념인듯하다. 프로토타입 기반 언어클래스로 인스턴스를 만들어내는것이 아닌 인스턴스로 인스턴스를 만들어낸다는 기법에 집중한 프로토타입 기반의 언어들이 있다. 이러한 언어들은 C++과 같이 클래스의 생성자로 인스턴스를 만들지 않고 기존의 다른 인스턴스를 복제하여 인스턴스를 만드는 식으로 운용된다. 이러한 언어들의 특징은 각 인스턴스들이 메서드와 필드들을 템플릿에 종속되지않고 자유롭게 추가 및 제거된다는 점이다. 또한 상속 대신 위임이라는 것을 사용한다. 위임은 다음과 같..

[게임 프로그래밍 패턴][4]Observer 패턴

개요 Observer 패턴은 관찰자가 관찰을 당하는 대상에게 자신을 등록시키고 대상이 알림을 주면 관찰자의 함수가 호출되는 패턴을 이야기한다. 언리얼의 Delegate등과 유사한 패턴이라고 볼 수 있다. 여기서 관찰을 당하는 대상을 줄여 대상이라고 말한다. 구현 Observer 패턴이 처음나왔을때는 한 Notify 가상 함수를 상속받은 관찰자들에 대해 대상이 자신에게 등록된 관찰자들의 Notify를 호출하는 방식으로 구현되었다. 하지만 이는 한 상위 클래스 당 한가지 시그니처만 구현할 수 있기에 융통성이 없었다. 최근에는 C#의 delegate, 자바스크립트의 eventListener, 언리얼의 delegate등이 함수 포인터(레퍼런스)를 직접 등록받아 등록된 함수들을 호출하는 방식으로 구현되어있다. 사..

[게임 프로그래밍 패턴][3]경량 패턴

개요 경량 패턴은 여러 객체에서 같은 값으로 사용되는 데이터들을 각자 값(또는 인스턴스)를 가지는게 아닌 같은 부분을 따로 객체로 만들고 해당 객체의 포인터를 가지는 방법을 이야기한다. 기본적인 메모리 최적화 기법이라고 볼 수 있다. 공유될 데이터는 적절한 위치에서 생성하여 저장하면 되는데 객체 풀등의 기법을 적용할 수도 있다. 렌더링 숲을 렌더링할 때 많은 수의 나무들이 있지만 나무의 메쉬와 텍스처는 모두 동일할때가 있다. 이때 gpu는 각 나무마다 메쉬와 텍스처를 받는것이 아닌 메쉬와 텍스처는 한 데이터를 공유하고 위치등의 각 나무마다 다른 데이터들만 각자 받아 렌더링한다. 경량 패턴이 적용된 경우라 볼 수 있다. 여기서 메쉬, 텍스처 같이 공유되는 부분을 고유 상태 또는 자유 문맥 상태라 하고 각자..

[게임 프로그래밍 패턴][2]Command 패턴

개요Command 패턴은 어떤 수행이나 동작을 실체화시켜 사용하는 것을 말한다. 여기서 실체화는 클래스등의 인스턴스로 만들어 사용한다는 이야기이다.이는 함수 포인터, 함수 객체와 비슷한 효과를 낸다. 하지만 거기에 더하여 클래스의 멤버로 수행의 상태를 저장하거나 undo등의 관련 수행들을 묶어 만드는등 더 디테일한 구현을 하는 패턴이다. 사용 예시 가장 간단한 예시는 가상 메서드 하나를 가진 Command 추상 클래스이다. 가상 메서드의 이름을 void excute()라 하자. 이 클래스를 상속하여 excute를 오버라이드하면 Command*를 저장하거나 받아 사용하는 부분에 자식 클래스들을 넣어 해당 클래스의 excute를 실행하도록 할 수 있다.여기서 특정 엑터가 수행하는 동작을 만든다고 ..

[게임 프로그래밍 패턴][1]도입

좋은 구조를 만든다는것해당 책에서는 좋은 소프트웨어의 구조를 만든다는 것은 이해하기 쉽고 변경하기 쉬운 구조를 만드는 것이라고 한다. 장기적으로 사용하는 코드는 결국 확장과 수정을 거쳐야 하는데 그럴때마다 변경과 관련된 부분을 다시 읽고 이해해야하며 이에 대한 소비 시간을 줄이는 것은 생산성의 증가로 이어진다. 변경자체를 하기 쉬운 구조는 말할 필요도 없을 것이다. 커플링소프트웨어 구조에서 커플링은 두개의 개발 단위(클래스, 함수 등)이 서로 얾켜있는 경우를 이야기한다. 조금 모호한 개념인데 책의 저자는 이를 한쪽만 보고 코드를 이해할 수 없다면 커플링되어 있다고 보고있다. 디커플링은 이러한 둘 사이의 의존성을 줄여 독립적으로 만드는 것을 말한다. 이를 통해 한쪽을 수정할 때 반대쪽까지 이해할 필..

3D 탑뷰 슈팅 로그라이크 <Just A Dream> 데모 버전 배포

데모버전 다운로드 링크입니다. https://drive.google.com/file/d/11wqXEFNWmJgKAo4Zu47Rgwykyl--y6Au/view?usp=drive_link 트레일러 영상 데모 플레이 영상 게임 소개 현대 총기들을 이용하여 판타지 세상의 적들을 상대하는 3D 탑뷰 슈팅 로그라이크 게임입니다. 스토리 잠에서 깨어난 당신 딸을 찾아 방으로 가보지만 딸은 없고 옷장에선 이상한 빛이 나오고 있었습니다. 옷장 안쪽에서 들려오는 괴성에 당신은 리볼버를 집어들고 그곳에 들어갔습니다. 게임 특징 긴박한 전투 플레이어와 적 모두 화력에 비해 낮은 체력을 가져 현실적이고 긴박한 전투가 이루어집니다. 수동 장전 좌측 하단의 탄띠 UI를 통해 총기 별로 적절한 수동 장전을 요구합니다. 총기 관통력 ..

[PyTorch]PyTorch 기초

개요PyTorch는 파이썬의 머신러닝 라이브러리이다. 내부적으로 GPU 사용이 가능하기에 속도가 빠르다.PyTorch는 다음의 핵심적인 요소들로 구성된다.tensor : numpy의 ndarray같은 n차원 데이터module : 인공지능 모델의 한 계층(한 개 이상의 레이어가 겹쳐진)을 나타내는 존재, module 하나를 곧 모델로 볼 수도 있으며 module을 모델 속 한 레이어로 쓸 수도 있다. 즉 모듈은 계층적으로 쌓일 수 있다. loss function : 모델로 계산한 결과와 실제 정답 라벨을 입력 시 loss를 리턴하는 함수optimizer: 모델에서 학습시켜나가야하는 파라미터를 관리하며 편미분값등을 참조하여 어떻게 학습시킬지를 정의하고 실제로 학습시키는 역할을 하는 객체 DevicePyTor..