공부 121

멀티바이트(Multibyte), 유니코드(Unicode), ANSI 그리고 ASCII

먼저 "유니코드와 멀티바이트를 비교하라" 는 질문을 받았고 간단하게 대답을 하려면 멀티 바이트는 문자를 다양한 바이트로 표현하는 인코딩 방식 유니코드는 세계 모든 문자를 2바이트 길이의 바이너리(=코드)와 매핑해놓은 코드표(=문자열 셋)이다(예를 들어 '가' 라는 문자를 U+AC00 이런식의 코드에 매핑) 이렇게 대답하면 좋을 것 같다. 앞서 유니코드와 멀티바이트를 비교 하려고 하는데 엄밀히 이야기하면 비교 대상이 잘못됐다. 명확한 비교는 WBCS과 MBCS(흔히 말하는 멀티바이트)를 비교해야한다(유니코드가 WBCS의 형태라서 이렇게 통상적으로 비교하는 듯 하다). 먼저 문자열 셋(Chracter Set)과 인코딩에 대한 이해가 필요하다. 문자와 바이너리를 매핑시켜주는 표를 문자열 셋(Character ..

공부/그 외 2022.09.23

3D OBB 충돌 코드 및 설명

분리축 이론 : 다면체 A, B에 대해서 어떤 축이 존재해서 그 축으로의 다면체들의 투영된 구간이 "하나라도" 서로 겹치지 않는다면 A, B는 서로 분리되어 있다는 이론 bool CCollision::CollisionBox3DToBox3D(CollisionResult& SrcResult, CollisionResult& DestResult, const Box3DInfo& boundingBox, const Box3DInfo& targetBox) { double c[3][3]; double absC[3][3]; double d[3]; double r0, r1, r; int i; const double cutoff = 0.999999; bool existsParallelPair = false; Vector3 d..

C++17 string_view

c++17에 string_view라는 기능이 추가되었다. 이 기능을 사용하면 좋은 점을 예시로 살펴보자 // 원래 사용하던 방식 std::string FiveCharacterOnlyString(const std::string& str) { if (str.size() < 5) return str; return str.substr(0, 5); } // c++ 17 string_view // string_view를 사용하면 string 객체의 복사가 발생하지 않습니다. std::string_view FiveCharacterOnlyStringView(const std::string_view str) { if (str.size() < 5) return str; return str.substr(0, 5); } in..

공부/C || C++ 2022.09.19

C++ vector::push_back vs vector::emplace_back

지난 게시글인 Rvalue reference관해서 공부하다가 우연히 보게 된 건데 C++에 container들을 자주 써왔다고 생각했는데 push_back과 emplace_back에 performance 차이가 있을 수 있다는 이야기는 처음 들어봤다. 사실 emplace_back은 거의 안써보고 매번 push_back만 쓰기도 했다. 겉보기에 두개의 메소드 간에 차이가 없어보이는데 왜 다른 이름으로 두개가 존재하는건지 진작에 의문점을 가져봤어야 했는데... push_back과 emplace_back의 가장 큰 차이점은 "emplace_back은 내부적으로 가변 인자 템플릿 형태의 생성자가 구현되어 있다는 점이다" 그래서 결과적으로 두 함수에 생기는 차이는 push_back은 내부적으로 생성자가 없어서 외..

공부/C || C++ 2022.09.18

그림자 매핑(Shadow Mapping)

여기서 소개할 그림자 매핑은 최근 사용되는 그림자 매핑 기법중에 가장 기본이되는 기법이다. 사실 이 기법을 기반으로 발전된 여러가지 고급 기법들이 다음과 같이 이미 나와있다. 캐스케이드 그림자 맵 : 그림자 매핑의 해상도 문제를 해결하기 위하여 영역별로 여러개의 그림자맵을 만드는 기법 퍼센티지 클로저 필터링 : 그림자의 외곽선을 부드럽게 필터링 해주는 기법 배리언스 그림자맵 : 하드웨어 텍스처 필터링이 가능하도록 깊이 값을 저장하는 방법 그림자가 생기는 원리 아래 그림 기준으로 1번 빛에서는 D앞에 가리는 물체가 없으므로 그림자가 생기지 않는다. 2번 빛은 B앞에 A라는 물체가 가리고 있으므로 2번 광선이 B의 표면에 만나는 지점에 그림자가 생길 것이다. C도 마찬가지로 A, B 물체에 가리니까 그림자가..

STL Container (시퀀스 컨테이너, 연관 컨테이너, 컨테이너 어댑터)

C++ 표준 라이브러리에는 많은 종류의 라이브러리가 존재한다. 예를 들어 입출력 라이브러리(iostream 등), 시간 관련 라이브러리(chrono) 등이 있다. 특히 C++ 템플릿 라이브러리(Standard Template Library)는 다음 세 개의 라이브러리들을 의미한다 임의 타입의 객체를 보관할 수 있는 컨테이너 라이브러리(container) 컨테이너에 보관된 원소에 접근할 수 있는 반복자(iterator) 반복자들을 가지고 일련의 작업을 수행하는 알고리즘 위에서 볼 수 있듯이, 컨테이너에 임의 타입의 객체를 보관할 수 있다고 한다. 임의 타입의 객체를 보관할 수 있는 이유는 템플릿으로 구현되어 있기 때문이다. 따라서 int, string 같은 기본적인 자료형이 아닌, 사용자가 직접 만든 클래..

공부/C || C++ 2022.09.17

자료구조 별 장단점(vector, list, queue, stack, map, hash map, tree)

vector list 장점 1. 일반 배열처럼 연속적인 메모리에 저장돼서 Index로 빠르게 접근 가능 2. 동적으로 메모리가 확장되는 기능 1. 어느 위치에서든 삽입/삭제가 빠름 단점 1. 중간 삽입/삭제가 느림 2. 확장이 필요할 때에 메모리 재할당과 복사로 비용 발생 -> Move Semantic으로 커버 가능 1. Index로 접근 불가능 stack queue 장점 1. LIFO 로 원소가 필요할 때 사용 가능 2. top에 위치한 원소에 빠르게 접근 가능 1. FIFO로 원소가 필요할 때 사용 가능 2. front에 위치한 원소에 빠르게 접근 가능 단점 1. 중간에 위치한 원소에 대해 접근 불가능 1. 중간에 위치한 원소에 대해 접근 불가능 hash_map tree 장점 1. Key값을 이용해서..

Lighting

Lighting - 빛과 Object간의 상호 작용 Direction Light Source - 아주 멀리서 오는 Sun(해)라고 생각하면 됨. - 이제부터 설명하는 모든 Light의 종류는 Direction Light Source라고 가정하고 설명할 것임 - 아주 멀리서 오는 빛이기 때문에 오브젝트의 모든 점에 들어오는 빛은 같은 방향과 입사각으로 들어온다고 가정 Phong Light Model - 대표적 Lighting Model - Phong Model은 4가지 Term으로 이루어짐 1. Diffuse(난반사, = Lambert) - 온갖 방향으로 동일한 양의 빛을 반사. - 온갖 방향으로 동일한 양으로 반사된다는 것은 우리가 카메라를 어디 두던간에 같은 색으로 보인다는 의미. - 우리가 "어떤 물..

객체 지향 프로그래밍(OOP)

객체 지향 프로그래밍이란? 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호 작용을 통해 프로그램을 만드는 것 객체란? 클래스라는 틀(template)에서 생겨난 실체(Instance) 객체 지향 프로그래밍을 사용해야 하는 이유는? 실세계에 대한 쉬운 모델링 응용 소프트웨어를 하나의 절차로 모델링 하기는 어렵다. 대부분의 응용 소프트웨어 특성상 절차보다는 관련된 여려 객체들간의 상호작용으로 모델링하는 것이 더 쉽고 적합하다 생산성 상속과 다형성으로 이미 만들어진 클래스를 기반으로 재정의해서 사용할 수 있고, 캡슐화로 만든 클래스를 실체화 시킨 객체를 계속해서 만들어낼 수 있다 보안성 캡슐화로 구현된 클래스에서 특정 부분을 은닉할 수 있다 SOLID (객체 지향 설계 원칙) 1. 단일 책임 원칙..

공부/그 외 2022.09.11

Instruction Pipeline, Hazard 그리고 Branch Prediction

Instruction Pipeline - 명령어 파이프라인(Instruction Pipeline)은 순차적으로 명령어를 읽어 실행하는 프로세서에 적용되는 기술로, 한번에 하나의 명령어만 실행하는 것이 아닌, 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 식으로 동시에 여러개의 명령어를 실행하도록 해서 CPU가 프로그램 처리하는 성능을 높혀줄 수 있도록 하드웨어적으로 구현되어 있는 기능 명령어 처리에는 기본적으로 5단계로 이루어져 있다(단, 모든 명령어들이 위 과정을 모두 거치는 것은 아니다) 1. IF: 메모리로부터 Instruction Fetch (메모리로부터 명령어 불러옴) 2. ID: Instruction Decode & register read (명령어 해석, 레지스터 read) 3..