분류 전체보기 55

[DirectX11] FBX SDK적용, 컴파일 옵션 /Md /Mt

1. 개요우리는 지금까지의 프로젝트에서 OBJ Parser를 만들고 그것을 Rendering Pipeline에 연결해서 OBJ를 읽고 Rendering하는 시스템을 구축했습니다. https://yeoul0714.tistory.com/22 [DX11] Obj 파일 Parsing후 Pipe line Binding1. DX에서 오브젝트를 Rendering하는 것은 매우 번거롭다.우리는 DX에서 물체를 렌더링해 주기 위해서는 정점 정보를 하나하나 직접 입력을 해주어야 했습니다.이것은 매우 번거로운 작업이고 단yeoul0714.tistory.com 그러나 OBJ 파일에는 명확한 한계가 존재합니다. 1. 애니메이션 데이터의 부재 OBJ 파일은 정적 메시만 저장할 수 있고, 본(bone) 구조나 스킨 가중치와 같은 ..

DirectX11 2025.05.07

[Effective C++] 항목 17: new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자

1. 개요이번 장의 내용은 컴파일러마다 실행순서가 달라져서 발생하는 문제를 막는 방법에 대해 소개하는 항목입니다. 예를 들어보도록 하겠습니다.int Priority();void ProcessWidget(std::tr1::shared_ptr pw, int priority);이러한 함수 2개가 있다고 가정해 보겠습니다. 그리고 이렇게 만들어진 함수를 호출합니다. processWidget(new Widget, priority());일단 이것은 틀렸습니다. 왜냐하면 shared_ptr로 받고있기 때문에 자동으로 형변환이 안됩니다.(shared_ptr의 생성자는 explicit으로 선언되어 있습니다.) 그래서 아래와 같이 써야합니다.processWidget(std::tr1::shared_ptr(new Widge..

[Effective C++] 항목 16: new 및 delete를 사용할 때는 형태를 반드시 맞추자

1. 개요std::string *stringArray = new std::string[100];delete stringArray; 이 코드는 얼핏 보기에는 아무런 문제가 없어 보입니다. 메모리를 동적할당받고 잘 삭제해주고 있으니까요 그러나 이것은 완벽히 잘못된 코드입니다. 왜냐하면 동적할당으로 string객체를 100개만큼 생성해주고 있기 때문입니다. 위의 코드 처럼 한다면 1개의 객체 받게 해제시키지 못합니다. 2. new, delete의 동작방식new를 실행하면 2가지 동작이 수행됩니다. 1. 메모리가 할당됩니다.2. 할당된 메모리에 대해 한 개 이상의 생성자가 호출됩니다. ([]도 포함해서 그렇습니다.) delete도 비슷합니다. 1. 할당된 메모리에 대해 한개 이상의 소멸자가 호출됩니다.2. 메모..

[백준] 10709번 기상캐스터

#include "bits/stdc++.h"using namespace std;int main() { int y, x; cin >> y >> x; string line; vector cloud; vector> result(y, vector(x, -1)); for (int a = 0; a > line; cloud.push_back(line); } for (int a = 0; a 중요 포인트 1. 구름 발견시 오른쪽으로 계속 가면서 1씩 추가해주기 2. 배열 범위 벗어나는지 항상 체크해주고 접근하기 3. 오른쪽으로 가다가 구름발견시 (c발견시) 즉시 break하기 안그러면 값이 계속 쌓여서 구름 기준으로 1,2,3카운팅이 되는 것이 아니라 해당 행에서 가장 처음 발견된 c를 기준으로 counting됨

코딩테스트 2025.04.30

[Effective C++] 항목 15: 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자

1. 개요자원 관리 클래스는 메모리 누수를 막는 아주 훌륭한 방법입니다. 그러나 우리는 종종 자원 관리 객체의 보호벽을 넘어서 실제 자원을 직접 만져야 할 일이 종종 생길것입니다. std::tr1::shared_ptr yptr(createYeoul());int YeoulAge(const Yeoul* ptr);int age = YeoulAge(yptr); // 에러 만약 코드를 이렇게 작성한다면 오류가 발생합니다. 왜냐하면 shared_ptr로 선언된 yptr과 Yeoul의 포인터는 형식이 맞지 않기 때문이지요 우리는 shared_ptr을 Yeoul*로 변환활 방법을 필요로 합니다. 2. 1번의 문제 해결법2-1. 명시적 형변환(explicit conversion)tr1::shared_ptr은 명시적으로 ..

[Effective C++] 항목 14: 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자

1. 개요이번 항목은 자원관리 클래스를 만들때 복사 동작에 대해서 어떻게 처리해야할지를 다루는 문서입니다. 예를 하나 들어보도록 하겠습니다.void lock(Mutex* pm); // pm이 가리키는 mutex에 잠금을 겁니다.void unlock(Mutex* pm); //pm이 가리키는 mutex에 잠금을 풉니다. 이러한 mutex잠금을 관리하는 클래스를 만들려고 합니다. 이러한 클래스 역시 RAII 법칙을 따르게 됩니다. 생성시 자원을 획득하고 소멸 시에 자원을 해제하는 개념입니다. 아래는 이러한 클래스의 예제입니다.class Lock {public: explicit Lock(Mutex *pm) : mutexPtr(pm) { lock(mutexPtr); /..

[DX11] Lua 스크립트 연동 + SOL2

1.개요이번엔 컴퓨터 그래픽스에 관한 내용은 아니지만 엔진을 만들어가는 과정중에 하나이기에 DX11이란 카테고리를 부여했습니다. Lua라는 언어를 개발하던 게임엔진에 연동하는 작업을 하려고 합니다. 그렇다면 이미 C++로 잘 개발되던 엔진에 어째서 Lua가 필요한 것일까요? 오늘 글에서는 Lua스크립트의 필요성과 Lua를 쓰는 이유 그리고 연동과정과 예시를 보여드릴 생각입니다. 2. Lua 스크립트의 필요성Lua스크립트를 굳이 연동하는 이유는 분명하게 존재합니다. 그 이유를 크게 4개로 분리했습니다. 게임 로직과 엔진 코드 분리기본적으로 엔진이 돌아가는 로직은 지금까지 DX11과 C++을 이용해서 개발되어 왔습니다.그러나 우리가 만드는 것은 결국 게임을 개발하는 에디터 입니다.그러므로 에디터를 사용하는 ..

DirectX11 2025.04.27

[C++] Smart Pointer

https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 | Rookiss - 인프런Rookiss | , MMORPG 개발에 필요한 모든 기술, C++ & Unreal로 Step By Step! 🕹️ 기초부터 끝판왕까지, MMORPG 개발하기 🎮 [사진] 포트폴리오 완성을 목표로 하는 게임 프로그래머 취업 준비생, C++과www.inflearn.com 참고 강의1. 개요오늘은 C++의 스마트 포인터에 대해 알아보도록 합시다. 그전에 스마트 포인터는 왜 써야하는 것일까요? 그것은 바로 일반 포인터의 문제점들 때문입..

C++ 2025.04.26