본문 바로가기

전체 글

Awaitable Awaitable이란?C# System.Threading.Tasks의 대안으로 사용할 수 있는, 유니티 전용 비동기 프로그래밍을 할 수 있게 만든 Awaiter다. Runtime에서 호출되는 Task와 달리 유니티 업데이트 사이클과 연동되는 장점이 있다.예를 들면 EndOfFrameAsync를 사용할 경우 유니티의 각종 서브시스템이 모두 실행된 후에 프레임 마지막에 호출되는 것이 보장되는 식이다. 이와 같이 기존에 유니티에서 업데이트 루프와 연동되는 async/await를 사용하려면 UniTask 등의 외부 라이브러리를 사용했는데, 이제 유니티 엔진에 공식적으로 해당 역할을 하는 기능이 추가되었다. 단지 기능은 아직 부족하여서, 복잡한 작업을 처리하거나 세밀한 제어가 필요한 경우 여전히 UniTask를 .. 더보기
Unitask / Task 비교 먼저 기본 개념 요약항목 Task (기본 async/await) UniTask (Unity 전용 async/await)런타임 구조.NET CLR에서 ThreadPool, TaskScheduler 사용Unity 메인 스레드에서 작동, PlayerLoop에 통합내부 구조객체 생성 많음 (GC 발생), 박싱/언박싱 있음구조체 기반, 할당 없이 작동 (Zero Allocation)스레드 사용백그라운드 스레드 사용 가능대부분 메인스레드에서 실행됨성능 영향GC + 컨텍스트 스위칭으로 느림GC 없음, 더 빠름 C#의 기본 Task 동작 방식async Task MyAsyncMethod(){ awa.. 더보기
C++ Priority Queue C++에서는 Priority Queue 우선순위 큐가 있다. (C#도 존재함) queue와 차이점 queue 일반 큐는 "선입선출(FIFO)" 방식이라 정렬 개념이 없음그래서 int 타입만 알면 됨 내부 컨테이너는 기본적으로 deque를 사용 (하지만 명시하지 않아도 됨) priority_queue> 우선 순위 큐는 정렬된 상태를 유지해야 하는 자료구조따라서 내부에 저장된 데이터를 정렬 가능한 컨테이너에 담고 있어야 한다.기본 컨테이너는 vector (정렬, 힙 구조 관리에 적합) 기본 사용법 priority_queue> pq; //기본 오름차순priority_queue, greater> pq; //내림차순 tip : 2번째 인자인 vector는 명시를 안해줘도 되지만 내림차순을 하기위해 3번째 인자를 .. 더보기
C++ SSO SSO (Short String Optimization)많은 구현체(libstdc++, libc++)에서 짧은 문자열은 힙이 아닌 스택 내버퍼에 저장하기도 한다. 이를 SSO (Short String Optimization)라고 하는데std::string s = "dsadsadsaaasda";이런식으로 선언을 했다고 하면 보통 s는 스택에 "dsadsadsaddas"라는 문자열은 힙에 저장이 되어있다. std::string s = "Hi"; // 보통은 힙 사용 안 하고 스택에 저장됨 하지만 보통 10자 아래로는 SSO 대상이라서 스택에 저장하는 형태이다. 더보기
MMORPG 서버 (기록용) 1. 패킷처리 (Read/Write)2. Tick 처리 (매 프레임마다 Actor들에게 동작을 업데이트 시킴)3. 그외 시스템 (경매장, 공성전 등 처리) 1,2가 대부분을 차지 Actor 수가 늘어나면 패킷처리와 Tick가 늘어난다. 특징할일이 너무 많다. 주어진 하나의 cpu 모든일을 처리하기에는 주어진 시간이 짧다.그래서 멀티쓰레드를 효율적으로 하기 위해서는 효율적인 구조가 필요하다. 1. 싱글쓰레드 구조 (과거 mmorpg에서 많이 사용)Network I/O 작업을 queue에 -> Queue -> WorkThread- Select 또는 Iocp 형태로 만듬 Queue에 작업을 쌓아두고 1tick에 큐에 다 비워야한다.모든 Actor에 tick을 다돌면 1프레임에 할일이 .. 더보기
C++ 가상함수 객체 할당 시 벌어지는 일Base* base = new Derived; 에서 무슨 일이 일어나는가?class Base { public: virtual void Speak() { std::cout Base* base = new Derived();base->Speak(); // 어떤 Speak가 호출될까? 결과는Derived speaking 이 출력이유는 Base의 함수가 virtual로 선언돼 있어서,런타임에 실제 객체의 타입을 확인하고 Derived의 오버라이딩된 함수를 호출하기 때문이야.핵심 요점base의 타입Base* (부모 타입 포인터)실제 객체 타입Derived호출되는 함수가상 함수(virtual)이면, 실제 객체의 멤버 함수 호출 (다형성)만약 virtual이 없으면?Base의 함수.. 더보기
C++ 반복자(Iterator) 반복자(Iterator)란?STL 컨테이너(vector, list, map 등)의 요소들을 순차적으로 접근하기 위한 객체포인터처럼 사용 가능 (*iter, ++iter 등)다양한 반복자 타입 존재 (입력 반복자, 출력 반복자, 양방향 반복자 등) #include #include int main() { std::vector vec = {1, 2, 3, 4, 5}; // 반복자 선언 std::vector::iterator it; // begin()부터 end()까지 순회 for (it = vec.begin(); it != vec.end(); ++it) { std::cout 1,2,3,4,5 출력 주요 반복자 메서드begin()컨테이너의 첫 번째 요소를 가리키는 반복자.. 더보기
C++ STL STL 이란?Standard Template Library (STL) 은 C++ 표준 라이브러리 중 템플릿 기반의 자료구조(컨테이너)와 알고리즘을 모아둔 강력한 툴셋이야. 크게 3가지로 나뉜다.컨테이너데이터를 저장 (ex. vector, map, set 등)알고리즘정렬, 탐색 등 데이터 처리 함수 모음 (ex. sort, find, count, accumulate)이터레이터컨테이너 순회 도구 (ex. begin(), end()) 자주 쓰이는 STL 컨테이너vector동적 배열. 가장 많이 쓰임list이중 연결 리스트deque앞뒤에서 빠르게 삽입/삭제 가능한 큐stackLIFO 구조. 내부적으로 deque로 구현queueFIFO 구조priority_queue힙 기반 큐 (기본은 최대 힙)set중복 없는 정.. 더보기