성댕쓰 똑똑한 생활

고정 헤더 영역

글 제목

메뉴 레이어

성댕쓰 똑똑한 생활

메뉴 리스트

  • 홈
  • 태그
  • 방명록
  • 분류 전체보기 (172)
    • 똑똑한 재테크 (1)
      • 올웨더 자산배분 (1)
    • 똑똑한 개발 (170)
      • Hazel 게임엔진개발 (0)
      • Algorithm 과 Data Structure (51)
      • C++ (18)
      • C# (8)
      • 개발로그 (0)
      • Image Processing (2)
      • C++ 게임개발 (60)
      • 컴퓨터 그래픽스 (10)
      • 수학 (13)
      • 영어 (8)
홈태그방명록
  • 똑똑한 재테크 1
    • 올웨더 자산배분 1
  • 똑똑한 개발 170
    • Hazel 게임엔진개발 0
    • Algorithm 과 Data Structure 51
    • C++ 18
    • C# 8
    • 개발로그 0
    • Image Processing 2
    • C++ 게임개발 60
    • 컴퓨터 그래픽스 10
    • 수학 13
    • 영어 8

검색 레이어

성댕쓰 똑똑한 생활

검색 영역

컨텐츠 검색

분류 전체보기

  • Memory pool #2

    2021.09.23 by 성댕쓰

  • Memory pool

    2021.09.15 by 성댕쓰

  • STL allocator

    2021.09.12 by 성댕쓰

  • Stomp allocator

    2021.09.11 by 성댕쓰

  • Allocator

    2021.09.11 by 성댕쓰

  • 스마트 포인터

    2021.09.10 by 성댕쓰

  • Reference Counting

    2021.09.08 by 성댕쓰

  • Deadlock 탐지

    2021.09.06 by 성댕쓰

  • Read-Writer lock

    2021.09.03 by 성댕쓰

  • ThreadManager

    2021.09.01 by 성댕쓰

Memory pool #2

기존 memory pool #1의 아쉬운 점 1. memory pool에서 메모리 가져오기, 반환 때 lock을 사용하기에 여러 쓰레드에서 사용할 경우 경합이 일어난다. 2. memory pool 사용하기 위해 memory header를 저장하는 별도의 queue가 필요하다. lock free stack을 이용하여 위 문제를 해결해보자. 이전에 구현할 때 Node를 사용했는데 template struct Node { T data; Node* node; }; 위 방식의 문제는 T data를 만들기 위해 Node라는 공간을 또 만드는 것이다. struct SListEntry { SListEntry* next; }; class Data { public: SListEntry _entry; int32 _hp; i..

똑똑한 개발/C++ 게임개발 2021. 9. 23. 23:31

Memory pool

Memory pool을 사용하는 이유는 다음과 같다. 1. 이전에 사용한 memory를 사용하기 때문에, 커널단에 메모리 할당 코스트를 줄일 수 있다. 2. 작게 할당된 메모리가 많으면 나중에 메모리가 반환 되더라도 해당 메모리를 사용하지 못하는 경우가 생길 수 있는데 이런 경우를 줄일 수 있다. 방식은 할당 메모리를 queue에 넣고 요청하면 queue에서 빼서 주는 방식, 반환할 때는 다시 queue에 넣는다. 할당 메모리 사이즈 정보를 갖고 있는 메모리 헤더를 만들어 이를 queue에 관리한다. MemoryPool.h #pragma once // [32] /*--------------------- MemoryHeader ---------------------*/ struct MemoryHeader ..

똑똑한 개발/C++ 게임개발 2021. 9. 15. 22:27

STL allocator

