분류 전체보기 188

런타임 Serialization - 1

개요 serialization(직렬화) : 객체나 객체 그래프를 바이트 스트림으로 변환하는 과정 deserialization(역직렬화) : 바이트 스트림을 다시 연결된 객체 그래프로 되돌리는 과정 이런 직렬화와 역직렬화는 다음과 같은 기능을 한다. 응용프로그램의 상태(=객체 그래프)를 파일이나 DB에 쉽게 저장하고 다시 불러올 수 있다. 객체들을 시스템의 클립보드에 복사/붙여넣기 할 수 있다. 사용자가 객체를 수정하는 동안 원본 객체들을 백업하는 용도로 쓸 수 있다. 객체를 네트워크를 통해 전송한다. 객체를 바이트 스트림으로 메모리에 serialize하면 데이터의 암호화나 압축 같은 작업을 수행할 때 유용하다. Serialization 해보기 public static void Main() { Memory..

언어/C# 2022.04.03

DOTS - 일단 시작2

2022.03.13 - [유니티/ECS] - Unity ECS - 일단시작 1 Unity ECS - 일단시작 1 2021.09.26 - [이론/설계] - ECS (Entity Component System) ECS (Entity Component System) ECS 정의 "A different paradigm of writing code, where we model our programs in a data oriented way" 유니티 EC.. tsyang.tistory.com 이전 글에서는 일단 큐브를 만들어서 ECS시스템으로 움직이도록 했다. 또한, 이전 글에서는 [GenerateAuthoringComponent]를 이용하여 Entity에 Component를 추가하고, Entities.Foreac..

게임엔진/DOTS 2022.03.16

DOTS - 일단 시작 1

2021.09.26 - [이론/설계] - ECS (Entity Component System) ECS (Entity Component System) ECS 정의 "A different paradigm of writing code, where we model our programs in a data oriented way" 유니티 ECS 메뉴얼에서는 ECS를 위와 같이 정의했다. 데이터 지향 설계방식은 아래 글을 참고. https:/.. tsyang.tistory.com ECS는 위 내용 참고.. Unity ECS? ECS는 아직 개발 중이라서 preview 버전만 쓸 수 있다. 업데이트할 때마다 클래스가 없어지거나 하는 경우도 많아서 좀 그렇긴 한데... 기본적인 원리는 배울 수 있으니까 그냥 시작해보자..

게임엔진/DOTS 2022.03.13

객체 풀

왜써야댐 객체를 생성하기 위해 힙 메모리를 할당/해제하다보면 메모리 단편화가 생긴다. 메모리 단편화는 특히 메모리가 부족한 모바일 환경에서 치명적이다. 객체 풀은 사용될 객체들을 위한 메모리를 미리 크게 잡아놓음으로써 메모리 단편화를 예방한다. 게다가 일부 관리 언어에서 GC호출 빈도를 줄여주는 효과도 있다. 그럼 언제씀 객체 풀 패턴은 다음과 같을 때 사용하면 좋다. 객체를 빈번하게 생성/삭제한다. 객체들의 크기가 비슷하다(같다). 객체를 힙에 생성하는 게 느리거나 메모리 단편화가 우려된다. DB나 네트워크 연결같이 접근 비용이 비싸면서 재사용 가능한 자원을 객체가 캡슐화하고 있다. 구현 아래와 같은 파티클 객체가 있다. class Particle { public: Particle() : frame_(..

데이터 지역성

https://tsyang.tistory.com/68 Data-oriented Design (데이터 지향 설계, DoD) CppCon 2014 - Mike Acton의 "Data-Oriented Design and C++"을 주로 참고해서 씀. https://www.youtube.com/watch?v=rX0ItVEVjHc 인트로 1. 소프트웨어는 플랫폼이다. 2. 코드는 실제 세계의 모델을 중심으로 설.. tsyang.tistory.com 데이터 지역성을 활용해야 하는 이유와 아이디어는 위 글에 써있다. 이 글에서는 구현에 대해 다룬다. 데이터 지역성 패턴 데이터 지역성 패턴은 성능 문제가 있을 때 써야한다. 필요 없는 곳에 적용해봐야 코드만 복잡해지고 유연성만 떨어진다. 특히 데이터 지역성 패턴은 성능..

업데이트 메서드

2022.01.31 - [이론/디자인패턴] - 게임 루프 게임 루프 게임 루프 게임 루프는 게임 시간 진행을 유저 입력, 프로세서 속도(!)와 디커플링 한다. 유저 입력은 알겠는데 프로세서 속도와 디커플링 한다는게 무슨 말일까? 굉장히 간단한 게임 루프를 보 tsyang.tistory.com 업데이트는 어떻게 게임 루프에 루프는 간략하게 다음과 같다. while(true) { processInput(); update(); render(); } update() 안에서는 게임의 개체들을 시뮬레이션한다. 그런데 어떻게? update() 안에 직접 각각의 개체들을 움직이는 코드를 작성해야 할까? 만약에 개체의 종류가 수백 가지라면? 코드가 점점 유지 보수하기 어려워질 것이다. 당연히 이런 경우 해결책은 간단하다..

타입 객체

왜 씀? 타입 객체 패턴은 다양한 '종류'를 정의할 때 컴파일이나 코드 변경 없이 새로운 타입을 추가하거나 변경할 수 있도록 해준다. 판타지 배경의 RPG 게임을 만든다고 하자. 이 게임의 몬스터는 여러 종족으로 나뉜다. 종족에 따라 최대 체력, 공격 속성 등이 달라진다. OOP 방식으로 구현 고블린, 오크, 용 등은 모두 몬스터의 일종이다. 따라서 몬스터라는 상위 클래스를 만드는 게 자연스럽다. (IS-A 관계) class Monster { public: virtual ~Monster(){} //공격 문구를 받아온다. virtual std::string attack() = 0; }; 하위 몬스터는 다음과 같이 구현될 것이다. class Goblin : public Monster { public: std..

게임 루프

게임 루프 게임 루프는 게임 시간 진행을 유저 입력, 프로세서 속도(!)와 디커플링 한다. 유저 입력은 알겠는데 프로세서 속도와 디커플링 한다는게 무슨 말일까? 굉장히 간단한 게임 루프를 보자. while(true) { processInput(); update(); render(); } processInput에서 유저의 입력을 처리하고, update에서 게임을 시뮬레이션 하고, render에서는 화면을 그린다. 당연한 얘기지만, 컴퓨터가 좋을 수록 1초에 돌릴 수 있는 루프의 횟수가 증가한다. 즉, 게임이 빨리 돌아가게 된다. 즉, 게임의 속도가 프로세서의 속도와 커플링 되어있는 것이다. https://youtu.be/r4EHjFkVw-s 144hz로 게임을 플레이하면 속도가 빨라지는 폴아웃4 어떻게 디..