TIL - CS

Kyu_·2026년 8월 4일

37주차

목록 보기
2/3

CS

복습

TLB

TLB는 최근 가상 페이지 -> 물리페이지 변환 결과를 캐싱하는 CPU내부의 빠른 캐시

데이터 레이스와 레이스 컨디션 차이

데이터 레이스 : 같은 메모리를 여러 스레드가 동기화 없이 접근하고, 그 중 하나이상이 쓰기를 하는 경우, C++에서는 정의되지 않은 동작
레이스 컨디션 : 스레드 실행순서에 따라 결과가 달라지는 더 넓은 문제

프로세스와 스레드의 차이를 메모리 관점에서 설명

프로세스는 실행중인 프로그램의 독립적인 주소 공간, 다른 프로세스와는 기본적으로 메모리를 공유하지 않음. IPC나 공유메모리로 의도적으로 통신/공유는 가능
스레드는 프로세스 안에서 코드/힙/전역 데이터를 공유하고, 각자 스택과 레지스터를 따로 가진 실행 흐름, 스레드끼리 공유 데이터를 다룰 때 동기화가 필요하다.

포인터와 레퍼런스 차이

포인터는 nullptr 초기화 가능 레퍼런스는 초기화할때 무조건 값넣어줘야함
포인터는 주소값 레퍼런스는 변수별칭
포인터는 재할당 가능 레퍼런스는 한번 지정한거로 쭉가야됨
포인터는 *이나 ->로 접근, 레퍼런스는 일반 변수처럼 접근

디퍼드 렌더링이란>

물체의 색/노멀(표면 방향)/깊이 같은 정보를 G-Buffer에 저장하고 별도의 단계에서 조명을 계산하는 방식
많은 동적 조명을 처리하기 유리하지만 G-Buffer때문에 메모리/대역폭을 많이 쓰고, 투명 물체 처리가 까다로운 단점이 있다.

불편하지만 수동으로 메모리 관리를 하는 이유는 뭘까?

객체의 생성/파괴 시점을 정확히 통제할 수 있기 때문이다. 게임에서 GC가 언제돌지 몰라 프레임이 끊기는 것을 피하기 위함이다.

몬스터가 1만 마리라면 어떤 식으로 스레드 구조를 가져가야 할까? 단, 1만 마리가 모두 플레이어 변수를 건드린다면?

스레드 풀을 하나 만들고 코어수에 맞는 워커 스레드를 생성한다. 워커 마다 자기 로벌 커퍼에 결과를 모으고, 메인 스레드가 한번에 적용한다.
플레이어 값은 워커가 직접 수정하지 않고 읽기 전용으로 본다.

버텍스 셰이더, 픽셀 셰이더

버텍스 셰이더 : 정점 하나씩 처리해서 3D 정점 위치를 화면 좌표로 변환한다.
픽셀 셰이더 : 폴리곤 내부를 채운 픽셀 하나씩 처리한다. 텍스처/조명 등을 계산해서 그 픽셀의 최종색을 정한다.

개념

UObject와 AActor의 차이

UObject는 언리얼 오브젝트 시스템의 가장 기본 클래스
AActor는 UObject를 상속받아 월드에 배치될 수 있는 게임 오브젝트의 기본 클래스
차이점으로는
UObject는 월드 위치/회전/스케일이 없고, 데이터 객체/에셋/게임 시스템등에 사용
AActor는 월드에 존재할 수 있고, 위치/회전/스케일이 있고, Tick/네트워크 복제 같은 게임 월드 기능을 사용할 수 있음

UActorComponent와 USceneComponent의 차이는 뭐야?

UActorComponent : 액터에 기능을 부여, 자기 위치/회전/크기가 없다.
USceneComponent : UActorComponent를 상속받고, 위치/회전/크기를 가짐, 다른 SceneComponent에 붙어 부모-자식구조를 만들 수 있고, 액터의 Root Component가 될 수 있다.
USceneComponent는 액터안에서 위치가 필요한 부품에 사용한다 (Capsule Component, Skeletal Mesh Component, Spring Arm Component, Camera Component), 컴포넌트에 계층구조가 생기면 트랜스폼 변화가 자식에게 전달된다. 캐릭터가 앞으로 이동하면 나머지 메시/카메라/스프링 암등이 따라 같이 이동한다.

GameMode, GameState

GameMode : 서버에만 존재, 게임 규칙, 승패 판정, 플레이어 스폰 같은 권한있는 로직 처리
GameState : 서버와 모든 클라이언트에 존재하고 복제됨, 현재 게임시간, 팀 점수처럼 모두가 봐야하는 상태를 담음

PlayerController, PlayerState

PlayerController : 서버와 그 플레이어 본인 클라이언트에만 존재한다. 입력처리, Pawn빙의, 카메라/UI처럼 소유자만 알아야 하는 일을 맡는다.
PlayerState : 서버와 모든 클라이언트에 존재하며 복제된다. 플레이어 이름, 킬, 점수, 팀처럼 다른 플레이어도 봐야하는 상태값들이 들어있음

RPC

RPC는 네트워크에서 함수를 실행하게 하는 호출이다. RPC방향은 이름이 실행되는 목적지 기준이다.
서버RPC는 클라이언트에서 호출하고 서버에서 실행하는것(발사 요청), 클라이언트RPC는 서버에서 호출되어서 클라에서 실행되는것(개인 알림), 넷멀티캐스트RPC는 서버에서 호출하고 모든 클라이언트에서 실행하는것 (폭발 이펙트)

Reliable RPC

Reliable RPC는 반드시 도착해야 하는 RPC다. 유실되면 재전송한다. ex) 아이템 획득, 게임 시작
UnReliable RPC는 유실되어도 재전송하지 않는 RPC다. ex) 자주발생하는 이펙트, 위치관련 임시 알림
Reliable을 너무 자주쓰면 네트워크 재전송과 대기때문에 밀릴 수 있다

ReplicatedUsing

이 프로퍼티를 복제하고, 클라이언트가 새 값을 받으면 지정한 OnRep함수를 호출해라라는 뜻
OnRep함수는 복제된 값이 클라이언트에 도착했을때 후처리하는 콜백 함수

복제


bReplicates = true // 이 액터자체를 네트워크 복제 대상으로 만든다. 이 액터가 클라이언트에도 생성/동기화 될수 있게 한다. 자동으로 멤버변수들까지 복제되지는 않음

UPROPERTY(Replicated) // 특정 프로퍼티 Health값을 서버에서 클라이언트로 복제하겠다.
int32 Health;

UPROPERTY(ReplicatedUsing = OnRep_Health) // Health를 복제하는건 같은데 클라이언트가 새 Health값을 받으면 OnRep_Health()도 자동호출되어 UI갱신같은 후처리를 함
int32 Health;

UFUNCTION 옵션

BlueprintCallable : 블루프린트에서 C++함수를 호출할 수 있게 함
BlueprintImplementableEvent : C++에서 이벤트만 선언하고 실제 구현은 블루프린트에서
BlueprintNativeEvent : C++에 기본 구현을 두고, 필요하면 블루프린트가 덮어쓸 수 있다.

0개의 댓글