[TIL] 23-12-12

Lev·2023년 12월 12일
0

📓TIL Archive

목록 보기
2/33

왜 게임업계에선 C++을 많이 사용하게 되었나?

💡 프로그래밍 언어 세대
기계어 (1세대) → C (2세대) → C++ (2.5세대) → Java, C# 등 (3세대)
갈수록 편의성 생상성 Up, 권한 Down (하드웨어에 직접 간섭할 수 있는 권한을 잃어버렸다)

고급언어는 결국 기계어로 번역된다.
세대가 증가할수록 결국 숨겨져 있지만 실행되는 기계어의 줄 수가 늘어난다.

따라서 번역이 끝났을 때 기계어 양이 적은 C++이 빠르다.
⇒ 게임은 1프레임도 중요하기 때문 (속도)
그렇다면 속도가 중요한데 C는 왜 안될까?
⇒ 게임은 프로젝트가 거대하기 때문 (생산성)

언어의 생산성은 인간을 생각한 직관적인 문법을 갖출 때 성립한다.
C++은 객체지향적 언어로써 게임 제작 시 생산성 측면에서 유리하다.

결국 C++은 속도와 생산성 사이에서 밸런스를 맞추고 있기 때문에 게임 제작에 적합한 편이다.
그렇다면 어떻게 C++을 시작해야 할까?
답은 Visual Studio (Windows) 이다.

Visual Studio에서 프로그래밍 프로젝트 관리하기

프로젝트와 .sln 파일

  • 프로그램이란? xxx.exe (실행파일)을 의미한다.

e.g. 만약 LOL을 만들고 싶다면…
LOLItemEditor.exe ⇒ 게임 내 아이템을 만들고 데이터화 시키는 .exe 파일 (하나의 프로젝트)
LOLChampEditor.exe ⇒ 게임 내 챔피언들을 만들고 데이터화 시키는 .exe 파일 (하나의 프로젝트)
…(그 외 여러 프로젝트들)
LOL.exe ⇒ 그렇게 만들어진 아이템과 챔피언을 조작해서 실제 게임을 하는 게임 클라이언트 (하나의 프로젝트)

  • 위 프로젝트들은 전부 하나의 .sln (솔루션파일)에 속해 있다.
  • .sln 파일은 프로젝트를 n개 모아두고 관리할 수 있도록 도와줄 뿐, .exe 파일이 되는 것은 아니다.
  • .exe 파일은 프로젝트로부터 생성된다.

F5와 시작프로젝트

F5 ⇒ 컴파일, .exe 파일 생성

  • VS 화면 왼쪽 솔루션 탐색기에서 굵은 글씨로 적혀 있는 프로젝트가 컴파일된다.
  • VS에서는 한번에 한개의 프로젝트를 실행하는 것을 원칙으로 하기 때문이다.
  • 이를 ‘시작프로젝트’라고 하는데, 다른 프로젝트가 컴파일되도록 변경 가능하다.
  • 컴파일 과정에서 C++ 문법에 오류가 없다면, .exe 파일이 생성되고 실행된다.

📢 컴파일 후에는 아래의 출력창을 꼭 확인하자!
타인에게 질문할 때에는 출력창에 뜬 에러와 함께 질문해야 한다.

📢 가급적 2시간에 한번씩 커밋하자!
이 때 에러가 없는 상태에서 커밋하는 것이 좋다.
만약 왼쪽 하단의 Git 창이 없어졌다면? '상단 메뉴 → 보기 → Git 변경 내용'

컴파일

💡 컴파일 4단계
전처리기 / 컴파일러 / 어셈블러 / 링커

전처리기

