728x90
UE5
언리얼 에디터 개요
- 언리얼 엔진의 핵심 도구는 언리얼 에디터(Unreal Editor)이다. 에디터는 다음과 같은 주요 구성 요소로 이루어져 있다.
뷰포트(Viewport)
- 게임 세계를 실시간으로 볼 수 있는 창이다. 사용자는 이곳에서 오브젝트를 배치하고, 이동시키고, 회전하거나 크기를 조절할 수 있다.
아웃라이너(Outliner)
- 현재 레벨에 있는 모든 오브젝트의 계층 구조를 보여준다. 사용자는 오브젝트를 선택하거나 계층 구조를 변경할 수 있다.
디테일 패턴(Details Panel)
- 선택한 오브젝트의 속성(properties)을 수정할 수 있는 패널이다.
콘텐츠 브라우저(Content Browser)
- 프로젝트 내 모든 에섯(asset)을 관리할 수 있는 창이다. 여기에서 텍스처, 모델, 사운드, 블루프린트 등을 찾아서 사용할 수 있다.
블루프린트 시스템
- 언리얼 엔진은 프로그래밍 없이 로직을 작성할 수 있는 비주얼 스크립팅 시스템인 블루프린트(Blueprint)를 제공한다. 블루프린트는 노드 기반의 스크립트로, 각 노드는 특정한 기능이나 동작을 수행한다. 블루프린트는 다음과 같은 유형이 있다.
레벨 블루프린트(Level Blueprint)
- 특정 레벨에서의 로직을 정의하는 데 사용된다.
클래스 블루프린트(Class Blueprint)
- 객체 지향 프로그래밍 개념을 기반으로하여 새로운 클래스나 오브젝트 유형을 정의할 수 있다.
애니메이션 블루프린트(Animation Blueprint)
- 캐릭터 애니메이션 로직을 정의하는 데 사용된다.
C++ 프로그래밍
- 언리얼 엔진은 C++ 언어를 기본으로 사용한다. 블루프린트는 초보자에게 좋은 선택이지만, 더 복잡하고 성능이 중요한 기능을 구현하려면 C++로 코드를 작성해야 한다. C++ 코드와 블루프린트는 상호 운용될 수 있다.
레벨 디자인과 월드 구축
- 레벨 디자인은 게임 개발의 중요한 부분이며, 언리얼 엔진에서는 다음과 같은 도구를 통해 쉽게 레벨을 만들 수 있다.
브러시(Brush)
- 기본적인 형태(큐브, 구, 원기둥 등)를 만들고, 이를 사용해 지형이나 구조를 구축할 수 있다.
메시(Mesh)
- 3D 모델로, 게임 세계의 대부분의 정적 오브젝트를 정의한다. 언리얼 엔진에서는 스태틱 메쉬(Static Mesh)와 스켈레탈 메쉬(Skeletal Mesh)를 사용할 수 있다.
라이트(Light)
- 게임 세계에 빛을 추가할 수 있다. 포인트 라이트(Point Light), 스포트 라이트(Spot Light), 디렉셔널 라이트(Directional Light) 등 다양한 종류의 라이트가 제공된다.
랜드 스케이프(Landscape)
- 대규모의 지형을 만들기 위한 도구이다. 산, 언덕, 계곡 등을 만들고, 텍스처를 입힐 수 있다.
물리와 충돌
- 언리얼 엔진은 물리 엔진을 내장하고 있어, 오브젝트 간의 충돌, 중력, 물리적 상호 작용 등을 쉽게 구현할 수 있다. 물리 기능을 추가하려면 오브젝트에 콜리전(Collision) 컴포넌트를 추가하고, 물리 시뮬레이션(Physics Simulation)을 활성화하면 된다. 각 오브젝트는 여러 종류의 충돌체(콜리전)를 가질 수 있으며, 이를 통해 물리적 상호작용을 제어한다.
CS
PCB & Context Switching
Process Management
- CPU가 프로세스가 여러개일 때, CPU 스케줄링을 통해 관리하는 것을 말한다.
- 이때, CPU는 각 프로세스들이 누군지 알아야 관리가 가능하다. 프로세스들의 특징을 가지고 있는 것이 바로 Process Metadata 이다.
- Process Metadata
- Process ID
- Process State
- Process Priority
- CPU Registers
- Owner
- CPU Usage
- Memory Usage
- 이 메타데이터는 프로세스가 생성되면 PCB(Process Control Block)이라는 곳에 저장된다.
PCB(Process Control Block)
- 프로세스 메타데이터들을 저장해 놓은 곳을 말한다.
- 한 PCB안에는 한 프로세스의 정보가 담겨있다.
- PCB가 왜 필요한지
- CPU에서 프로세스의 상태에 따라 교체작업이 이루어진다.(interrupt가 발생해서 할당받은 프로세스가 waiting 상태가 되고 다른 프로세스를 running으로 바궈 올릴 때)
- 이때, 앞으로 다시 수행할 대기 중인 프로세스에 관한 저장 값을 PCB에 저장해두는 것이다.
- PCB 관리
- Linked List 방식으로 관리된다.
- PCB List Head에 PCB들이 생성될 때마다 붙게 된다. 주소값으로 연결이 이루어져 있는 연결리스트이기 때문에 삽입 삭제가 용이하다.
- 프로세스가 생성되면 해당 PCB가 생성되고 프로세스 완료시 제거된다.
- 이렇게 수행 중인 프로세스를 변경할 때, CPU의 레지스터 정보가 변경되는 것을 Context Switching 이라고 한다.
Context Switching
- CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재하는 과정
- 보통 인터럽트가 발생하거나, 실행 중인 CPU 사용 허가시간을 모두 소모하거나, 입출력을 위해 대기해야 하는 경우에 Context Switching이 발생한다.
IPC(Inter Process Communication)
- 프로세스는 독립적으로 실행된다. 독립 되어있다는 것은 다른 프로세스에게 영향을 받지 않는다고 말할 수 있다.(스레드는 프로세스 안에서 자원을 공유하므로 영향을 받는다.)
- 이런 독립적 구조를 가진 프로세스 간의 통신을 해야 하는 상황이 있을 것이다. 이를 가능하도록 해주는 것이 바로 IPC 통신이다.
- 프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스간 통신을 할 수 있다.
IPC 종류
- 익명 PIPE
- 파이프는 두 개의 프로세스를 연결하는데 하나의 프로세스는 데이터를 쓰기만 하고, 다른 하나는 데이터를 읽기만 할 수 있다.
- 한쪽 방향으로만 통신이 가능한 반이중 통신이라고도 부른다.
- 따라서 양쪽으로 모두 송/수신을 하고 싶으면 2개의 파이프를 만들어야 한다.
- 매우 간단하게 사용할 수 있고, 단순한 데이터 흐름을 가질 땐 파이프를 사용하는 것이 효율적이다.
- 전이중 통신을 위해 2개를 만들어야 할 때는 구현이 복잡해진다.
- Named PIPE(FIFO)
- 익명 파이프는 통신할 프로세스를 명확히 알 수 있는 경우에 사용한다.(부모-자식 프로세스 간 통신처럼)
- Named PIPE는 전혀 모르는 상태의 프로세스들 사이 통신에 사용한다.
- 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신이 가능하다.(통신을 위해 이름있는 파일을 사용한다.)
- Named PIPE 역시 읽기/쓰기가 동시에 불가능하다. 따라서 전이중 통신을 위해서는 익명 파이프 처럼 2개를 만들어야 가능하다.
- Message Queue
- 입출력 방식은 Named 파이프와 동일하다. 다른점은 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다.
- 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
- 공유 메모리
- 파이프, 메시지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비이다.
- 프로세스의 메모리 영역은 독립적으로 가지며 다른 프로세스가 접근하지 못하도록 반드시 보호되야 한다. 하지만 다른 프로세스가 데이터를 사용하도록 해야하는 상황도 필요할 것이다. 파이프를 이용해 통신을 통해 데이터 전달도 가능하지만, 스레드처럼 메모리를 공유한다면 더욱 편하다.
- 공유 메모리는 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용해준다.
- 프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해주고 이후 모든 프로세스는 해당 메모리 영역에 접근할 수 있게 된다.
- 중개자 없이 곧바로 메모리에 접근할 수 있어서 IPC중에 가장 빠르게 작동한다.
- 메모리 맵
- 공유 메모리처럼 메모리를 공유해준다. 메모리 맵은 열린 파일을 메모리에 맵핑시켜서 공유하는 방식이다.(즉 공유 매개체가 파일 + 메모리)
- 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
- 소켓
- 네트워크 소켓 통신을 통해 데이터를 공유한다.
- 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
- 서버(bind, listen, accept)
- 클라이언트(connect)
- 이러한 IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.10.11 게임 서버 (0) | 2024.10.11 |
---|---|
24.10.10 게임서버 (4) | 2024.10.10 |
24.10.02 UE5, 알고리즘 (1) | 2024.10.02 |
24.09.30 UE5 (1) | 2024.09.30 |
24.09.26 UE5, CS (0) | 2024.09.26 |