Custom해서 만든 allocator를 stl에서도 쓸 수 있다. 약간의 코드 작업이 필요하다. 먼저 stl에서 기대하는 API를 구현한 allocator가 필요하다. Allocator.h /*--------------------- STL Allocator ---------------------*/ template class StlAllocator { public: using value_type = T; StlAllocator() {} template StlAllocator(const StlAllocator&) {} T* allocate(size_t count) { const int32 size = static_cast(count * sizeof(T)); return static_cast(x_alloc..

똑똑한 개발/C++ 게임개발 2021. 9. 12. 20:56

Stomp allocator

c++ 기본 new와 delete, malloc, free를 쓰면 해제된 메모리에 접근했는데도 crash가 발생하지 않는 문제가 있다. 엉뚱한 메모리를 오염시키고 결국 오류가 나는 곳은 문제의 원인과 멀리 떨어져있는 경우가 많아서 디버그 하기도 쉽지않다. // Case 1 Knight* k1 = new Knight(); k1->_hp = 200; k1->_mp = 50; delete k1; k1->_hp = 100; // User-After-Free // Case 2 vector v{ 1,2,3,4,5 }; for (int32 i = 0; i < 5; i++) { int32 value = v[i]; // TODO if (value == 3) { v.clear(); // 이후부터 유효하지 않은데, 또 접근..

똑똑한 개발/C++ 게임개발 2021. 9. 11. 23:39

Allocator

메모리를 할당하거나 반납할 때, 기본 new, delete말고 custom하여 쓸 수 있다. 그러면 memory 할당, 반납 전 카운팅을 하여 메모리 누수 포인트를 알아낸다거나 하는 용도외 다양한 기능을 추가할 수 있다. 3가지 방법을 알아볼건데, 첫 번째 방법은 Global한 new, delete operator overloading 하는 방법이다. // new operator overloading (Global) void* operator new(size_t size) { cout

똑똑한 개발/C++ 게임개발 2021. 9. 11. 15:24

스마트 포인터

저번 시간에 만든 Custom smartpointer는 다음과 같은 단점이 있다. 1) 이미 만들어진 클래스 대상으로 사용불가. 2) 순환(Cycle) 문제. 2) 번 문제 예를 살펴보자. using KnightRef = TSharedPtr; class Knight : public RefCountable { public: Knight() { cout SetTarget(k1); k1 = nullptr; k2 = nullptr; } k1과 k2가 서로를 SharedPtr로 갖고 있다. k1을 따라가보면 생성될 때 RefCount가 증가하고 k2멤버변수에 복사될 때 RefCount가 증가한다. k1에 nullptr을 넣을 때 RefCount감소하는데 k2 멤버변수로 있던 k1은 k2가 소멸할 때 Release..

똑똑한 개발/C++ 게임개발 2021. 9. 10. 23:54

Reference Counting

포인터를 이리 저리 넘겨주는 코드를 작성한 뒤 해당 포인터가 필요없다고 생각해서 지우면 문제가 되는 경우가 많다. class Wraight { public: int _hp = 150; int _posX = 0; int _posY = 0; }; class Missile { public: void SetTarget(Wraight* target) { _target = target; } void Update() { int posX = _target->_posX; int posY = _target->_posY; // TODO 쫓아가기 } Wraight* _target = nullptr; }; int main() { Wraight* wraight = new Wraight(); Missile* missile = ne..

똑똑한 개발/C++ 게임개발 2021. 9. 8. 23:24

Deadlock 탐지

그래프 자료구조를 이용해 Deadlock 탐지 기능을 만들어 보자. 그래프는 vertex와 edge로 이루어져있다. 방향 그래프는 edge에 방향 정보도 있는 그래프이다. 2차원 벡터(행렬)을 이용하여 그래프 표현가능하다. 그래프 사이클 판별하여 dead lock 일어나는지 확인가능하다. 각 vertex를 어떠한 lock을 잡은 상태라고 두고 edge를 따라 연결된 vertex는 lock잡은 상태에서 다른 lock을 잡은 것이라고 생각하자. 그렇다면 그래프에서 사이클이 생기면 dead lock이 일어날 수 있는 상황이라고 판단가능하다. 다음의 용어에 대한 정의를 알아보자 1. 순방향 간선 - edge를 따라간 vertex가 교차간선, 역방향 간선이 아님. 2. 교차 간선 - edge를 따라간 vertex..

똑똑한 개발/C++ 게임개발 2021. 9. 6. 21:21

Read-Writer lock

표준 mutex를 쓰지 않고 구현하여 쓰는 이유가 있다. 첫 번째, 표준 mutex는 재귀적으로 lock을 잡을 수 없다. 하지만 표준에서 제공하는 recursive_mutex를 사용하면 이 문제는 해결할 수 있다. 두 번째, 수정이 거의 일어나지 않는 공유 메모리에 mutex를 쓰면 하나의 쓰레드만 메모리를 읽을 수 있기 때문에 자원낭비가 심하다. 이번에 구현할 Read-Writer lock은 재귀적으로 lock잡을 수 있고, read일 경우 상호 배타적이지 않게 공유 메모리접근이 가능하다. Spinlock으로 구현한다. 32bit 메모리를 활용하여 Write와 Read를 구분한다. 상위 16bit는 Write관련 정보 그 다음 16bit는 Read관련 정보를 저장한다. [W][W][W][W][W][W..

똑똑한 개발/C++ 게임개발 2021. 9. 3. 21:01

ThreadManager

ThreadManager가 하는 역할은 server에서 사용하는 쓰레드 자체, TLS 를 관리하기 위함이다. ThreadManager 생성하기 앞서 여러 곳에 유용하게 쓰일 수 있는 유틸 코드를 정의해보자. 먼저 app을 crash, assert하는 define이다. CoreMacro.h /*---------------------- CRASH ----------------------*/ #define CRASH(cause)\ {\ uint32* crash = nullptr;\ __analysis_assume(crash != nullptr);\ *crash = 0x1DEADEBB;\ } #define ASSERT_CRASH(expr)\ {\ if (!(expr))\ {\ CRASH("ASSERT_CRASH..

똑똑한 개발/C++ 게임개발 2021. 9. 1. 21:19

추가 정보

인기글

최신글

페이징

이전
1 ··· 8 9 10 11 12 13 14 ··· 18
다음
TISTORY
성댕쓰 똑똑한 생활 © Magazine Lab
페이스북 트위터 인스타그램 유투브 메일

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.