분류 전체보기 81

가상함수테이블과 가상함수테이블포인터 정리

가상함수테이블과 가상함수테이블포인터 출처: http://tcpschool.com/c/c_memory_structure -가상함수 테이블은 코드영역에 선언되며 테이블안에는 virtual 함수를 가리키는 주소가 들어있다.( 멤버 함수는 모두 code 영역에 저장되며 멤버 함수는 객체마다 다르게 동작하는 것이 아니기 때문에 객체마다 함수가 할당되면 비효율적일 것이다. 따라서 해당 클래스의 모든 객체는 code 영역에 있는 멤버 함수를 공유하며 사용한다.-참고로  비정적 멤버 변수는 객체의 생성과 동시에 생성된다. 객체 내의 지역 변수와  동일하므로 스택에 저장된다.  (물론 동적으로 할당되는 메모리는 heap 영역에 저장됨) 그리고  만약 클래스 내에 정적 멤버 변수를 선언했다면 이 변수는 객체 생성 시 할당..

[C++] 2025.01.02

[C++ 20] Coroutine

Coroutine을 구글에 검색했을 때 유니티의 코루틴이 제일 많이 나온다. 이는 C#의 코루틴을 유니티에서 적극 채용해 랩핑해서 사용하는 형태이다. 유니티에서 코루틴을 사용해 쿨타임 계산 등이 편리했던 기억이 있다. 이런 코루틴의 기능의 C++20 에도 도입 되었다.Coroutine을 한 마디로 요약하자면 어떤 함수를 호출했는데 어디까지 호출되었는지 저장하고 일시정지했다가 이어서 호출할 수 있는 기능이다. ①사용될 수 있는 예를 한번 들어보자.엄청 복잡하고 어려운 기능을 하는 함수가 있다고 가정해보자. 스타크래프트에서 군집화된 유닛들이 A*같은걸 이용해 길을 찾는 알고리즘 같은것.! 연산이 무거운 함수는 함수가 호출되고 다음으로 넘어가기 때문에 이런 함수는 호출 자체가 큰 부담이 될 것이다. 그리고 게..

[C++] 2024.12.11

[C++ 20] Range

C++20에 등장한 Range는 C#의  LINQ와 유사하다.우선 아래와 같이 int형 벡터를 만들어 이 중 짝수원소들을 추출해 2를 곱한 새로운 벡터를 만든다고 가정해보자.int main(){ // C# LINQ 문법이랑 비슷하다? vector v1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; vector v2; // 짝수를 추출해서 for (int n : v1) if (n % 2 == 0) v2.push_back(n); // 2를 곱해준다 for (int& n : v2) n = n * 2; return 0;}이렇게 벡터, 맵을 순회하면서 직접 연산할 수도 있지만 이는 이제 대체할 수 있는 오래된 스타일이 되어버렸다.중간에서 std::for_each(); std::fi..

[C++] 2024.12.09

[C++ 20] Module

C++ 20의 module의 도입으로 빌드 시간이 줄어들었다. C++의 빌드 과정 1. 전처리 : #include, #define등 2. 컴파일 : obj파일 생성 3. 링크 : obj파일과 심볼, 등을 묶어서 실행파일을 만듦 -> 여기서 이런 기존 빌드 과정의 문제점 1. 너무 느린 빌드 속도(반복된 substitution) 같은 라이 파일도 클래스마다 들고 있으면 각각 오브젝트에 딸려들어가서 무거워진다. (중복으로 인클루드 되는 문제) 2. 매크로 (#define)의 사용을 지양하자..? 예) #define NUM 1 이렇게 한 파일에서 정의하고 다른곳에서 #define NUM 2 하면 다른데서 두 파일 다 인클루드하고 있을 때 NUM을 뭐로 쓸지 모름 3. 심볼의 중복 정의 보통 헤더에 함수를 선언..

[C++] 2024.11.13

Modern C++ #9 전달 참조(forwarding reference)

&& 얘는 이전 시간에 오른값참조를 받기 위해서만 쓰이는 것처럼 보였다. 그런데 꼭 그렇지만은 않으므로 알아보자. 우선 지난시간의 오른값 참조와 이동연산자인 std::move의 복습이다.#include using namespace std;// 오른값 참조로 인자를 받으면 전달한 객체를 없애도 된다는 힌트를 준다.// 값 복사가 일어나야하는 상황에서도 복사대신 이동을 시켜 깊은복사 대신 이동으로// 최적화의 여지가 생긴다class Knight{public: Knight() {cout 특히 전달참조는 템플릿이나 auto같이 형식 연역이라고 해서 타입  추론(deduce, type guessing)이 일어 날 때 #include class Knight{public: int _hp = 10;public: ..

[C++] 2024.10.22

Modern C++ #8 오른값 참조(rvalue reference)와 std::move

