winAPI -> 윈도우 기반에서 게임을 만들기 위한 기능을 배우고 게임을 만듦.
윈도우에서 제공해주는 함수는 전부 다 CPU를 활용해서 연산한다.
컴퓨터에는 cpu, gpu 가 있다.
cpu -> ex) 인텔
gpu (6000 ~ 10000개의 코어수)-> ex) 엔비디아
코어수로 따지면 gpu <<<< gpu
코어 1개가 인스트럭션(최종 기계어를 사용하는 기술?)
코어 수가 많으면 병렬적으로
cpu는 전자회로를 이용해서 고정밀 장치 따라서 코어수가 적다.
gpu는 코어 하나하나의 성능은 약하고, 물리적으로 차지하는 공간도 작다
cpu는 단일코어 성능을 비약적으로 높이는데 집중
gpu는 대량 코어를 활용해서
Directx와 비슷한 것 -> OpenGL(모바일 환경), Vulkan(OpenGL의 차세대 버전, 컴퓨터에서도 사용하긴 함)
pc 또는 휴대폰, 연산장치에서 gpu쪽으로 컨트롤 해주는 라이브러리이다.
gpu를 통제할 수 있는 언어이다.
Directx는 윈도우 운영체제에서 제공해주는 API이다.
랜더링 작업을 gpu로 하는 것과 cpu로 하는 것의 차이?
우선, 설계 방향 자체가 다르다.
gpu를 활용한다는 것은?
코어 수가 많다 = 일꾼이 많다 = 분산처리가 가능하다.
복잡한 일을 하나 처리할 때 cpu가 더 유리하다.
순차적으로 일을 처리해서 마무리 지어야하면 단일코어 성능이 좋아야한다.
일이 병령적으로 수 만개의 작업량이 있으면, cpu 보다 gpu를 이용하는 것이 빠른수행이 가능하다.(유리하다)
directx 는 작업량이 많아 gpu를 이용하는 것이다.
연산량이 어마무시하게 많은 것에 병렬로 처리하는 gpu를 사용한다 ex) AI, 비트코인 채굴
GPGPU (General Perpose GPU) -> 연산 목적
Directx -> 그래픽스처리 목적 화면에 랜더링하는 것이 목적이다.
directx 안에서 compute shader 라는 기능이 GPGPU로 활용할 수 있는 기능이다.
Cuda -> 엔비디아에서 제공해주는 언어로 c++과 거의 유사한 gpu를 제어할 수 있는 문법.
https://youtu.be/ZdITviTD3VM // GPU, CPU 어떻게 작동할까 ? 보기
3D 랜더링,
3차원에는 정점(Vertex)이 존재하는데, 정점이 최소 3개가 모이면 면을 구성할 수 있다.
정점이 구성하는 면 내부에 들어오는 수 많은 픽셀들이 존재한다.
그 픽셀 하나 하나에 GPU 코어가 하나씩 붙는다.
--------------------------------2교시-
라이브러리 -> 정적라이브러리, 동적라이브러리
라이브러리는 실행 프로그램이 아니라, 다른 프로그램에 붙어서 함수를 제공해주는 묶음이다.
new 와 delete를 사용할 수 있는 이유도 CRT 라는 라이브러리를 이미 가져다 썼기 때문이다.
1. 정적라이브러리(static) -> .lib 개인
선언된 위치에 따라서 거기에서만 사용될 수 있다.
정적라이브러리를 쓴다고 하면 거기에 붙어서 거기에서만 사용할 수 있다.
최종 실행파일에 정적라이브러리도 포함되어 들어온다.
2. 동적라이브러리 -> .lib, .dll 공용
누구나 다 쓸 수 있는 공용데이터가 된다.
우리가 사용하려는 클라이언트 쪽에서
최종 실행파일에 동적라이브러리는 안 들어와있고, dll 에 들어가 있다.
실행파일 안에 기능들이 없고 완전 별개로 들어가있다.
동적라이브러리는 윈도우즈에서 관리를 한다.
누구나 자주 가져다 쓸 기능인데, 정적으로 하게 되면 모든 프로그램에 합쳐져서 메모리 낭비가 된다.
그래서 동적라이브러리는 dll로 존재해서 필요한 경우에 따라 dll을 불러와서 사용하면 된다.
dll의 장점
설계에 따라서 비슷한 기능인데 버전을 다르게 관리할 수 있다. (북미섭, 아시아섭 등등)
프로그램이 꺼지지 않고도 dll은 실행하는 도중에 끊을 수 있다.
*엔진이 먼저 빌드되어야 lib가 나와서 클라이언트에 붙어서 실행파일을 실행한다*
빌드 종속성
클라이언트가 엔진에 종속된다.
-> 엔진이 먼저 완성되어야 클라이언트가 된다. 엔진에 의존을 하고 있기 때문에
f5를 누르면 엔진이 먼저 빌드되고 그다음에 클라이언트가 빌드가 될 것이다.
우클릭 눌러서 시작프로젝트로 설정 누르면 굵음체가 된다.
시작프로젝트로 설정 -> 실행시키는 주체 프로젝트가 누군지 정하는 것.
lib 프로그램을 시작할 수 없다 -> lib는 실행프로그램이 아니기 때문에
시작프로그램은 항상 클라이언트로 설정되어야 한다.