전처리문
⇒ 컴파일이 되기 이전에 처리된다.
⇒ 실질적인 코드와 관련이 없거나(1) 코드로 치환되어야 하거나(2)

  1. 실질적인 코드와 관련이 없는 경우
  • 주석 : 설명, 첨삭, 메모의 용도 (// ⇒ 한줄 주석, /* */ ⇒ 범위 주석)
  • 실제 코드에는 아무런 영향이 없기 때문에 전처리기에서 삭제한다.
  1. 코드로 치환되어야 하는 경우
  • 보통 이런 전처리문에는 ‘#’이 붙는다.
  • e.g. #include <iostream> ⇒ C++의 기반코드는 윈도우에 저장되어 있고, VS에서 그 위치에 들어 있는 iostream이라는 파일을 사용하겠다고 말하는 것
  • iostream의 내용을 전부 복사해서 해당 위치에 붙여 넣는다는 뜻이다. (코드 치환)

main 함수 (=진입점)

  • ‘프로그램은 여기서부터 시작된다’고 약속된 구간 (사실 바꿀수 있긴 하지만 바꾸지 않는 편)
  • 프로세스가 코드의 시작을 인식하는 진입점이다.
  • 만약 main 함수의 이름을 바꿔 빌드한다면…
    • main” int __cdecl invoke_main(void)” (??invoke_main00YAHXZ) 함수에서 참조되는 ~…
    • 위와 같은 내용의 출력창이 뜨며 빌드에 실패한다.
    • 사실 저 긴 이름이 고급언어인 C++에서 생략된 main 함수의 본명이다. (네임맹글링)

함수와 변수

e.g. 몬스터 1마리와 플레이어 1명이 싸운다.
게임은 모든 것을 수치로 표현
싸운다 ⇒ 행동 ⇒ 함수
공격력 ⇒ 상태 ⇒ 변수

함수

  • 프로그램을 실행시켰을 때 수행하는 행동을 C++의 문법을 지켜 작성된 곳
    • 행동의 결과 ⇒ 리턴값
    • 행동의 이름 ⇒ 함수 이름
    • 행동의 필요조건 ⇒ 인자
  • 리턴값 : 함수가 수행된 후에 어떤 결과가 리턴되는가
    • void ⇒ 아무것도 리턴하지 않고 수행할 뿐이다.
    • int ⇒ 수행한 후에 정수를 리턴한다.

변수

e.g. int Att = 10;

  • 자료형 : 상태를 표현할 형태 (숫자, 문자, 실수 등) ⇒ int
    • 크기와 타입을 포함하고 있다.
    • 크기(램에서 몇 바이트를 사용하는가) ⇒ 4byte
    • 타입 ⇒ 정수
  • 변수명 : 변수가 무엇을 의미하는지 표현하기 위해 붙인 이름 ⇒ Att
    • 결과적으로 이름보다는 램에서의 메모리 위치를 의미하게 된다. (바이트 번지)
  • 대입연산자 : 왼쪽의 메모리를 오른쪽으로 덮어씌우겠다는 뜻 ⇒ =
  • 초기값 : 변수가 생성될 때 정의되는 값 (리터럴) ⇒ 10
  • 마침문장부호 ; : 변수의 선언이 끝났음을 표시

코드의 실행 과정

e.g. 아래와 같은 코드를 실행시키는 경우

#include <iostream>
// 치환되는 전처리문

int main() // 진입점
{	// 코드 시작
	std::cout << "Hello, World!\n";
	return 0;
	// 코드 끝
}

프로그램(.exe) 실행 → 하드에서 램에 복사되어 올라감 → 프로세스가 됨 → 코드의 시작부터 끝까지 실행 → 램에서 프로세스의 메모리 삭제

메모리

  • 프로그램을 실행시키는 데에 드는 비용

프로그램 ⇒ 실행되면 어떠한 일을 할 것이다 e.g. 67KB
프로세스 ⇒ 실행되어 어떠한 일을 했다 e.g. 512KB

  • 프로그램은 예정을 적어둔 것일 뿐이고, 실제 실행된 결과가 프로세스이기 때문에 램에 올라간 상태에 메모리를 더 크게 소모한다.
#include <iostream>

int main()
{		
	while (true) {
	
	}
} // 실행시켰을 때 종료되지 않는 프로세스
// 이를 통해 램에 올라간 프로세스가 소모하는 메모리 확인 가능

프로세스

💡 프로세스의 구조
코드영역 / 데이터영역 / 힙영역 / 스택영역

e.g. 아래와 같은 코드를 실행시키는 경우

int main()
{
	int Att = 10;
	return 0;
}

하드에 있는 .exe가 실행됨
→ 프로그램의 코드가 램에 올라간 프로세스의 코드영역으로 복사됨
→ 스택영역에 Att라는 공간이 생김
→ Att에 넣어줄 리터럴 값을 코드영역에서 가져옴
→ 대입연산자의 연산 코드를 코드영역에서 가져옴
→ CPU에서 Att라는 메모리에 10의 메모리를 보내고 복사 연산자를 보내 Att에 10을 집어넣음


📢 기억해두면 좋은 VS단축키 & 정보

  • Shift + Up or Down ⇒ 드래그와 같은 효과
  • 범위 선택 + Alt + Up or Down ⇒ 범위 통째로 윗줄 또는 아랫줄로 이동
  • Ctrl + K+ C ⇒ 주석
  • 파일명 위에 커서 + Ctrl + Shift + G ⇒ 파일 열기?
    (iostream과 같은 파일 내용 확인 가능)
  • 파일명 우클릭 → 상위 폴더 ⇒ 파일의 위치 확인 가능

📚 보충공부 하고 싶을 땐 여기서!
0. CPlusPlus.com ⇒ C++ 제작자들이 만든 포럼
1. msdn ⇒ 마이크로소프트 개발자 네트워크
2. 위키백과 or C++ 파워유저 블로그
3. 블로그 ⇒ 올린 날짜 꼭 확인하기
4. ChatGPT ⇒ 초심자일수록 진위여부를 알아내기 어렵다(…)

profile
⋆꙳⊹⋰ 𓇼⋆ 𝑻𝑰𝑳 𝑨𝑹𝑪𝑯𝑰𝑽𝑬 ⸝·⸝⋆꙳⊹⋰

0개의 댓글