게임 데이터 관리 여러 프로젝트들을 경험 하면서 게임데이터를 관리했던 방법에 대해 기록해 두고자한다. 자세한 구현 방식보다는 데이터 관리하는 전체적인 구조에 대해 이야기 해보자. 0. 엑셀 이제껏 경험해온 모든 프로젝트는 데이터 관리를 엑셀로 하였다. 아무래도 기획자분들이 가장 다루기 편하고 보편적인 프로그램이 엑셀일 테니까 그리고 별도의 데이터 테이블 툴을 만들기엔 프로그래머의 유지보수가 들어가야되기 때문이 아닐까? 이제 엑셀 데이터를 어떤 포멧으로 추출하여 게임에서 읽어 들일 것인가가 중요하다. 1. Text File Text 파일 포멧은 csv, xml, lua, json 등 여러 형태가 있다. 파일 포멧별로 저마다의 문법이 있고, 저마다의 장단점이 있겠지만, 결국, 어떤 파일 포멧이든 엑셀 데이터..
10장 리액티브 프로그래밍 & 리액터 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 리액티브 프로그래밍 Reactive Programming 이해하기 프로젝트 리액터 Project Reactor 리액티브 데이터 오퍼레이션 Operating on data reactively 왜 리액티브 프로그램을 쓰는가? 신문을 구독받는다고 가정해보자. 1년 치 구독료를 지불하였는데 배달이 오지 않고 1년 치 신문이 모두 준비되면 그제야 배달을 시작한다면 어떻게 될까? 당연히 말이 되지 않는다. 실제로는 기사가 최신일 때 독자가 읽을 수 있도록 출간 후 가능한 빨리 배달된다. 또한 독자가 기사를 읽는 동안 기자는 새로운 다음 기사를 작성한다. ..
언리얼 엔진의 배열 TArray TArray는 문자그대로 배열 컨테이너이며, 언리얼 엔진(Unreal Engine)에서 가장 자주 쓰이는 컨테이너 클래스이다. 만들고 채우기 Init 함수로 배열을 같은 엘리먼트 사본으로 입력받은 갯수만큼 채운다 //배열의 선언 TArray IntArray; //Init 함수로 채우기 IntArray.Init(10, 5); //InitArray = [10,10,10,10,10] Add와 Emplace 함수로 배열 끝에 항목을 추가할 수 있다. Add는 객체를 복사하여 배열에 넣고 Emplace는 객체를 배열안에서 생성한다. 간단한 유형(int, float 등)은 Add를 사용해도 무방하지만 복잡한 구조체를 엘리먼트로 사용할때는 Emplace가 효율이 더 좋다. //배열 끝..
Spring Integration 스프링 통합 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 실시간으로 데이터 처리하기 통합 플로우 정의하기 스프링 통합의 자바 DSL 정의 사용하기 이메일과 파일 시스템 및 다른 외부 시스템과 통합하기 (이 장의 자세한 정리는 생략합니다.) 9.1 간단한 통합 플로우 선언하기 애플리케이션은 통합 플로우를 통해 외부 리소스나 애플리케이션 자체에 데이터를 수신, 전송 할 수 있다. 애플리케이션이 통합할 수 있는 리소스 중 하나가 파일 시스템이다. 9.1.1 XML 을 사용해서 통합 플로우 정의하기 9.1.2 Java 로 통합 플로우 구성하기 9.1.3 스프링 통합으로 DSL 구성 사용하기 9.2 ..
문자열 FString 언리얼 엔진(Unreal Engine)에는 FString, FName, FText의 문자열 클래스가 존재한다. 그 중 FString은 조작이 가능한 유일한 클래스이다. 변환 //FString 선언 FString TestString = FString(TEXT("My String")); //다른 문자열 클래스로 변환 //---------------------------------- //FString에서 FName으로 //FName은 대소문자를 구분하지 않기 때문에 손실될 위험이 있다 FName TestName = FName(*TestString); //FString에서 FText로 //FText의 자동 현지화(auto localization)의 혜택을 받지 못한다 FText TestTe..
6.5 변환 C++에는 서로 다른 4가지의 형변환 연산자가 있다. static_cast dynamic_cast const_cast reinterpret_cast C스타일 형변환도 지원하지만 C스타일 형변환은 사용하지 말자 기본 클래스와 파생 클래스 간의 변환 업 캐스팅 업 캐스팅(Up Casting)은 기본 클래스에서 파생 클래스로의 형변환은 모호함이 없으면 항상 가능하다. struct A { int ma; } struct B : A { float mb; int fb() { return 3;} }; struct C : A { }; struct D : B, C { }; void f(A a) {}; void g(A& a) {}; void h(A* a) {}; int main { B b; //모두 A타입 개체..
6.4 서브 타입별 동적 선택 switch문을 이용해 프로그램을 동적으로 선택하도록 구현해보자. class matrix {}; class vector {}; void cg(const matrix& A, const vector& b, vector& x); void bicg(const matrix& A, const vector& b, vector& x); struct solver { virtual void operator()(const matrix& A, const vector& b, vector& x)= 0; virtual ~solver() {} }; // 잠재적으로 템플릿화 됨 struct cg_solver : solver { virtual void operator()(const matrix& A, co..
Kafka 로 메시지 전송하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 비동기 메시지 전송 JMS, RabbitMQ, 카프카 Kafka를 사용해서 메시지 전송하기 브로커에서 메시지 가져오기 메시지 리스닝하기 8.3 카프카 사용하기 카프카는 확장성을 제공하는 cluster 로 실행되도록 설계되었다. 클러스터의 모든 카프카 인스턴스에 걸쳐 토픽(topic) 을 파티션(Partition) 으로 분할하여 메시지를 관리한다. RabbitMQ 가 exchange 와 큐를 사용해서 메시지를 처리하는 반면 카프카는 토픽만 사용한다. 카프카의 토픽은 클러스터의 모든 브로커에 걸쳐 복제된다. (replicated) 클러스터의 각 노드는 하..
6.3 다중 상속 복수의 부모 클래스 클래스는 여러 슈퍼 클래스에서 파생될 수 있다. class student { virtual void all_info() const { cout
중복 제거 상속과 암시적 업 캐스팅을 사용해 불필요한 멤버와 자유함수의 구현을 피할 수 있다. 클래스가 슈퍼 클래스로 암시적 형변환된다 공통 기능을 한번만 구현하고 모든 파생 클래스에서 이 공통 기능을 재사용 할수 있다. 다음 행렬의 예제와 같이 공통 기능을 한곳에서 구현하게 되면 모든 클래스의 변경사항을 즉시 적용 할 수 있다. 자유함수는 암시적 업 캐스팅 덕분에 파생된 모든 클래스에서 호출 가능하다 class base_matrix { public: base_matrix(size_t nr, size_t nc) : nr(nr), nc(nc) { } size_t num_rows() const { return nr; } size_t num_cols() const { return nc; } private: s..
6. 객채 지향 프로그래밍 6.1 기본 원칙 추상화(Abstraction) : 클래스는 개체의 특성과 멤버 함수를 정의, 클래스는 특성의 불변성을 지정할 수도 있음 캡슐화(Encapsulation) : 구현의 세부 사항을 숨기는 원칙. 내부 특성은 불변성을 위반하지 않기 위해 직접 접근 할 수 없으며, 클래스의 멤버 함수를 통해서만 접근할 수 있다. 상속(Inheritance) : 파생 클래스가 기본 클래스의 모든 멤버 변수와 멤버 함수를 포함한다는 원칙 다형성(Polymorphism) : 문맥이나 매개변수에 따라 해석하는 식별자의 능력 기본 클래스와 파생 클래스 class person { public: person() { } explicit person(const string& name) : name(..
RabbitMQ 메시지 전송하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 비동기 메시지 전송 JMS, RabbitMQ, 카프카 Kafka를 사용해서 메시지 전송하기 브로커에서 메시지 가져오기 메시지 리스닝하기 8.2 RabbitMQ 와 AMQP 사용하기 AMQP(Advanced Message Queueing Protocol)의 가장 중요한 구현이라 할 수 있는 RabbitMQ 는 JMS 보다 더 진보된 메시지 라우팅 전략을 제공한다. JMS 메시지가 수신자가 가져갈 메시지 도착지 이름을 주소로 사용하는 반면, AMQP 메시지는 수신자가 리스닝하는 큐와 비리된 거래소(exchange) 이름과 라우팅 키를 주소로 사용한다. ..