프로젝트공부아이디어
    • 2월
    • 1월
  • 27

    26. 2. 27.

  • 26

    26. 2. 26.

  • 25

    26. 2. 25.

  • 24

    26. 2. 24.

  • 23

    26. 2. 23.

  • 22

    26. 2. 22.

  • 13

    26. 2. 13.

  • 10

    26. 2. 10.

  • 9

    26. 2. 9.

  • 6

    26. 2. 6.

  • 2

    26. 2. 2.

로딩 중...

26

2026. 2. 26.

안정적인 정렬 알고리즘?

정렬을 하고 난 뒤에도 같은 key 값을 가진 원소들의 순서가 유지되는가?

  • 버블 정렬
  • 삽입 정렬
  • 병합 정렬

불안정 정렬

  • 선택 정렬
  • 퀵 정렬
  • 힙 정렬

배열 복습

동적 배열 생성?

C++
class Array{public:	Array(size_t size)	{		// 오류 발생.		data[size]; // 그냥 size 인덱스 위치를 참조하는 표현식일 뿐, 배열을 생성하지 않음		// 배열을 동적으로 만들고 싶다면 new data[size]가 돼야 함.	}private:	int data[]; // 클래스 멤버 배열은 반드시 크기가 컴파일 타임에 결정돼야 함};
  • 가장 중요한 포인트: 클래스 객체 레이아웃은 컴파일타임에 확정돼야 함
  • Array 클래스로 객체를 생성하지 않아도 불완전 타입(ill-formed)-타입 시스템 위반으로 컴파일 에러가 발생(sizeof(array)계산 불가, 객체 메모리 레이아웃 결정 불가)

해결책 1. 템플릿화

C++
#include <iostream>template<size_t size>class Array{public:	size_t Size() const	{		return size;	}private:	int data[size];};int main(){	Array<10> array;	std::cin.get();}
  • 정적 배열 유지하면서 확장성을 유지하는 방법

해결책 2. 생성자로 통제

C++
class Array{public:    Array(size_t size)        : size(size)    {        data = new int[size];    }    ~Array()    {        delete[] data;    }private:    int* data;    size_t size;};
  • data를 동적 할당한다는 점에서 접근 방식이 다름

해결책 3. std::vector 사용

C++
#include <vector>class Array{public:    Array(size_t size)        : data(size)    {    }private:    std::vector<int> data;};
  • 메모리/예외 관리 안전, 복사/이동 안전
  • std::vector는 왜 사이즈 안정해줘도 괜찮지?

std::vector 내부구조

C++
template<typename T>class vector{    T* begin_; // 힙 메모리 시작점    T* end_; // 사용중인 메모리 끝점    T* capacity_; // 할당된 메모리 끝점};
  • vector 객체 자체는 포인터 3개로 이뤄진 고정 크기의 객체
  • 실제 데이터는 new int[n]로 힙에 동적 할당됨(런타임에 크기 결정)
  • vector 객체는 포인터만 가지고, 데이터는 외부(힙)에 존재

const 객체 할당

C++
#include <iostream> template<typename T, size_t size> class Array { public: 	size_t Size() const { return size; } 		// 배열을 인덱스로 접근해 읽고, 쓰려면 레퍼런스로 반환해야 한다. 	T& operator[](size_t index) { return data[index]; } 	// const T& operater[](size_t index) const { return data[index]; } 가 필요	private: 	T data[size];}; int main() { 	Array<int, 10> array;	const auto& arrayReference = array; // 컴파일 에러 발생}

이유:

  • const auto& arrayReference의 타입은 const Array<int, 10>&으로 const 객체 참조.
  • array의 타입은 연산자 오버로딩의 결과로 int data[10]이므로 const 객체에 바인딩 불가

memset의 필요성?

C++
int main() { 	Array<int, 5> data;	memset(data.Data(), 0, data.Size() * sizeof(int)); // memset의 필요?}

초기상태: [ ? ][ ? ][ ? ][ ? ][ ? ]: 값이 정해지지 않은 쓰레기 값(intdeterminate value) memset 후: [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ]: 각 int의 모든 바이트가 0 대안:

C++
Array<int,5> data{}; // 모든 원소 0으로 초기화하는 value initialization

그래픽스 프로그래밍

Win32 API

  • 엔진개발해도 창정도만 띄울 때 쓰고 적극적으로 활용하지 않으니 알아두기만 하면 된다

창 UI

  • 기능 개발은 C++에서, UI는 C#에서 나눠 개발하는 추세
  • ImGui C++
  • QT C++
  • immediate gui vs retained gui 그래픽스 특강에선 C#까지 다루기 어려우니 직접 Win32 API를 사용하는 것

GraphicsContext

C++
ID3D11Device* device = nullptr;ID3D11DeviceContext* context = nullptr; // draw call 발생
  • Device: 리소스 생성
  • DeviceContext: 생성된 리소스를 GPU에 설정할 때 사용
  • SwapChain: 버퍼 교체
  • RenderTargetView: 화면에 그릴 프레임(이미지) 리소스
    • View: 특별한 리소스(CPU ↔ GPU)간 소통을 위해 사용하는 Direct3D 전용 개념. CPU와 GPU는 직접적으로 리소스 공유를 하지 못하기 때문에(CPU는 RAM, GPU는 VRAM을 사용, 서로의 작업공간에 접근 못함), CPU가 리소스를 생성하면 GPU도 똑같이 따라 만들 수 있게 소통 창구를 만듦
  • Forward Renderer vs. Deferred Renderer https://inhopp.github.io/unity/Unity4/

RenderTargetView

정석적으로는 이미지 속성 구조체를 설정하고 생성하지만 백버퍼용 render target view를 생성하고 swap chain에서 버퍼 불러와서 똑같은 모양으로 생성하는 방법도 있음

DirectX? Direct3D? COM?

https://blog.naver.com/ratoa/220429130028

렌더링 과정

빈 도화지 준비(Engine.BeginScene) → 그리기(Renderer) → 모니터로 전달(Engine.EndScene)

그래픽스 파이프라인

  1. 모델링 입력을 받는다
  2. 점 처리를 한다
  3. 옵션 셰이더 처리를 한다
  4. 래스터라이저: 도형 안에 픽셀을 몇 개 넣을지 계산한다
  5. 계산된 픽셀 하나하나마다 픽셀 셰이더로 칠한다
  6. Output Merger: 픽셀을 합쳐 이미지를 완성한다

WinMain

C++
#ifdef _WIN64int WINAPI WinMain(	_In_ HINSTANCE hInstance,	_In_opt_ HINSTANCE hPrevInstance,	_In_ LPSTR lpCmdLine,	_In_ int nShowCmd) {	LaunchEngineStartup(hInstance);	return 0;}#elseint main(){	LaunchEngineStartup(GetModuleHandle(nullptr));}#endif
왼쪽 화살표2527오른쪽 화살표