rvalue reference오른값 참조는 실제로 많이 사용하진 않지만 C++11 에서 가장 큰 변화라고 할 수 있다.rvalue의 사용으로 이전 C++과는 엄청난 속도차이를 불러일으켰다. 왼값 (lvalue) vs. 오른값(rvalue)lvalue : 단일 식을 넘어서 계속 지속되는 개체rvalue : lvalue가 아닌 나머지(임시값, 열거형, 람다, i++) 왜 왼값과 오른값이라는 표현을 사용하는지.int a = 3;a = 4; couttest(a);이렇게 처음에 사용한 '왼쪽'에 있던 a는 계속 사용할 수 있다.반면 3 = a; 이렇게 사용할 수 없다.('식이 사용할 수 있는 왼값이여야합니다.' 라고 오류가 난다.)또 a++ = 5; 이렇게도 사용할 수 없다.이런 3이나 a++같은 임시적으로만 사..

[C++] 2024.10.22

모델 #3 모델 띄우기

지난시간까진 Assimp라이브러리를 이용해서 fbx파일을 읽고 필요한 정보만 머티리얼정보는 .xml파일로, 그외의 메쉬정보(정점, 인덱스, 이름, 계층구조)는 .mesh정보로 저장하는 작업을 AssimpTool프로젝트를 만들어 작업했다. 이제 이렇게 만든 파일을 다시 AssimpTool프로젝트에서 읽어다가 쓰는 작업을 해보자. 우선 Engine프로젝트에서 우리가 직접만든 파일을 쓰기전에는 텍스쳐를 로드하고 GeometryHelper로 만든 메쉬를 ResourceBase를 상속받은 Mesh에서 인덱스정보와 버텍스 정보를 갖고있게하고, 리소스 매니저에서 이를 가져와 오브젝트에 메쉬를 설정하도록 해서 쓰고 있었다.더보기// 18.NormalMappingDemo.cpp // Object _obj = make_s..

[DirectX11] 2024.09.19

모델 #2 Assimp라이브러리 이용해 Material, Bone, Mesh로딩하기.

우선 본격적으로 Assimp라이브러리를 사용하기에 앞서 Assimp라이브러리로 읽어들인 fbx파일을 어떤 구조를 가지고 있을지 살펴보자.Assimp에서 관리하는 최상위 객체인 Scene이 하나 우선 있다.Scene:이 안에 RootNode와 Mesh,Material 배열이 있다.RootNode : 메쉬의 계층구조를 위한 정보. 자신의 메쉬정보 Meshes[]와 직접 자식들의 포인터들 같은 정보가 들어있다. 만약 계층구조가 아니라면 RootNode가 아닌 Material, Mesh하나씩만 Scene에 들고 있으면 된다.ChildNode: RootNode의 직접자식들의 포인터가 가리키는 것 중 하나로 또 자신의 메쉬들 정보와/직접자식들의 포인터들 같은 정보가 들어있다. (*그리고 들고있는 메쉬가 꼭 메쉬가 ..

[DirectX11] 2024.09.19

모델 #1 Assimp 라이브러리

Assimp를 사용해 fbx파일 로드하기지금까지는 기본도형 큐브같은걸 코드로 만들어서 갖다 썼지만 유니티짱같은건 만드는게 말이 안된다.그래서 맥스나 마야로 만든 파일을 가져다가 쓸 것이다.그 맥스나 마야에서 추출하면 fbx타입으로 나오고 이를 로드할수 있도록 도와주는게 Assimp라이브러리다. 유니티에서 fbx파일을 열어서 보면 하나의 파일이 여러 정보를 포함하고있는데 대부분 메쉬이고 경우에 따라서 머티리얼이나 조명도 포함하고있다.드래곤 모델 같은경우는 라이트와 카메라도 들고있다.그런데 왜 이렇게 많은 정보를 포함하고 있을까? 지오메트리 정보(정점정보)만 갖고있으면 되는게 아닐까 싶지만 꼭 모델이 게임에만 쓰이라는 법은 없다. 애니메이션, 영화용으로 쓰일 수도 있기 때문에 복잡하다.그래서 fbx로 만들어..

[DirectX11] 2024.09.19

Normal Mapping

지난번 시간의 Material에 쉐이더에 넘겨줄 값들을 한데 모으는 작업을 했었다.이번 시간엔 Material에 질감을 주는 방법을 더 연구해보자.예를들어 같은 메쉬에 같은 디퓨즈맵 텍스쳐를 입히면 같은 오브젝트처럼 보일것이다. 그러나 어떤한곳에는 울툴불퉁한 느낌을 주고싶다. 그럼 어떻게 해야될까? 한 면에서도 빛을 반사시키는 각도를 다르게 보이게 하면 마치 굴절이 있는것처럼 보인다. 그럼 이를 구현하는 방법은 무엇이 있을까?방법 1) 메쉬의 정점수를 늘리는 것이다. 그럼 정말로 표면이 울퉁불퉁한 것이고 빛 계산도 정점에 따라 다르게 될 것이다. 그러나 정점수가 늘어난다는 것은 파이프라인에 들어가는 정점의 수가 늘어난단다는것으로 렌더링의 부하가 같이 커지게 된다.방법2) 그럼 음영효과를 줄 수 있으면서 ..

[DirectX11] 2024.09.18