[Misc] Software License
데이터 직렬화란 직렬화의 개념을 검색해보면 보통은 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 방식으로 변환하는 것이라고 서술한다 나에게는 선뜻 와닿지 않는 설명이다
CI/CD 애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법 지속적 통합, 지속적 배포, 지속적 서비스 제공 이러한 프로세스를 CI/CD 파이프라인이라 하며, 애자일 방식의 협력을 통해 실행
개요 LLVM을 사용하여 IL을 고도로 최적화된 네이티브 코드로 변환하는 컴파일러
GC 기본사항 CLR에서 자동 메모리 관리 역할을 하기 위해 GC를 둔다 사용자는 메모리 해제 등 관리 작업을 위한 코드를 작성하지 않아도 된다 메모리 누수 및 메모리 반환, 해제된 메모리에 접근 등 문제를 해결 GC에 의해 효율적으로 메모리를 할당
Value Type 값이 바로 할당되는 타입 직접 값을 가지고 있다 int, float, char 등이 이에 해당한다 System.ValueType으로부터 상속
Virtual Table의 구조 C#에서 모든 클래스는 System.Object 클래스에서 상속되므로 VTable을 갖는다 기본적으로 ToString, Equals, GetHashCode, Finalize 메서드를 VTable에 갖는다 Base클래스가 가상 메서드가 없다면 이외의 메서드들은 VTable Slo...
추상적 자료형 ADT 자료 자체의 형태와 연산을 수학적으로만 정의한 것
Update의 비용
SpriteRenderer 어떤 hierarchy에도 배치할 수 있다 Transform으로 조정한다 transparent geometry queue를 통해서 render된다 default material을 사용하는 경우 자동으로 최적 메쉬를 생성한다 draw call을 줄이기 위해 sprite at...
Value type이면 모두 stack에 저장된다? Value type은 stack에 저장될 수 있다 항상 stack에 저장되는 것은 아니다 프로그래머는 특정 객체에 대해 stack에 저장되는지 heap에 저장되는지를 알아야할 필요가 있었다 사용자에게 노출되지 않은 상태로 메모리를 관리하는...
닷넷 프레임워크
Struct 값 타입 allocation 및 deallocation 시 참조 타입보다 소요가 적다 stack에 저장 nested struct 구조인 경우 inline member들은 private by default
string vs String
값 형식 vs. 참조 형식
Difference between Array, ArrayList, List Array
컴퓨터 프로그램을 만드는 방식 2가지
static const in C++
유니티의 Entity Component System
캐시 Cache CPU가 빠른 속도가 데이터를 주고 받을 수 있도록 도와주는 메모리 Locality of Reference 원리에 따라 메모리 저장소의 데이터를 미리 가져와 보관
CPU의 차이 레지스터의 bit 폭 차이 레지스터의 크기가 16bit이면 16bit CPU 레지스터의 크기가 64bit이면 64bit CPU
벡터의 한계 어떤 물체를 화면에 표현하려면 벡터만으로는 부족 벡터는 크기와 방향 성분만을 가짐 위치 정보가 필요 위치는 무엇으로 표현하는가? 점 point
메모리(RAM) 점유율의 상승하면? 메인 드라이브에 가상메모리 영역을 설정 해당 영역을 메모리처럼 사용 낮은 단계에 가상 메모리가 잡힐수록 엑세스 속도가 느려짐 이 같은 이유로 RAM 메모리가 많을수록 좋다는 것
크기 변환 벡터의 크기와 방향 중 크기만 변경하는 것 각 성분에 각 계수만큼의 크기를 곱해 양을 바꿈
선형 변환과 행렬 선형 변환이란 하나의 벡터 공간을 다른 벡터 공간으로 변환하는 함수 선형 변환을 정의하는 두 특성이 변환 후에도 벡터 공간의 조건을 그대로 만족하기 때문
행렬 Matrix m x n 행렬에서 m = n 이면 정방행렬 square matrix 이다 모든 요소가 0이면 영행렬 zeron matrix 이다 어떤 행렬의 행과 열을 뒤바꾸면 전치 행렬 transpose matrix라 한다 전치한 행렬이 원래 행렬과 같다면 대칭 행렬 symmetric matrix라 한다 ...
Content Delivery Network 정의 지리적으로 분산된 여러 개의 서버 컨텐츠를 사용자와 가까운 서버에서 전송해 속도면에서 이득 중앙 서버에서 개별 사용자에게 컨텐츠를 전송하려면 트래픽 과부하 및 전송 속도, 시간 문제 발생 파일 복사본을 캐싱하여 각 데이터 센터에 저장
일급 객체 모든 요소는 함수의 실제 매개변수가 될 수 있다. 모든 요소는 함수의 반환 값이 될 수 있다. 모든 요소는 할당 명령문의 대상이 될 수 있다. 모든 요소는 동일 비교의 대상이 될 수 있다.
유클리드 공간 임의의 점과 다른 한 점을 연결하는 직선은 단 하나다 임의의 선분은 양 끝으로 얼마든지 연장할 수 있다 임의의 점을 중심으로 하고 임의의 길이를 반지름으로 하는 원을 그릴 수 있다 R은 실수로 이루어진, R^2은 2차원 공간, R^3는 3차원 공간을 의미
선형변환 (Linear Transformation) 대수학 미지수와 미지수를 사용하는 수학
예시 case 1
readonly vs. const
Waterfall 워터폴
Host 네트워크에 연결된 모든 종류의 장치를 Node 노드 중 IP 주소(네트워크 주소)가 할당된 것들을 Host Host들끼리 데이터를 송수신한다 데이터의 송수신은 Host가 실행하는 Process가 수행
연결 지향 vs. 비연결 지향
프로토콜 Protocol 네트워크 환경 내 모든 기기가 서로 통신하며 데이터를 주고 받으려면, 각 기기에는 사전 협의된 통신 협약/규약이 필요 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계 신호 체계, 인증, 그리고 오류 감지 및 수정 기능을 포함 구현되는 방법은 독립적이나, 하드웨어 또는 소프트웨어 그리고...
HTTP HyperText Transfer Protocol HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜 Plain text로부터 JSON 데이터 및 XML과 같은 형태의 정보도 송수신 가능 보통은 클라이언트가 어떤 정보를 HTML 형태로 받고 싶은지, JSON 형태로 받고 싶은지 명시 ...
Precompiled Header(미리 컴파일된 헤더) 헤더를 미리 컴파일 해두는 것 자주 변경되지 않는 긴소스를 미리 컴파일하여 컴파일 결과를 별도의 파일에 저장 다시 똑같은 헤더를 컴파일할 경우 해당 파일을 처음부터 컴파일하지 않고, 미리 컴파일된 헤더 파일을 사용해 컴파일 속도를 월등히 향상
동적 형식 dynamic 변수 및 해당 멤버에 대한 참조 사용에 대한 컴파일 타임 검사를 패싱 런타임에서 확인 대부분의 상황에서 object 처럼 동작 그러나 컴파일러가 형식을 검사하지 않은 상태 컴파일 타임을 거치며 object 타입으로 변환 런타임에서 dynamic...
Gizmo 씬 뷰에서 편집이나 디버깅을 위해 오브젝트의 위치나 범위, 특정 요소를 가시화
Lua 스크립트 절차식 명령식 스크립트 언어 간단한 자료구조 : boolean, number, string, table 핵심 모듈의 크기가 120KB 이하 게임 개발에 자주 사용되는 Python에 비해 빠른 실행 속도를 가짐 오픈소스
Event 한 object에 의해 어떤 action이 발생했음을 알리는 notification .NET에서는 observer design pattern을 사용
정적 라이브러리(Static Link Library) 필요한 함수를 프로그램 코드에 붙여 컴파일 시 프로그램 자체에서 참조 (Compile-Time) lib 파일은 하나의 거대한 파일이 생성 재사용성이 떨어짐 어플리케이션 업데이트 시 새로운 버전으로 작성 다른 어플리케이션에 사용 불가 하지만 버전 ...
인코딩이란?* Encoding - 문자나 기호를 암호화하는 것 Decoding - 암호화를 해독하는 것, 복호화 인코딩과 디코딩은 정해진 기준에 따라 입력되고 해독해야 하는데, ASCII나 UNICODE와 같은 문자셋이 그것이다. Base64 인코딩은 8비트 이진 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문...
TryGetValue vs. ContainsKey? ```csharp // key가 있는지 체크 public bool ContainsKey(TKey key) { return (this.FindEntry(key) >= 0); }
default 연산자 default 키워드는 해당 변수 타입의 기본 또는 빈 상태를 반환 참조 형식(class, delegate, …)의 default 값: null 값 형식 (struct, enum, …)의 default 값: all-zeroes value int 0, DateTime 0001-01-01 00:00:0...
Managed vs. Unmanaged Code Unmanaged code란 컴퓨터 구조, 프로세서에 특화되어 그에 의존하는 코드 C#에서는 unsafe 키워드를 이용하는 코드 프로그래머에 의해 직접 관리 Managed code란 .NET 프레임워크에서 구동하는 C# 코드 자체 ...
lock 키워드 개체에 대한 뮤텍스를 획득하고 signal과 unlock을 실행
DontDestroyOnLoad 새로운 Scene이 로드될 때, 자동으로 파괴되지 않는 target 오브젝트를 생성 새 레벨이 로드되면 Scene의 모든 오브젝트들은 파괴되고, 새 레벨의 오브젝트들이 로드된다. 레벨 스위치 중에 오브젝트를 보존하기 위해 DontDestroyOnLoad 사용 해당 오브젝트가 component이거나 gam...
sealed 키워드 클래스에 적용된 경우 다른 클래스가 해당 클래스에서 상속하는 것을 막음
C# 포인터 C# 대부분의 코드는 확인할 수 있는 안전한 코드 .Net 도구에서 코드가 안전한지 확인 가능 원시 메모리를 할당하지 않고, 포인터로 직접 메모리에 엑세스하지 않음 경우에 따라 앱의 성능을 향상 포인터가 필요한 네이티브 함수를 호출하는 경우 필수 보안 및 안전성 이슈 발생...
Job System
동기와 비동기 동기 어떤 operation을 실행시켰을 때 결과값이 도출될 때까지 프로그램은 멈춰서 기다려야 함 비동기 언제 값이 도출될 지 보장할 수 없고, 그 동안 프로그램은 다른 프로세스를 진행할 수 있음 async / await는 위 중 비동기 프로그래밍을 위해 사...
확장 메서드란 기존 제공되는 클래스/구조체/인터페이스의 구현을 직접 변경하지 않고 기능을 확장해 사용 기존 데이터 타입 (int, float 등)의 class에도 적용 가능
이미지 압축 PNG/JPG 등으로 압축했더라도 GPU 메모리에 저장할 때는 압축이 풀린 상태로 저장 GPU가 이 파일을 그대로 읽어들일 수 없기 때문 대역폭 사용량에 초점을 맞춘 파일 형식 GPU가 텍스쳐로 쓰기 위한 압축 형식이 아님 가변 비율 인코딩을 수행하기 때문 ...
Frustum Culling Camera (View) Matrix Far/Near 값으로 조정 원거리 Culling objects의 부자연스러움 감추기 위해 Fog 사용
메모리 클럭 메인보드에서 발생하는 램 동작 주기 신호(MHz) 메모리 버스 폭 메모리 입출력 라인 개수(bit) 메모리 대역폭 Memory Clock * Memory bus width 한번의 클럭 신호를 통해서 처리할 수 있는 용량 GPU가 읽을 수 있는 데...
드로우콜 // OpemGL의 DrawCall glDrawArrays(); // vertices rendering glDrawElements(); // indices rendering CPU에서 그래픽 API 호출을 통해 GPU에 렌더링을 명령하는 것
SafeArea 모바일 해상도에서 전면 카메라 영역 침범하지 않게 보장해주는 영역 노치폰에 대해 ui 배치 대응을 위해 설정
물음표 연산자 두개가 연속적으로 쓰이는 예시
Property 정보은닉을 더 간결하고 간단하게 구현하도록 허용 get / set 메서드를 대신해 가독성을 보완
partial 키워드 C#에서는 C/C++와 달리 cs 파일 하나에 클래스 선언과 정의가 작성 클래스가 커질 경우 가독성이 떨어짐 Partial 키워드를 제공함으로써 여러 파일에 하나의 클래스를 작성하도록 허용 대리자(delegate) 또는 열거형(enum) 선언을 할 때 partial 한정자를 사용할 수 없음 ```csharp /...
byte와 char의 사이즈 byte: 1바이트 숫자 자료형 char: 2바이트 문자 자료형 1바이트 아님! 대부분의 .Net 언어의 문자열은 유니코드 utf-16을 디폴트로 지원
in 키워드 in 매개변수로 전달되는 변수는 메서드로 전달되기 전 반드시 초기화 인수가 참조로 전달되지만, 수정되지 않음 오버로딩 규칙 ```csharp class InOverloads { // 오버로딩 허용 public void SampleMethod(in int i) { } public void SampleMeth...
에셋번들 유니티 프로젝트에 사용할 리소스들을 묶은 것 유니티에서 에셋 번들 생성 외부 스토리지(서버)에 저장 프로젝트의 런타임 중 번들을 다운로드 다운로드한 번들에서 개별 에셋을 로드해 사용
Canvas Unity에서 모든 UI 객체를 렌더링 하기 위한 루트 컴포넌트 기본적으로 4개의 컴포넌트를 포함 RectTransform Canvas Canvas Scaler Graphic Raycaster
var 암시적 형식 컴파일러가 compile time에 자료형을 결정 제약 조건 지역 변수에만 사용 가능 변수 선언과 함께 초기화 필수 null / 익명 메서드 / 메서드 그룹으로 초기화 불가
Dictionary의 종류 Dictionary Key와 Value의 Pair를 갖는 자료구조 Generic 해시테이블 구조를 사용
리플렉션의 개념 일반적으로는 클래스를 통해 객체를 생성 사용자(프로그래머)는 클래스의 필드와 메서드를 알고 있고, 사용하는 데 불편함이 없다
as와 is 형변환을 위한 예약어 개발자에 의해서 의도적으로 downcasting하도록 도와주는 연산자 downcasting 베이스 클래스가 파생 클래스로 캐스팅 되는 것 upcasting 파생 클래스가 베이스 클래스로 캐스팅 되는 것
9 Slicing 하나의 텍스쳐로 다양한 사이즈의 재사용 가능한 이미지로 설정하는 방법 리사이징 시, 이미지를 왜곡하지 않음
where 키워드 사용 예시
메서드에 선언된 new modifier base class의 메서드를 숨김 upcasting 하여 base class의 메서드를 사용할 수 있으나 이는 의도된 디자인에 반하는 행위이므로 위험
delegate(대리자) 키워드 delegate는 메서드를 다른 메서드에 인수로 전달하는 데 사용 형식이 일치하는 구조의 모든 메서드는 대리자에 할당할 수 있다 메서드는 정적/인스턴스일 수 있다. delegate 속성 함수 포인터와 유사하지만, 객체 지향적으로 인스턴스 및 메서드를 캡슐화한다. 메서드를 매개 변수로 전달할 수 ...
서브루틴(Subroutine) C언어 등에서 일반적으로 사용하는 함수 시작할 때 진입하는 지점이 하나 존재하고, 종료되는 지점을 설정할 수 있다. 서브루틴은 시작점과 종료점이 1개인 코루틴에 포함
Synchronization 동기화 복수 이벤트의 유연한 실행 및 조화를 위해 조정을 가하는 것 구속 조건은 아래와 같다 Serialization: 하나의 이벤트가 끝난 다음에 다른 이벤트가 발생 Mutual Exclusion: 두 개의 이벤트가 한 시점에 동시에 발생하고 있지 않음
lock-base 코드의 몇가지 문제점 lock 순서를 제대로 관리하지 않으면 데드락의 가능성 priority inversion - 낮은 우선 순위의 스레드가 진행되기 위해 높은 순위의 스레드 락을 요구하는 경우 atomic한 operation이 오래 걸리는 경우, 다른 스레드들은 기다려야 함
플래시 메모리 전기적으로 데이터를 지우고 다시 기록할 수 있는 비휘발성 메모리입니다.
반도체란? 전기적으로 도체와 부도체 사이의 성질을 띠고 있는 물질
개요 프로세스란 메모리 상에 실행되고 있는 프로그램 프로그램 - 작업을 위해 실행할 수 있는 파일
메모리 관리 프로그램을 실행하기 위해 모든(또는 일부) 실행 구문과 데이터의 전부(또는 일부)은 메모리 안에 있어야 함 CPU가 유저 작업에 반응하고 최적화하기 위해 어떤 데이터를 메모리 안에 넣을지를 정하는 작업 Activities: 어떤 메모리가 쓰이는지, 누구에 의해 사용되는 지를 트래킹 어떤 프로세스,...
스케줄링 프로세스가 실행되기 위하여 OS 스케줄러에 의해 자원을 할당받는 것 User processes System processes
OS란? 사용자와 컴퓨터 하드웨어를 매개해주는 중간 프로그램 프로그램을 실행시켜주고 사용자가 문제를 쉽게 풀도록 도와줌 컴퓨터 시스템을 편리하게 사용토록 도움 컴퓨터 하드웨어를 더 효율적으로 사용하도록 도움 Resource Allocator 모든 리소스를 관리 제어 ...
인터럽트 (Interrupt) CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능 대부분의 컴퓨터는 한 개의 CPU를 사용 한 순간에는 하나의 일 밖에 처리할 수 없음 어떤 일을 처리하는 도중에 우선 순위가 급한 일을 처리해야하는 경우 발생
컴퓨터 시스템 구조 Four Components of a Computer System
저장장치 Storage 최소 단위는 bit 8 bits = 1 byte 컴퓨터 구조상 native unit of data는 word = one or more of bytes 32 bit or 64 bit 구조 주 메...
Compiled Language CPU가 바로 이해할 수 있는 기계어로 소스코드를 변환 소스코드 처리와 분석에 많은 시간 소요 일반적으로 실행이 빠름 컴파일된 기계어는 플랫폼 의존적
개념 동기 vs 비동기 처리해야 할 작업들을 어떠한 ‘흐름’으로 처리 할 것인가에 대한 관점 블로킹 vs 논블로킹 처리되어야 하는 (하나의) 작업이, 전체적인 작업 ‘흐름’을 막느냐 안막느냐에 대한 관점
Component란? GameObject 에 부착되는(Attached) 모든 것들이 상속받는 기반 클래스. MonoBehaviour 는 Unity 의 모든 스크립트가 상속받는 클래스 사용자가 Unity 엔진의 작동 방식을 이해하지 못하더라도 코드를 작성할 수 있도록 미리 만들어 둔(built-in) Behaviour 클래스이자 스크립트 명...
interface 특정 메서드들의 조합을 고려
네트워크 Network 컴퓨터 네트워크 또는 컴퓨터망은 노드들이 자원을 공유할 수 있게 하는 디지털 전기통신망의 하나
TCP란?(Transmission Control Protocol) 인터넷을 경유해 통신하는 연결 지향성 프로토콜 에러 체킹을 지원 데이터의 완전한 전송을 보장 패킷의 전송 순서를 보장 TCP는 FLOW CONTROL을 제공함
컴포넌트란? 독립적, 교체에 용이하고, 재사용 가능한 기능들의 집합 다른 컴포넌트와 상호작용하기 위해 디자인된 소프트웨어 객체 기능을 수행하기 위한 목적이 있고 그에 맞는 인터페이스를 제공
조건부 Input 트리거 IMC에서 설정하는 Input Trigger를 커스텀하게 추가할 수 있다
Component를 다른 타입으로 교체
마우스로 인게임 오브젝트를 Hover하거나 Select 해야하는 상황 보통은 이 경우에 Screen 좌표상에서 InGame World로 Deprojection을 통해 Ray를 쏴서, 해당 Ray에 Hit되는 첫번째 Object를 반환하는 것 같다 Select야 Mouse 클릭할 때만 하면 된다지만, 이 방식대로라면 Hover는 매번 Ray를 ...
Show Bone 커맨드 사용 시 크래시 이슈 애니메이션 파트 쪽에서 showbone 커맨드 입력 시 크래시가 발생한다는 문의가 들어왔다 확인해보니, 아래 부분에서 index 개수 차이로 발생하는 문제였다
캐릭터가 Random한 Idle Animation을 출력하게 하고 싶어요
NU1902: 보안 취약성에 대한 패키지 종속성 감사 딱히 영향을 줄만한 변경점이 없었는데 갑자기 nuGet쪽 취약성으로 인해 빌드 머신에서 빌드가 안되는 현상이 발생했다 어처구니 없는 건, 문제가 되는 패키지들이 전부 최신 버전이라는 것… 근본적인 해결 방법은 찾지 못했지만, 일단은 취약성 경고를 에러로 처리하는 ...
갑자기 든 의문
StateTree를 쓰면서 명심해야 할 점
Control Rig를 적용한 상태에서의 R&D
Possess 아닌 탈 것 탑승 기능 구현
문제 상황 언리얼 엔진 5.4 버전에서 Projectile Movement Component 사용 시, 전 게임에 걸쳐서 액터들의 Collision Response가 오염되는 현상
가장 가까운 NavMesh 위치 탐색 ProjectPointToNavigation을 많이 사용한다
Motion Matching 개념 현재 캐릭터의 동작과 상태를 기준으로, 가장 적절한 다음 동작을 선택하는 로직 ABP의 StateMachine과 BlendSpace를 대체 가능 자연스러운 Blend를 위한 작업 Cost 감소 여러 상황에 대응되는 애니메이션 에셋이 여러 개 있고, 테이블이 이 애니...
Mass System
Skill Data
세이브 포인트 캠프라는 이름의 체크 포인트를 정의했다 던전 안에는 여러 캠프가 존재하며, 던전 진입 시 마지막으로 활성화 및 상호작용한 체크포인트의 위치로 스폰되어야 했다 멀티 상황에서 최대 4개의 스폰 포인트가 있고, 스폰 시 특정 애니메이션을 출력해야 했다
Update Rate Optimization 이슈
액션의 단위 Abl 플러그인을 사용하면서, 하나의 Abl이 캐릭터의 액션 단위로 정립되었다 Abl은 재생할 애니메이션, 그리고 이에 동반하는 효과 등을 여러 개의 AblTask로 구성했다. Abl 플러그인이 기본적으로 지원하는 Branch 기능을 통해, 하나의 Abl에서 다른 Abl로 Transition 할 수 있었다 ...
플레이어 캐릭터 사망
Linked Anim Layer 하나의 AnimBP에서 캐릭터가 필요한 모든 상태 관리를 할 수도 있다 하지만 동일한 상태에 대해 다른 애니메이션, 다른 로직이 필요하다면? 캐릭터가 그냥 달리는 애니메이션과, 무기를 들고 달리는 애니메이션이 달라야 한다면? State Machine 구조는 동일한데 애니메이...
소프트타겟, 소프트락 개념
ALS Plugin 카메라
멀티 상황에서 필요한 정보 정의
문제 상황 ALS 캐릭터 액터의 Scale을 늘렸을 때, 캐릭터의 로코모션 애니메이션의 PlayRate가 보정되지 않는 현상 발이 미끄러지는 현상 발생
Mover 기존의 Character Movement Component를 대체할 목적의 언리얼 공식 플러그인 포스트 작성일 기준으로 아직 Experimental Mover 1.0이 나오자마자 곧바로 CMC 지원을 끊을 계획은 없고 장기적으로 대체할 것이라 한다 언리얼 캐릭터의 기본적인 Movement...
Pipeline State Object Cache 구식 API는 Draw Call 전에 관련 GPU 파라미터를 변경하기 위해 여러 번의 콜을 해야했다 Parameter A 업데이트 + Parameter B 업데이트 + … 최신 API는 PSO라는 GPU Parameter의 집합, 즉 GPU State를 패키징...
문제 상황 카메라와 캐릭터 사이에 어떤 장애물이 있고, 시야를 가리는 오브젝트가 특정 타입인 경우 이 오브젝트를 투명화 시켜야 했다 그런데, 게임 내의 대부분의 레벨 액터는 Nanite Naterial을 사용 중이다
Custom Depth Pass
Session Search 안되는 현상
Widget은 어디에 붙여야 하나 어떤 Widget은 World 위치를 투영해 Screen 상에 표기하는 게 더 낫다 게임에서 한 번에 단 하나의 상호작용만 가능하고 고정된 위치에 표기한다면, 상호작용 Widget은 Screen에 상시 존재하고 필요할 때마다 노출하는 것이 낫다 락온 UI라든가, 원거리 무기류 장착 ...
Game Feature
하드락 카메라 액션 게임에서 특정 적을 대상으로 락온을 걸 수 있다 이 때 카메라는 대상을 계속 추적한다
check 사용 케이스 DO_CHECK = 1인 경우 매크로 내부를 실행 데스트 실패 시 중단점 체크 + 크래시 리포터 DO_CHECK = 0인 경우 매크로를 무시한다
플레이어 캐릭터의 행동을 제약하는 방법 플레이어가 특정 조건 및 상황에 따라 어떤 행동을 하지 못하게 해야하는 경우가 있다 마을에서 공격하지 못한다거나 빈사 상태인 경우에는 이동 이외에는 아무 것도 못한다거나 이런 경우 캐릭터의 행동이 어떻게 관리되는지에 따라 제어하는 방법이 다를 수 있다 ...
스태틱 메시와의 차이 기본적으로 스태틱 메시와의 큰 차이는 없다 나나이트 메시는 더 많은 수의 트라이앵글과 인스턴스를 처리할 수 있다 나나이트는 머티리얼을 굽지 않아도 된다 더 적은 메모리를 사용하며, 더 빠르게 렌더링된다 최적화되지 않은 나나이트 메시와 스태틱 메시를 비교할 때 디스크를 차지하는 용량은 비슷하나, ...
개요 Lumen Essential
Braking Friction
Bit field 선언
FORCEINLINE과 inline 일반적인 inline 키워드를 사용했을 때, 컴파일러는 해당 구문을 inline화 할지 여부를 스스로 결정한다 하지만 __forceline 키워드는 컴파일러의 판단여부와 무관하게 무조건 inline화 하도록 강제한다 __forceinline은 VS 컴파일러에서 제공하는 non-standa...
BlueprintPure 함수를 블루프린트에 노출시킬 때, 이 함수가 OwnerObject에 아무 영향을 주지 않는 것을 보장하는 키워드 Gettor의 성격을 가진다
Unity Build C / C++의 프로젝트를 컴파일 할 때, 여러 translation unit을 하나로 뭉쳐서 빌드하는 방식 Unity 엔진과는 전혀 무관하다
Transient 언리얼 오브젝트는 직렬화 기능으로 오브젝트의 UPROPERTY 매크로로 속성을 저장 및 로딩할 수 있다 이를 테면, CurrentHP와 같은 값은 게임을 시작할 때마다 변경되므로 이 값을 저장 또는 로딩하는 것은 디스크 낭비다 이런 속성에 Transient 키워드를 추가해 직렬화 대상에서 제외할 수...
UFUNCTION Overload UFUNCTION 함수는 Overload 할 수 없다 만약 Overload 필요하다면 UFUNCTION 키워드를 제거하고 사용해야 한다 UHT가 Unreal Function을 등록하기 위해서 Iterate 할 때, 헤더 파서가 확인하는 것은 함수의 이름 뿐 ...
```c++ UCLASS(BlueprintType, Deprecated) class CLIENT_API UDEPRECATED_CameraBehaviorDataAsset: public UDataAsset { GENERATED_BODY()
Biped Movement 직립 2족 보행 플러그인은 ALS plugin으로 디테일을 표현할 수 있다 Unreal에서 공식적으로 지원하는 Motion Matching 플러그인도 있다 그렇다면 4족 보행은?
Behavior Tree Service Composite 혹은 Task에 Attach 되어 분기가 실행중인 동안 정의된 빈도로 실행 Blackboard 값 확인 및 업데이트 목적으로 사용 TaskNode를 통해서 업데이트 하기도 한다
Perception Component 주로 AI의 타겟 인지 및 해제를 관리하는 목적의 컴포넌트 자극(stimulus)을 인지하면서 호출하는 대표적인 delegate는 아래와 같다 OnPerceptionUpdated 자극을 처리하는 과정에서 자극을 제공한 모든 액터를 어레이로 받는다 ...
Gameplay Ability System (GAS) 캐릭터의 능력이나 속성 등을 관리할 수 있게 도와주는 프레임워크 캐릭터의 능력 또는 스킬의 구현 Gameplay Ability 액터의 수치화된 속성 관리 Atttibute 액터에 특정한 효과(Effect) 적용 ...
멀티플레이어 게임 멀티플레이어 게임에서는 동일한 게임이 여러 인스턴스에서 동시에 실행되어야 한다. 공유된 세계에 대해 일관된, 동일한 그림을 그려내야 한다
FName 텍스트에 대소문자 구분을 하지 않는다
Reflection 프로그램이 런타임, 그러니까 실행중에 자기 자신의 구조를 검사하고 조작할 수 있는 능력 일반적인 C++에서는 컴파일 시점에 모든 정보가 결정되고, 컴파일된 상태의 C++ 언어는 CPU로 전달된다 어떤 class A가 어떤 멤버 변수 혹은 함수를 가지고 있는지 알 수 없다 리플랙션이 지원되는 언...
Garbage Collection
루트 모션 사용 여부에 따른 차이
Parts of the AI Perception System Unreal은 AI Perception System을 통해 Actor가 무엇을 감지하는지, World의 어떤 부분을 감지할 수 있는지를 제어하게 해준다. 수집한 정보는 Event-driven system이 처리하면서 간단해지며 가벼운 비용만을 소모한다. 결과적으로 블루프린트 안에서 전범위에 ...
Navigation with AI 길찾기를 통해 주변 환경을 헤쳐나가는 건 AI의 기본이지만 단순히 A 지점에서 B 지점으로 이동하는 것은 마냥 쉬운 일은 아니다. 길찾기는 경로 탐색과 장애물 회피로 2 단계로 나눌 수 있다. 여기서 장애물이란 고정된 상태의 물체로 정의한다. 이런 장애물을 회피하기 위해 Navigation Mesh가 필요하다.
Blackboard / Behaviour Tree / AI Controller / Pawn 의 관계
UCLASS와 USTRUCT의 차이? 각 매크로는 Reflection 시스템에 클래스와 구조체를 등록하는 데 사용한다 Unreal Editor가 사용자 정의의 클래스 또는 구조체를 인식하기 위한 방법이다 메모리 관리 시스템에 포함시켜 Garbage Collection할 수 있도록 한다 UHT(Unreal ...
Hard Reference
UObject UObject는 Unreal Engine에서 가장 기본이 되는 객체다 UCLASS 매크로 선언으로 UObject를 관리하는 시스템이 이를 인식한다 Reflection System을 통해 Garbage Collection을 수행하는 등의 역할 모든 언리얼 오브젝트는 실행 초기의 런타임 과정에서...
BT를 사용하는 인스턴스의 데이터 캐싱 AI 캐릭터들이 BT를 사용하면서, 인스턴스 별로 가져야 할 데이터가 있다 Target과의 거리를 기록해두어야 한다든가.. Timer를 재기 위해 체크하는 현재 남은 시간이라든가.. 즉, 캐싱(Cache)을 해야 하는 데이터가 있을 것이다
Class Default Object (CDO) 언리얼 오브젝트의 기본 세팅 상태를 지정 기본 탬플릿 오브젝트 Master copy UClass, 리플렉션 시스템에서 작동하기 위해 고안된 클래스에서 이 정보를 포함한다 C++ 언어 차원에서 제공하지 않는 리플렉션 기능을 위 방법을...
기본적인 Actor의 라이프 사이클
IK와 FK FK Rig Forward Knematics Parent가 움직이면 Child도 종속되어 애니메이션이 작동 팔꿈지를 위아래로 흔들면 손, 손가락도 따라 움직이는 원리
노드로 접기 블루프린트 노드를 디자인하다가 커다란 그래프를 하나로 묶어 정리하는 기능
Blueprint란? Unreal 엔진에 내장된 컴파일식 비주얼 스크립팅 시스템 하나의 프리팹 혹은 아키타입으로 정의하는 단위일 수도 있다
Unreal vs. Unity
언리얼에 매크로를 사용하는 이유 언리얼 C++ 코드는 Unreal Header Tool, UHT Preprocessor라 불리는 커스텀 RTTI를 사용한다 이런 매크로가 달린 코드는 일반적인 C++ 매크로와 달리 더 낮은 레벨에서 작동하며 관리된다 이 매크로들은 RTTI, Reflection 등 작동을 위해 메타 데이터를 생성한다
chrono C++11에서 추가된 시간 관련 라이브러리
string_view C++17부터 추가된 타입 문자열의 길이와 문자열에 대한 포인터만 가지고 있다 string 보다 훬씬 가볍다 null 종료 문자를 가지지 않는다
람다 함수 lambda 이름 없는(익명의) 함수 객체
memcpy destination 주소값, source 주소값, source의 길이를 인자로 받는 함수 sdource의 값을 destination으로 복사
Base class
버퍼란? Buffer 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역
var in C#
Initialization 어떤 객체든 객체의 데이터 멤버는 생성자의 본문이 실행되기 전 초기화되어야 한다
임시 값 할당 인자 C++ 에서는 임시값을 const reference와 rvalue reference, 그리고 값으로서의 함수 인자로 받도록 허용한다 non-const reference 인자를 받는 함수는 함수 실행 중 인자를 수정하고서 변경된 상태로 다시 caller로 돌아가는 것을 허용한다
발생 이유 Stack 메모리의 크기는 스레드가 초기화될 때 고정된 크기로 결정 사용량을 초과하여 사용한다면 소프트웨어는 undefined behavior 야기 Stack 영역의 메모리가 지정된 범위를 넘어갈 때 발생 한 함수에서 너무 큰 지역 변수를 선언 함수를 재귀적으로 무한정...
RTTI란 C++ 컴파일러 내에 있는 객체의 타입 정보를 알아내는 기능 런타임에서 포인터가 가리키는 객체의 타입을 알 수 있게 해주는 방법 객체의 타입을 런타임에서 결정할 수 있도록 허용 메모리 상주 객체에 타입 정보 추가 런타임에서 객체의 캐스팅이 유효한지 알아내기 위해, 객체를 특정 타입으로 결정한...
프로토타입 패턴
관찰자 패턴 (감시자 패턴) 관찰자 패턴의 사례 MVC 패턴 C#의 event java의 라이브러리
다중 상속 Multiple Inheritance C++에서는 C#과 다르게, 다중 상속을 허용 기반 클래스의 멤버 또는 메서드의 이름이 동일한 경우 주의해야 한다
Translation 어떤 P1 (x, y)를 P2(x’, y’)로 이동 두 점 사이의 거리는 (Tx, Ty) x’ = x + Tx y’ = y + Ty
DFS Depth-Frist Search 현재 분기를 완벽하게 탐색한 뒤 다음 분기로 이동 현재 노드와 인접한 노드를 우선 탐색 더 이상 인접한 노드가 없을 때까지 반복 그래프 내에 cycle 여부를 확인할 때 사용
new/delete를 사용하지 않는 이유? 기능의 과도한 범용성 메모리 할당 너머의 hidden behavior 수행 불충분한 기능
수직동기화 VSync 화면주사율과 게임 화면의 FrameRate를 동기화 모니터는 각각 고유의 주사율이 있다 60Hz는 1초에 60번 스크린을 업데이트 한다는 의미 하드웨어 고유의 제한 사항이므로, 프로그램 및 PC 성능과 무관 게임 프레임은 게임 Scene을 1초에 몇 번 그리는지를 의미 ...
Singleton 오직 한 개의 instance만을 갖도록 보장 전역 상태를 관리하는 클래스에게 필요
C++ Template vs. C# Generic C++ 은 컴파일이 1번 일어나고, C# 제네릭은 컴파일이 2번 일어난다. C++ 템플릿은 사용하지 않으면 컴파일하지 않는다. 하지만, C# 제네릭은 사용하지 않더라도 그에 관련된 정보를 저장하기 위한 메타데이터가 생성된다. 제네릭은 비형식 탬플릿 ...
Heap 구조체 우선순위 큐를 위해 만들어진 자료구조 여러 값들 중 최솟값이나 최댓값을 빠르게 탐색하기 위한 자료구조 반정렬 상태를 유지 작은 값은 하위, 큰 값은 상위에 있는 정도 이진 트리와는 달리, 중복된 값을 허용 이진 트리에서 특정한 조건을 갖춘 구조체 트리의 높이 h가...
Adaper 패턴 인터페이스를 제공함으로써 호환되지 않는 원본 인터페이스를 이용할 수 있게 함 라이브러리의 업데이트 및 교체에 유연하게 대처할 수 있음
서로 참조하는 shared_ptr 순환 참조하는 shared_ptr은 사용하지 않는데도 자동으로 메모리 해제 불가
자원 관리를 못하는 순간
shared_ptr 여러 개의 스마트 포인터가 하나의 객체를 같이 소유해야하는 상황 하나의 자원을 몇개의 포인터가 가리키는지 추적하는 포인터 control block을 할당하여 복사를 허용 각 shared_ptr 객체에 저장되는 것이 아니라 실제 객체를 가리키는 control block을 할당 객체를 가리키는...
완벽한 전달 perfect forwarding wrapper 함수가 필요한 경우
move semantic
예외란? 정상적인 상황에서 벗어난 모든 예외적인 상황들
decltype 식별자 표현식이 아닌 식을 인자로 받고, 그 타입을 T라고 했을 때 식의 값이 xvalue인 경우 -> T&& 를 리턴 식의 값이 lvalue인 경우 -> T& 를 리턴 식의 값이 prvalue인 경우 -> T 를 리턴 decltype...
final
암시적 변환(implicit conversion)
mutable 사용 예시
map 레드 블랙 트리 기반 검색속도가 빠른 Binary Search Tree(BST) + Self-Balancing 기능을 추가 O(logN)을 보장하는 수준으로 Balancing 키 값의 분포가 고르지 못할 경우 node rotation에 대한 비용이 계속 발생하기에 Insert / Delete 성능이...
Procedural Programing (절차적 프로그래밍) 데이터를 중심으로 함수를 만들어 사용 프로그램이 함수화 되어 순차적으로 처리 프로그램 전체가 유기적으로 연결 장점 컴퓨터의 처리구조와 유사해 실행속도가 빠름 단점 유지보수가 어려움 실행 순서가 정해져 있으므...
Texture 사이즈를 2의 제곱수로 세팅하는 이유 오늘날 대부분의 GPU는 이러한 제약으로부터 자유롭다 (NPOT) RAM을 사용할 때 NPOT 이미지는 그보다 큰 사이즈의 POT로 확장된다 이 과정에서 메모리는 낭비된다 확장된 사이즈만큼 가장자리에 edging artifact가 발생할 수 있다 ...
함수 호출 비용 함수 호출될 때마다 일정량의 성능 오버헤드 발생 CPU가 다른 레지스터와 함께 실행 중인 현재 명령어의 주소를 저장해야 힘 나중에 반환할 위치를 알 수 있도록 모든 함수 매개 변수를 생성 새 위치로 분기하기 보다 내부 작성 코드(인스턴트 코드)가 더 빠름
Callback 함수 다른 프로그램 또는 다른 모듈에서 호출될 함수를 알려주고, 그 함수를 호출하도록 하는 방법 일반적으로 OS가 호출할 어플리케이션의 함수를 지정해 특정한 사건 / 메세지가 발생하면 호출하도록 지정 일반 함수 호출 클라이언트에서 서버의 함수를 호출하여 사용 콜백 함수 호출 ...
friend class 한 class에서 다른 class의 field를 public으로 참조하도록 허용
컨테이너의 종류 Sequence Container 객체를 순차적으로 보관 ex) vector, list, queue, … Associative Container 키를 바탕으로 대응되는 값 함께 보관 키로 탐색하여 값을 반환 ex) map, set, unord...
템플릿(Template)이란 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 틀 함수 템플릿(Function Template)와 클래스 템플릿(Class Template)으로 분류
Binary Search 이미 정렬되어 있는 데이터를 대상으로 탐색 중간 값인 pivot을 기준으로 left와 right으로 나누어 탐색 값을 찾을 때까지 위의 과정을 반복
Overloading 같은 이름의 메서드를 여러 개 정의 매개변수의 타입이 다르거나, 갯수가 다름 리턴 타입이나 접근 제어자는 영향을 주지 않음
Bubble Sort
if 가장 위 if 구문부터 시작해 조건이 충족되는지 컨디션 체크 느린 속도 if, else if 가 많아질수록 Assembly: CMP도 많아짐 범위 식도 체크 가능
enum과 enum class의 차이
Shallow Copy 객체를 복사할 때 원래값과 복사된 값이 같은 참조를 가리키고 있는 것 객체의 ‘값’만 복사
복사 생략 Copy Elision
초기화 (Initialization) ```c++ // Must initialize the reference at the first int& ra; // Wrong int& ra = a; // Correct
Read-Only 변수의 값을 변경할 수 없다 메서드에서 클래스의 멤버 변수를 변경할 수 없다
함수의 작동
An integer int a;
함수의 static 변수 함수 안에서 선언된 static 변수 값이 고정됨 multi-thread hardware interrupt timer
C의 malloc과 C++ new의 차이
Class의 사이즈
C/C++ 메모리 레이아웃 Text segment 기계어로 변환된 실행코드가 메모리 or obj에 저장
static_cast 논리 형변환 주로 Scalar Type들 간의 캐스팅 형 변환 함수가 정의되어 있으면 이 함수를 호출하면서 실행 연산자 오버로딩을 통하여 변환 가능한 자료형을 추가할 수 있다 컴파일 타임에서 캐스팅
Painter’s Algorithm 각 object마다 고유 색깔을 지정 offline buffer (screen에 노출되지 않는 버퍼)를 기본 framebuffer size만큼 사용 Two pass 사용 picking pass (1st pass) offline color 버퍼에 고유 ...
Reflection
포워드 렌더링(Forward Rendering) 가장 보편적이고 일반적인 렌더링 방법 픽셀 당 쉐이딩과 라이팅 연산 값을 추가하는 방식 각 fragment shader에서 연산 빛의 개수 만큼 함 투명도 처리, 안티얼라이징 가능 라이팅 및 쉐이딩 연산 오버헤드
Light Source Type Point light
View에 따른 OpenGL Pipeline 분류
탬플릿 메소드 패턴(template method pattern) 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 다시 정의할 수 있게 해준다 base class가 알고리즘 구조의 주요 골조를 확립 subclass가 나머지...
빌더 패턴(Builder Pattern) 빌더 패턴은 객체 생성을 보다 유연하게 하기 위한 방법 중 하나 복잡한 기존 생성자를 별도로 실행한 뒤 조합 Builder 클래스를 이용해 각 파츠를 생성 후 조합 클래스는 Builder에 객체에 object 생성을 맡기고, 직접 수행하지 않음 한번에 모...
chrono C++11에서 추가된 시간 관련 라이브러리
string_view C++17부터 추가된 타입 문자열의 길이와 문자열에 대한 포인터만 가지고 있다 string 보다 훬씬 가볍다 null 종료 문자를 가지지 않는다
람다 함수 lambda 이름 없는(익명의) 함수 객체
memcpy destination 주소값, source 주소값, source의 길이를 인자로 받는 함수 sdource의 값을 destination으로 복사
Base class
var in C#
Initialization 어떤 객체든 객체의 데이터 멤버는 생성자의 본문이 실행되기 전 초기화되어야 한다
임시 값 할당 인자 C++ 에서는 임시값을 const reference와 rvalue reference, 그리고 값으로서의 함수 인자로 받도록 허용한다 non-const reference 인자를 받는 함수는 함수 실행 중 인자를 수정하고서 변경된 상태로 다시 caller로 돌아가는 것을 허용한다
발생 이유 Stack 메모리의 크기는 스레드가 초기화될 때 고정된 크기로 결정 사용량을 초과하여 사용한다면 소프트웨어는 undefined behavior 야기 Stack 영역의 메모리가 지정된 범위를 넘어갈 때 발생 한 함수에서 너무 큰 지역 변수를 선언 함수를 재귀적으로 무한정...
RTTI란 C++ 컴파일러 내에 있는 객체의 타입 정보를 알아내는 기능 런타임에서 포인터가 가리키는 객체의 타입을 알 수 있게 해주는 방법 객체의 타입을 런타임에서 결정할 수 있도록 허용 메모리 상주 객체에 타입 정보 추가 런타임에서 객체의 캐스팅이 유효한지 알아내기 위해, 객체를 특정 타입으로 결정한...
다중 상속 Multiple Inheritance C++에서는 C#과 다르게, 다중 상속을 허용 기반 클래스의 멤버 또는 메서드의 이름이 동일한 경우 주의해야 한다
DFS Depth-Frist Search 현재 분기를 완벽하게 탐색한 뒤 다음 분기로 이동 현재 노드와 인접한 노드를 우선 탐색 더 이상 인접한 노드가 없을 때까지 반복 그래프 내에 cycle 여부를 확인할 때 사용
new/delete를 사용하지 않는 이유? 기능의 과도한 범용성 메모리 할당 너머의 hidden behavior 수행 불충분한 기능
C++ Template vs. C# Generic C++ 은 컴파일이 1번 일어나고, C# 제네릭은 컴파일이 2번 일어난다. C++ 템플릿은 사용하지 않으면 컴파일하지 않는다. 하지만, C# 제네릭은 사용하지 않더라도 그에 관련된 정보를 저장하기 위한 메타데이터가 생성된다. 제네릭은 비형식 탬플릿 ...
Heap 구조체 우선순위 큐를 위해 만들어진 자료구조 여러 값들 중 최솟값이나 최댓값을 빠르게 탐색하기 위한 자료구조 반정렬 상태를 유지 작은 값은 하위, 큰 값은 상위에 있는 정도 이진 트리와는 달리, 중복된 값을 허용 이진 트리에서 특정한 조건을 갖춘 구조체 트리의 높이 h가...
서로 참조하는 shared_ptr 순환 참조하는 shared_ptr은 사용하지 않는데도 자동으로 메모리 해제 불가
자원 관리를 못하는 순간
shared_ptr 여러 개의 스마트 포인터가 하나의 객체를 같이 소유해야하는 상황 하나의 자원을 몇개의 포인터가 가리키는지 추적하는 포인터 control block을 할당하여 복사를 허용 각 shared_ptr 객체에 저장되는 것이 아니라 실제 객체를 가리키는 control block을 할당 객체를 가리키는...
완벽한 전달 perfect forwarding wrapper 함수가 필요한 경우
move semantic
예외란? 정상적인 상황에서 벗어난 모든 예외적인 상황들
decltype 식별자 표현식이 아닌 식을 인자로 받고, 그 타입을 T라고 했을 때 식의 값이 xvalue인 경우 -> T&& 를 리턴 식의 값이 lvalue인 경우 -> T& 를 리턴 식의 값이 prvalue인 경우 -> T 를 리턴 decltype...
final
암시적 변환(implicit conversion)
mutable 사용 예시
map 레드 블랙 트리 기반 검색속도가 빠른 Binary Search Tree(BST) + Self-Balancing 기능을 추가 O(logN)을 보장하는 수준으로 Balancing 키 값의 분포가 고르지 못할 경우 node rotation에 대한 비용이 계속 발생하기에 Insert / Delete 성능이...
Procedural Programing (절차적 프로그래밍) 데이터를 중심으로 함수를 만들어 사용 프로그램이 함수화 되어 순차적으로 처리 프로그램 전체가 유기적으로 연결 장점 컴퓨터의 처리구조와 유사해 실행속도가 빠름 단점 유지보수가 어려움 실행 순서가 정해져 있으므...
함수 호출 비용 함수 호출될 때마다 일정량의 성능 오버헤드 발생 CPU가 다른 레지스터와 함께 실행 중인 현재 명령어의 주소를 저장해야 힘 나중에 반환할 위치를 알 수 있도록 모든 함수 매개 변수를 생성 새 위치로 분기하기 보다 내부 작성 코드(인스턴트 코드)가 더 빠름
Callback 함수 다른 프로그램 또는 다른 모듈에서 호출될 함수를 알려주고, 그 함수를 호출하도록 하는 방법 일반적으로 OS가 호출할 어플리케이션의 함수를 지정해 특정한 사건 / 메세지가 발생하면 호출하도록 지정 일반 함수 호출 클라이언트에서 서버의 함수를 호출하여 사용 콜백 함수 호출 ...
friend class 한 class에서 다른 class의 field를 public으로 참조하도록 허용
컨테이너의 종류 Sequence Container 객체를 순차적으로 보관 ex) vector, list, queue, … Associative Container 키를 바탕으로 대응되는 값 함께 보관 키로 탐색하여 값을 반환 ex) map, set, unord...
템플릿(Template)이란 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료 형으로 사용할 수 있도록 하게 만들어 놓은 틀 함수 템플릿(Function Template)와 클래스 템플릿(Class Template)으로 분류
Binary Search 이미 정렬되어 있는 데이터를 대상으로 탐색 중간 값인 pivot을 기준으로 left와 right으로 나누어 탐색 값을 찾을 때까지 위의 과정을 반복
Overloading 같은 이름의 메서드를 여러 개 정의 매개변수의 타입이 다르거나, 갯수가 다름 리턴 타입이나 접근 제어자는 영향을 주지 않음
Bubble Sort
if 가장 위 if 구문부터 시작해 조건이 충족되는지 컨디션 체크 느린 속도 if, else if 가 많아질수록 Assembly: CMP도 많아짐 범위 식도 체크 가능
enum과 enum class의 차이
Shallow Copy 객체를 복사할 때 원래값과 복사된 값이 같은 참조를 가리키고 있는 것 객체의 ‘값’만 복사
복사 생략 Copy Elision
초기화 (Initialization) ```c++ // Must initialize the reference at the first int& ra; // Wrong int& ra = a; // Correct
Read-Only 변수의 값을 변경할 수 없다 메서드에서 클래스의 멤버 변수를 변경할 수 없다
함수의 작동
An integer int a;
함수의 static 변수 함수 안에서 선언된 static 변수 값이 고정됨 multi-thread hardware interrupt timer
C의 malloc과 C++ new의 차이
Class의 사이즈
C/C++ 메모리 레이아웃 Text segment 기계어로 변환된 실행코드가 메모리 or obj에 저장
static_cast 논리 형변환 주로 Scalar Type들 간의 캐스팅 형 변환 함수가 정의되어 있으면 이 함수를 호출하면서 실행 연산자 오버로딩을 통하여 변환 가능한 자료형을 추가할 수 있다 컴파일 타임에서 캐스팅
GC 기본사항 CLR에서 자동 메모리 관리 역할을 하기 위해 GC를 둔다 사용자는 메모리 해제 등 관리 작업을 위한 코드를 작성하지 않아도 된다 메모리 누수 및 메모리 반환, 해제된 메모리에 접근 등 문제를 해결 GC에 의해 효율적으로 메모리를 할당
Value Type 값이 바로 할당되는 타입 직접 값을 가지고 있다 int, float, char 등이 이에 해당한다 System.ValueType으로부터 상속
Virtual Table의 구조 C#에서 모든 클래스는 System.Object 클래스에서 상속되므로 VTable을 갖는다 기본적으로 ToString, Equals, GetHashCode, Finalize 메서드를 VTable에 갖는다 Base클래스가 가상 메서드가 없다면 이외의 메서드들은 VTable Slo...
추상적 자료형 ADT 자료 자체의 형태와 연산을 수학적으로만 정의한 것
Value type이면 모두 stack에 저장된다? Value type은 stack에 저장될 수 있다 항상 stack에 저장되는 것은 아니다 프로그래머는 특정 객체에 대해 stack에 저장되는지 heap에 저장되는지를 알아야할 필요가 있었다 사용자에게 노출되지 않은 상태로 메모리를 관리하는...
닷넷 프레임워크
Struct 값 타입 allocation 및 deallocation 시 참조 타입보다 소요가 적다 stack에 저장 nested struct 구조인 경우 inline member들은 private by default
string vs String
값 형식 vs. 참조 형식
Difference between Array, ArrayList, List Array
static const in C++
예시 case 1
readonly vs. const
동적 형식 dynamic 변수 및 해당 멤버에 대한 참조 사용에 대한 컴파일 타임 검사를 패싱 런타임에서 확인 대부분의 상황에서 object 처럼 동작 그러나 컴파일러가 형식을 검사하지 않은 상태 컴파일 타임을 거치며 object 타입으로 변환 런타임에서 dynamic...
Event 한 object에 의해 어떤 action이 발생했음을 알리는 notification .NET에서는 observer design pattern을 사용
TryGetValue vs. ContainsKey? ```csharp // key가 있는지 체크 public bool ContainsKey(TKey key) { return (this.FindEntry(key) >= 0); }
default 연산자 default 키워드는 해당 변수 타입의 기본 또는 빈 상태를 반환 참조 형식(class, delegate, …)의 default 값: null 값 형식 (struct, enum, …)의 default 값: all-zeroes value int 0, DateTime 0001-01-01 00:00:0...
Managed vs. Unmanaged Code Unmanaged code란 컴퓨터 구조, 프로세서에 특화되어 그에 의존하는 코드 C#에서는 unsafe 키워드를 이용하는 코드 프로그래머에 의해 직접 관리 Managed code란 .NET 프레임워크에서 구동하는 C# 코드 자체 ...
lock 키워드 개체에 대한 뮤텍스를 획득하고 signal과 unlock을 실행
sealed 키워드 클래스에 적용된 경우 다른 클래스가 해당 클래스에서 상속하는 것을 막음
C# 포인터 C# 대부분의 코드는 확인할 수 있는 안전한 코드 .Net 도구에서 코드가 안전한지 확인 가능 원시 메모리를 할당하지 않고, 포인터로 직접 메모리에 엑세스하지 않음 경우에 따라 앱의 성능을 향상 포인터가 필요한 네이티브 함수를 호출하는 경우 필수 보안 및 안전성 이슈 발생...
Job System
동기와 비동기 동기 어떤 operation을 실행시켰을 때 결과값이 도출될 때까지 프로그램은 멈춰서 기다려야 함 비동기 언제 값이 도출될 지 보장할 수 없고, 그 동안 프로그램은 다른 프로세스를 진행할 수 있음 async / await는 위 중 비동기 프로그래밍을 위해 사...
확장 메서드란 기존 제공되는 클래스/구조체/인터페이스의 구현을 직접 변경하지 않고 기능을 확장해 사용 기존 데이터 타입 (int, float 등)의 class에도 적용 가능
물음표 연산자 두개가 연속적으로 쓰이는 예시
Property 정보은닉을 더 간결하고 간단하게 구현하도록 허용 get / set 메서드를 대신해 가독성을 보완
partial 키워드 C#에서는 C/C++와 달리 cs 파일 하나에 클래스 선언과 정의가 작성 클래스가 커질 경우 가독성이 떨어짐 Partial 키워드를 제공함으로써 여러 파일에 하나의 클래스를 작성하도록 허용 대리자(delegate) 또는 열거형(enum) 선언을 할 때 partial 한정자를 사용할 수 없음 ```csharp /...
byte와 char의 사이즈 byte: 1바이트 숫자 자료형 char: 2바이트 문자 자료형 1바이트 아님! 대부분의 .Net 언어의 문자열은 유니코드 utf-16을 디폴트로 지원
in 키워드 in 매개변수로 전달되는 변수는 메서드로 전달되기 전 반드시 초기화 인수가 참조로 전달되지만, 수정되지 않음 오버로딩 규칙 ```csharp class InOverloads { // 오버로딩 허용 public void SampleMethod(in int i) { } public void SampleMeth...
var 암시적 형식 컴파일러가 compile time에 자료형을 결정 제약 조건 지역 변수에만 사용 가능 변수 선언과 함께 초기화 필수 null / 익명 메서드 / 메서드 그룹으로 초기화 불가
Dictionary의 종류 Dictionary Key와 Value의 Pair를 갖는 자료구조 Generic 해시테이블 구조를 사용
리플렉션의 개념 일반적으로는 클래스를 통해 객체를 생성 사용자(프로그래머)는 클래스의 필드와 메서드를 알고 있고, 사용하는 데 불편함이 없다
as와 is 형변환을 위한 예약어 개발자에 의해서 의도적으로 downcasting하도록 도와주는 연산자 downcasting 베이스 클래스가 파생 클래스로 캐스팅 되는 것 upcasting 파생 클래스가 베이스 클래스로 캐스팅 되는 것
where 키워드 사용 예시
메서드에 선언된 new modifier base class의 메서드를 숨김 upcasting 하여 base class의 메서드를 사용할 수 있으나 이는 의도된 디자인에 반하는 행위이므로 위험
delegate(대리자) 키워드 delegate는 메서드를 다른 메서드에 인수로 전달하는 데 사용 형식이 일치하는 구조의 모든 메서드는 대리자에 할당할 수 있다 메서드는 정적/인스턴스일 수 있다. delegate 속성 함수 포인터와 유사하지만, 객체 지향적으로 인스턴스 및 메서드를 캡슐화한다. 메서드를 매개 변수로 전달할 수 ...
interface 특정 메서드들의 조합을 고려
데이터 직렬화란 직렬화의 개념을 검색해보면 보통은 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 방식으로 변환하는 것이라고 서술한다 나에게는 선뜻 와닿지 않는 설명이다
CI/CD 애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법 지속적 통합, 지속적 배포, 지속적 서비스 제공 이러한 프로세스를 CI/CD 파이프라인이라 하며, 애자일 방식의 협력을 통해 실행
CPU의 차이 레지스터의 bit 폭 차이 레지스터의 크기가 16bit이면 16bit CPU 레지스터의 크기가 64bit이면 64bit CPU
일급 객체 모든 요소는 함수의 실제 매개변수가 될 수 있다. 모든 요소는 함수의 반환 값이 될 수 있다. 모든 요소는 할당 명령문의 대상이 될 수 있다. 모든 요소는 동일 비교의 대상이 될 수 있다.
Waterfall 워터폴
Precompiled Header(미리 컴파일된 헤더) 헤더를 미리 컴파일 해두는 것 자주 변경되지 않는 긴소스를 미리 컴파일하여 컴파일 결과를 별도의 파일에 저장 다시 똑같은 헤더를 컴파일할 경우 해당 파일을 처음부터 컴파일하지 않고, 미리 컴파일된 헤더 파일을 사용해 컴파일 속도를 월등히 향상
Lua 스크립트 절차식 명령식 스크립트 언어 간단한 자료구조 : boolean, number, string, table 핵심 모듈의 크기가 120KB 이하 게임 개발에 자주 사용되는 Python에 비해 빠른 실행 속도를 가짐 오픈소스
정적 라이브러리(Static Link Library) 필요한 함수를 프로그램 코드에 붙여 컴파일 시 프로그램 자체에서 참조 (Compile-Time) lib 파일은 하나의 거대한 파일이 생성 재사용성이 떨어짐 어플리케이션 업데이트 시 새로운 버전으로 작성 다른 어플리케이션에 사용 불가 하지만 버전 ...
인코딩이란?* Encoding - 문자나 기호를 암호화하는 것 Decoding - 암호화를 해독하는 것, 복호화 인코딩과 디코딩은 정해진 기준에 따라 입력되고 해독해야 하는데, ASCII나 UNICODE와 같은 문자셋이 그것이다. Base64 인코딩은 8비트 이진 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문...
메모리 클럭 메인보드에서 발생하는 램 동작 주기 신호(MHz) 메모리 버스 폭 메모리 입출력 라인 개수(bit) 메모리 대역폭 Memory Clock * Memory bus width 한번의 클럭 신호를 통해서 처리할 수 있는 용량 GPU가 읽을 수 있는 데...
플래시 메모리 전기적으로 데이터를 지우고 다시 기록할 수 있는 비휘발성 메모리입니다.
반도체란? 전기적으로 도체와 부도체 사이의 성질을 띠고 있는 물질
Compiled Language CPU가 바로 이해할 수 있는 기계어로 소스코드를 변환 소스코드 처리와 분석에 많은 시간 소요 일반적으로 실행이 빠름 컴파일된 기계어는 플랫폼 의존적
컴포넌트란? 독립적, 교체에 용이하고, 재사용 가능한 기능들의 집합 다른 컴포넌트와 상호작용하기 위해 디자인된 소프트웨어 객체 기능을 수행하기 위한 목적이 있고 그에 맞는 인터페이스를 제공
개요 LLVM을 사용하여 IL을 고도로 최적화된 네이티브 코드로 변환하는 컴파일러
Update의 비용
SpriteRenderer 어떤 hierarchy에도 배치할 수 있다 Transform으로 조정한다 transparent geometry queue를 통해서 render된다 default material을 사용하는 경우 자동으로 최적 메쉬를 생성한다 draw call을 줄이기 위해 sprite at...
컴퓨터 프로그램을 만드는 방식 2가지
유니티의 Entity Component System
Gizmo 씬 뷰에서 편집이나 디버깅을 위해 오브젝트의 위치나 범위, 특정 요소를 가시화
DontDestroyOnLoad 새로운 Scene이 로드될 때, 자동으로 파괴되지 않는 target 오브젝트를 생성 새 레벨이 로드되면 Scene의 모든 오브젝트들은 파괴되고, 새 레벨의 오브젝트들이 로드된다. 레벨 스위치 중에 오브젝트를 보존하기 위해 DontDestroyOnLoad 사용 해당 오브젝트가 component이거나 gam...
이미지 압축 PNG/JPG 등으로 압축했더라도 GPU 메모리에 저장할 때는 압축이 풀린 상태로 저장 GPU가 이 파일을 그대로 읽어들일 수 없기 때문 대역폭 사용량에 초점을 맞춘 파일 형식 GPU가 텍스쳐로 쓰기 위한 압축 형식이 아님 가변 비율 인코딩을 수행하기 때문 ...
Frustum Culling Camera (View) Matrix Far/Near 값으로 조정 원거리 Culling objects의 부자연스러움 감추기 위해 Fog 사용
드로우콜 // OpemGL의 DrawCall glDrawArrays(); // vertices rendering glDrawElements(); // indices rendering CPU에서 그래픽 API 호출을 통해 GPU에 렌더링을 명령하는 것
SafeArea 모바일 해상도에서 전면 카메라 영역 침범하지 않게 보장해주는 영역 노치폰에 대해 ui 배치 대응을 위해 설정
에셋번들 유니티 프로젝트에 사용할 리소스들을 묶은 것 유니티에서 에셋 번들 생성 외부 스토리지(서버)에 저장 프로젝트의 런타임 중 번들을 다운로드 다운로드한 번들에서 개별 에셋을 로드해 사용
Canvas Unity에서 모든 UI 객체를 렌더링 하기 위한 루트 컴포넌트 기본적으로 4개의 컴포넌트를 포함 RectTransform Canvas Canvas Scaler Graphic Raycaster
9 Slicing 하나의 텍스쳐로 다양한 사이즈의 재사용 가능한 이미지로 설정하는 방법 리사이징 시, 이미지를 왜곡하지 않음
서브루틴(Subroutine) C언어 등에서 일반적으로 사용하는 함수 시작할 때 진입하는 지점이 하나 존재하고, 종료되는 지점을 설정할 수 있다. 서브루틴은 시작점과 종료점이 1개인 코루틴에 포함
Component란? GameObject 에 부착되는(Attached) 모든 것들이 상속받는 기반 클래스. MonoBehaviour 는 Unity 의 모든 스크립트가 상속받는 클래스 사용자가 Unity 엔진의 작동 방식을 이해하지 못하더라도 코드를 작성할 수 있도록 미리 만들어 둔(built-in) Behaviour 클래스이자 스크립트 명...
check 사용 케이스 DO_CHECK = 1인 경우 매크로 내부를 실행 데스트 실패 시 중단점 체크 + 크래시 리포터 DO_CHECK = 0인 경우 매크로를 무시한다
Bit field 선언
FORCEINLINE과 inline 일반적인 inline 키워드를 사용했을 때, 컴파일러는 해당 구문을 inline화 할지 여부를 스스로 결정한다 하지만 __forceline 키워드는 컴파일러의 판단여부와 무관하게 무조건 inline화 하도록 강제한다 __forceinline은 VS 컴파일러에서 제공하는 non-standa...
BlueprintPure 함수를 블루프린트에 노출시킬 때, 이 함수가 OwnerObject에 아무 영향을 주지 않는 것을 보장하는 키워드 Gettor의 성격을 가진다
Transient 언리얼 오브젝트는 직렬화 기능으로 오브젝트의 UPROPERTY 매크로로 속성을 저장 및 로딩할 수 있다 이를 테면, CurrentHP와 같은 값은 게임을 시작할 때마다 변경되므로 이 값을 저장 또는 로딩하는 것은 디스크 낭비다 이런 속성에 Transient 키워드를 추가해 직렬화 대상에서 제외할 수...
UFUNCTION Overload UFUNCTION 함수는 Overload 할 수 없다 만약 Overload 필요하다면 UFUNCTION 키워드를 제거하고 사용해야 한다 UHT가 Unreal Function을 등록하기 위해서 Iterate 할 때, 헤더 파서가 확인하는 것은 함수의 이름 뿐 ...
```c++ UCLASS(BlueprintType, Deprecated) class CLIENT_API UDEPRECATED_CameraBehaviorDataAsset: public UDataAsset { GENERATED_BODY()
FName 텍스트에 대소문자 구분을 하지 않는다
Reflection 프로그램이 런타임, 그러니까 실행중에 자기 자신의 구조를 검사하고 조작할 수 있는 능력 일반적인 C++에서는 컴파일 시점에 모든 정보가 결정되고, 컴파일된 상태의 C++ 언어는 CPU로 전달된다 어떤 class A가 어떤 멤버 변수 혹은 함수를 가지고 있는지 알 수 없다 리플랙션이 지원되는 언...
Garbage Collection
UCLASS와 USTRUCT의 차이? 각 매크로는 Reflection 시스템에 클래스와 구조체를 등록하는 데 사용한다 Unreal Editor가 사용자 정의의 클래스 또는 구조체를 인식하기 위한 방법이다 메모리 관리 시스템에 포함시켜 Garbage Collection할 수 있도록 한다 UHT(Unreal ...
Hard Reference
UObject UObject는 Unreal Engine에서 가장 기본이 되는 객체다 UCLASS 매크로 선언으로 UObject를 관리하는 시스템이 이를 인식한다 Reflection System을 통해 Garbage Collection을 수행하는 등의 역할 모든 언리얼 오브젝트는 실행 초기의 런타임 과정에서...
Class Default Object (CDO) 언리얼 오브젝트의 기본 세팅 상태를 지정 기본 탬플릿 오브젝트 Master copy UClass, 리플렉션 시스템에서 작동하기 위해 고안된 클래스에서 이 정보를 포함한다 C++ 언어 차원에서 제공하지 않는 리플렉션 기능을 위 방법을...
기본적인 Actor의 라이프 사이클
언리얼에 매크로를 사용하는 이유 언리얼 C++ 코드는 Unreal Header Tool, UHT Preprocessor라 불리는 커스텀 RTTI를 사용한다 이런 매크로가 달린 코드는 일반적인 C++ 매크로와 달리 더 낮은 레벨에서 작동하며 관리된다 이 매크로들은 RTTI, Reflection 등 작동을 위해 메타 데이터를 생성한다
조건부 Input 트리거 IMC에서 설정하는 Input Trigger를 커스텀하게 추가할 수 있다
Component를 다른 타입으로 교체
마우스로 인게임 오브젝트를 Hover하거나 Select 해야하는 상황 보통은 이 경우에 Screen 좌표상에서 InGame World로 Deprojection을 통해 Ray를 쏴서, 해당 Ray에 Hit되는 첫번째 Object를 반환하는 것 같다 Select야 Mouse 클릭할 때만 하면 된다지만, 이 방식대로라면 Hover는 매번 Ray를 ...
NU1902: 보안 취약성에 대한 패키지 종속성 감사 딱히 영향을 줄만한 변경점이 없었는데 갑자기 nuGet쪽 취약성으로 인해 빌드 머신에서 빌드가 안되는 현상이 발생했다 어처구니 없는 건, 문제가 되는 패키지들이 전부 최신 버전이라는 것… 근본적인 해결 방법은 찾지 못했지만, 일단은 취약성 경고를 에러로 처리하는 ...
갑자기 든 의문
문제 상황 언리얼 엔진 5.4 버전에서 Projectile Movement Component 사용 시, 전 게임에 걸쳐서 액터들의 Collision Response가 오염되는 현상
Session Search 안되는 현상
Widget은 어디에 붙여야 하나 어떤 Widget은 World 위치를 투영해 Screen 상에 표기하는 게 더 낫다 게임에서 한 번에 단 하나의 상호작용만 가능하고 고정된 위치에 표기한다면, 상호작용 Widget은 Screen에 상시 존재하고 필요할 때마다 노출하는 것이 낫다 락온 UI라든가, 원거리 무기류 장착 ...
Game Feature
Unity Build C / C++의 프로젝트를 컴파일 할 때, 여러 translation unit을 하나로 뭉쳐서 빌드하는 방식 Unity 엔진과는 전혀 무관하다
멀티플레이어 게임 멀티플레이어 게임에서는 동일한 게임이 여러 인스턴스에서 동시에 실행되어야 한다. 공유된 세계에 대해 일관된, 동일한 그림을 그려내야 한다
노드로 접기 블루프린트 노드를 디자인하다가 커다란 그래프를 하나로 묶어 정리하는 기능
Blueprint란? Unreal 엔진에 내장된 컴파일식 비주얼 스크립팅 시스템 하나의 프리팹 혹은 아키타입으로 정의하는 단위일 수도 있다
Unreal vs. Unity
미키마우스, 곰돌이 푸, 알라딘 등 디즈니 캐릭터와 함께 하는 3매치 퍼즐 게임
커스텀 3D 프레임워크 - v2
SF 테마의 2.5D 플랫포머 슈팅 게임
Grid Base 맵에서 각 레이어의 정보를 통해 두 에이전트의 술래잡기 데모 구현
Python을 이용해 데이터 사이언스 알고리즘 및 기술을 구현, 데이터 샘플을 분석
DigiPen 학생들이 학기 수강 계획을 세울 수 있도록 도와주는 웹 어플리케이션
무력감과 비극적인 분위기의 1인칭 호러 게임
OpenGL과 GLSL을 이용해 3D Graphics 테크 데모 구현
게임 프로젝트 수업에 사용될 게임 엔진 개발
2D 탑다운 시점의 강력한 타격감을 제공하는 액션 잠입 게임
커스텀 3D 프레임워크
플레이 자유도에 초점을 맞춘 2D 슈팅/경영 게임
2D 사이드 스크롤링, 몽환적이고 어두운 분위기의 퍼즐 게임
2D 플랫포머, 미스터리/SF 테마의 퍼즐 게임
Show Bone 커맨드 사용 시 크래시 이슈 애니메이션 파트 쪽에서 showbone 커맨드 입력 시 크래시가 발생한다는 문의가 들어왔다 확인해보니, 아래 부분에서 index 개수 차이로 발생하는 문제였다
캐릭터가 Random한 Idle Animation을 출력하게 하고 싶어요
Control Rig를 적용한 상태에서의 R&D
Possess 아닌 탈 것 탑승 기능 구현
Motion Matching 개념 현재 캐릭터의 동작과 상태를 기준으로, 가장 적절한 다음 동작을 선택하는 로직 ABP의 StateMachine과 BlendSpace를 대체 가능 자연스러운 Blend를 위한 작업 Cost 감소 여러 상황에 대응되는 애니메이션 에셋이 여러 개 있고, 테이블이 이 애니...
Linked Anim Layer 하나의 AnimBP에서 캐릭터가 필요한 모든 상태 관리를 할 수도 있다 하지만 동일한 상태에 대해 다른 애니메이션, 다른 로직이 필요하다면? 캐릭터가 그냥 달리는 애니메이션과, 무기를 들고 달리는 애니메이션이 달라야 한다면? State Machine 구조는 동일한데 애니메이...
문제 상황 ALS 캐릭터 액터의 Scale을 늘렸을 때, 캐릭터의 로코모션 애니메이션의 PlayRate가 보정되지 않는 현상 발이 미끄러지는 현상 발생
Mover 기존의 Character Movement Component를 대체할 목적의 언리얼 공식 플러그인 포스트 작성일 기준으로 아직 Experimental Mover 1.0이 나오자마자 곧바로 CMC 지원을 끊을 계획은 없고 장기적으로 대체할 것이라 한다 언리얼 캐릭터의 기본적인 Movement...
Braking Friction
Biped Movement 직립 2족 보행 플러그인은 ALS plugin으로 디테일을 표현할 수 있다 Unreal에서 공식적으로 지원하는 Motion Matching 플러그인도 있다 그렇다면 4족 보행은?
루트 모션 사용 여부에 따른 차이
IK와 FK FK Rig Forward Knematics Parent가 움직이면 Child도 종속되어 애니메이션이 작동 팔꿈지를 위아래로 흔들면 손, 손가락도 따라 움직이는 원리
SF 테마의 2.5D 플랫포머 슈팅 게임
Grid Base 맵에서 각 레이어의 정보를 통해 두 에이전트의 술래잡기 데모 구현
Python을 이용해 데이터 사이언스 알고리즘 및 기술을 구현, 데이터 샘플을 분석
DigiPen 학생들이 학기 수강 계획을 세울 수 있도록 도와주는 웹 어플리케이션
무력감과 비극적인 분위기의 1인칭 호러 게임
OpenGL과 GLSL을 이용해 3D Graphics 테크 데모 구현
게임 프로젝트 수업에 사용될 게임 엔진 개발
2D 탑다운 시점의 강력한 타격감을 제공하는 액션 잠입 게임
플레이 자유도에 초점을 맞춘 2D 슈팅/경영 게임
2D 사이드 스크롤링, 몽환적이고 어두운 분위기의 퍼즐 게임
2D 플랫포머, 미스터리/SF 테마의 퍼즐 게임
캐시 Cache CPU가 빠른 속도가 데이터를 주고 받을 수 있도록 도와주는 메모리 Locality of Reference 원리에 따라 메모리 저장소의 데이터를 미리 가져와 보관
메모리(RAM) 점유율의 상승하면? 메인 드라이브에 가상메모리 영역을 설정 해당 영역을 메모리처럼 사용 낮은 단계에 가상 메모리가 잡힐수록 엑세스 속도가 느려짐 이 같은 이유로 RAM 메모리가 많을수록 좋다는 것
Synchronization 동기화 복수 이벤트의 유연한 실행 및 조화를 위해 조정을 가하는 것 구속 조건은 아래와 같다 Serialization: 하나의 이벤트가 끝난 다음에 다른 이벤트가 발생 Mutual Exclusion: 두 개의 이벤트가 한 시점에 동시에 발생하고 있지 않음
lock-base 코드의 몇가지 문제점 lock 순서를 제대로 관리하지 않으면 데드락의 가능성 priority inversion - 낮은 우선 순위의 스레드가 진행되기 위해 높은 순위의 스레드 락을 요구하는 경우 atomic한 operation이 오래 걸리는 경우, 다른 스레드들은 기다려야 함
개요 프로세스란 메모리 상에 실행되고 있는 프로그램 프로그램 - 작업을 위해 실행할 수 있는 파일
메모리 관리 프로그램을 실행하기 위해 모든(또는 일부) 실행 구문과 데이터의 전부(또는 일부)은 메모리 안에 있어야 함 CPU가 유저 작업에 반응하고 최적화하기 위해 어떤 데이터를 메모리 안에 넣을지를 정하는 작업 Activities: 어떤 메모리가 쓰이는지, 누구에 의해 사용되는 지를 트래킹 어떤 프로세스,...
스케줄링 프로세스가 실행되기 위하여 OS 스케줄러에 의해 자원을 할당받는 것 User processes System processes
OS란? 사용자와 컴퓨터 하드웨어를 매개해주는 중간 프로그램 프로그램을 실행시켜주고 사용자가 문제를 쉽게 풀도록 도와줌 컴퓨터 시스템을 편리하게 사용토록 도움 컴퓨터 하드웨어를 더 효율적으로 사용하도록 도움 Resource Allocator 모든 리소스를 관리 제어 ...
인터럽트 (Interrupt) CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능 대부분의 컴퓨터는 한 개의 CPU를 사용 한 순간에는 하나의 일 밖에 처리할 수 없음 어떤 일을 처리하는 도중에 우선 순위가 급한 일을 처리해야하는 경우 발생
컴퓨터 시스템 구조 Four Components of a Computer System
저장장치 Storage 최소 단위는 bit 8 bits = 1 byte 컴퓨터 구조상 native unit of data는 word = one or more of bytes 32 bit or 64 bit 구조 주 메...
버퍼란? Buffer 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역
Translation 어떤 P1 (x, y)를 P2(x’, y’)로 이동 두 점 사이의 거리는 (Tx, Ty) x’ = x + Tx y’ = y + Ty
수직동기화 VSync 화면주사율과 게임 화면의 FrameRate를 동기화 모니터는 각각 고유의 주사율이 있다 60Hz는 1초에 60번 스크린을 업데이트 한다는 의미 하드웨어 고유의 제한 사항이므로, 프로그램 및 PC 성능과 무관 게임 프레임은 게임 Scene을 1초에 몇 번 그리는지를 의미 ...
Texture 사이즈를 2의 제곱수로 세팅하는 이유 오늘날 대부분의 GPU는 이러한 제약으로부터 자유롭다 (NPOT) RAM을 사용할 때 NPOT 이미지는 그보다 큰 사이즈의 POT로 확장된다 이 과정에서 메모리는 낭비된다 확장된 사이즈만큼 가장자리에 edging artifact가 발생할 수 있다 ...
Painter’s Algorithm 각 object마다 고유 색깔을 지정 offline buffer (screen에 노출되지 않는 버퍼)를 기본 framebuffer size만큼 사용 Two pass 사용 picking pass (1st pass) offline color 버퍼에 고유 ...
Reflection
포워드 렌더링(Forward Rendering) 가장 보편적이고 일반적인 렌더링 방법 픽셀 당 쉐이딩과 라이팅 연산 값을 추가하는 방식 각 fragment shader에서 연산 빛의 개수 만큼 함 투명도 처리, 안티얼라이징 가능 라이팅 및 쉐이딩 연산 오버헤드
Light Source Type Point light
View에 따른 OpenGL Pipeline 분류
프로토타입 패턴
관찰자 패턴 (감시자 패턴) 관찰자 패턴의 사례 MVC 패턴 C#의 event java의 라이브러리
Singleton 오직 한 개의 instance만을 갖도록 보장 전역 상태를 관리하는 클래스에게 필요
Adaper 패턴 인터페이스를 제공함으로써 호환되지 않는 원본 인터페이스를 이용할 수 있게 함 라이브러리의 업데이트 및 교체에 유연하게 대처할 수 있음
탬플릿 메소드 패턴(template method pattern) 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 다시 정의할 수 있게 해준다 base class가 알고리즘 구조의 주요 골조를 확립 subclass가 나머지...
빌더 패턴(Builder Pattern) 빌더 패턴은 객체 생성을 보다 유연하게 하기 위한 방법 중 하나 복잡한 기존 생성자를 별도로 실행한 뒤 조합 Builder 클래스를 이용해 각 파츠를 생성 후 조합 클래스는 Builder에 객체에 object 생성을 맡기고, 직접 수행하지 않음 한번에 모...
StateTree를 쓰면서 명심해야 할 점
가장 가까운 NavMesh 위치 탐색 ProjectPointToNavigation을 많이 사용한다
Behavior Tree Service Composite 혹은 Task에 Attach 되어 분기가 실행중인 동안 정의된 빈도로 실행 Blackboard 값 확인 및 업데이트 목적으로 사용 TaskNode를 통해서 업데이트 하기도 한다
Perception Component 주로 AI의 타겟 인지 및 해제를 관리하는 목적의 컴포넌트 자극(stimulus)을 인지하면서 호출하는 대표적인 delegate는 아래와 같다 OnPerceptionUpdated 자극을 처리하는 과정에서 자극을 제공한 모든 액터를 어레이로 받는다 ...
Parts of the AI Perception System Unreal은 AI Perception System을 통해 Actor가 무엇을 감지하는지, World의 어떤 부분을 감지할 수 있는지를 제어하게 해준다. 수집한 정보는 Event-driven system이 처리하면서 간단해지며 가벼운 비용만을 소모한다. 결과적으로 블루프린트 안에서 전범위에 ...
Navigation with AI 길찾기를 통해 주변 환경을 헤쳐나가는 건 AI의 기본이지만 단순히 A 지점에서 B 지점으로 이동하는 것은 마냥 쉬운 일은 아니다. 길찾기는 경로 탐색과 장애물 회피로 2 단계로 나눌 수 있다. 여기서 장애물이란 고정된 상태의 물체로 정의한다. 이런 장애물을 회피하기 위해 Navigation Mesh가 필요하다.
Blackboard / Behaviour Tree / AI Controller / Pawn 의 관계
BT를 사용하는 인스턴스의 데이터 캐싱 AI 캐릭터들이 BT를 사용하면서, 인스턴스 별로 가져야 할 데이터가 있다 Target과의 거리를 기록해두어야 한다든가.. Timer를 재기 위해 체크하는 현재 남은 시간이라든가.. 즉, 캐싱(Cache)을 해야 하는 데이터가 있을 것이다
Content Delivery Network 정의 지리적으로 분산된 여러 개의 서버 컨텐츠를 사용자와 가까운 서버에서 전송해 속도면에서 이득 중앙 서버에서 개별 사용자에게 컨텐츠를 전송하려면 트래픽 과부하 및 전송 속도, 시간 문제 발생 파일 복사본을 캐싱하여 각 데이터 센터에 저장
Host 네트워크에 연결된 모든 종류의 장치를 Node 노드 중 IP 주소(네트워크 주소)가 할당된 것들을 Host Host들끼리 데이터를 송수신한다 데이터의 송수신은 Host가 실행하는 Process가 수행
연결 지향 vs. 비연결 지향
프로토콜 Protocol 네트워크 환경 내 모든 기기가 서로 통신하며 데이터를 주고 받으려면, 각 기기에는 사전 협의된 통신 협약/규약이 필요 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계 신호 체계, 인증, 그리고 오류 감지 및 수정 기능을 포함 구현되는 방법은 독립적이나, 하드웨어 또는 소프트웨어 그리고...
HTTP HyperText Transfer Protocol HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜 Plain text로부터 JSON 데이터 및 XML과 같은 형태의 정보도 송수신 가능 보통은 클라이언트가 어떤 정보를 HTML 형태로 받고 싶은지, JSON 형태로 받고 싶은지 명시 ...
개념 동기 vs 비동기 처리해야 할 작업들을 어떠한 ‘흐름’으로 처리 할 것인가에 대한 관점 블로킹 vs 논블로킹 처리되어야 하는 (하나의) 작업이, 전체적인 작업 ‘흐름’을 막느냐 안막느냐에 대한 관점
네트워크 Network 컴퓨터 네트워크 또는 컴퓨터망은 노드들이 자원을 공유할 수 있게 하는 디지털 전기통신망의 하나
TCP란?(Transmission Control Protocol) 인터넷을 경유해 통신하는 연결 지향성 프로토콜 에러 체킹을 지원 데이터의 완전한 전송을 보장 패킷의 전송 순서를 보장 TCP는 FLOW CONTROL을 제공함
Skill Data
세이브 포인트 캠프라는 이름의 체크 포인트를 정의했다 던전 안에는 여러 캠프가 존재하며, 던전 진입 시 마지막으로 활성화 및 상호작용한 체크포인트의 위치로 스폰되어야 했다 멀티 상황에서 최대 4개의 스폰 포인트가 있고, 스폰 시 특정 애니메이션을 출력해야 했다
액션의 단위 Abl 플러그인을 사용하면서, 하나의 Abl이 캐릭터의 액션 단위로 정립되었다 Abl은 재생할 애니메이션, 그리고 이에 동반하는 효과 등을 여러 개의 AblTask로 구성했다. Abl 플러그인이 기본적으로 지원하는 Branch 기능을 통해, 하나의 Abl에서 다른 Abl로 Transition 할 수 있었다 ...
플레이어 캐릭터 사망
소프트타겟, 소프트락 개념
멀티 상황에서 필요한 정보 정의
플레이어 캐릭터의 행동을 제약하는 방법 플레이어가 특정 조건 및 상황에 따라 어떤 행동을 하지 못하게 해야하는 경우가 있다 마을에서 공격하지 못한다거나 빈사 상태인 경우에는 이동 이외에는 아무 것도 못한다거나 이런 경우 캐릭터의 행동이 어떻게 관리되는지에 따라 제어하는 방법이 다를 수 있다 ...
Gameplay Ability System (GAS) 캐릭터의 능력이나 속성 등을 관리할 수 있게 도와주는 프레임워크 캐릭터의 능력 또는 스킬의 구현 Gameplay Ability 액터의 수치화된 속성 관리 Atttibute 액터에 특정한 효과(Effect) 적용 ...
Influence Mapping 영향도 알고리즘 수치를 2d grid에 분산시켜 놓은 추상 디자인
Rubberbanding
공간 분할의 타입 Grid QuadTree/OctTree Waypoint graphs Coner graphs Circle-based waypoint graphs Navigation meshess
Finite-State Machine 기본적으로는 논리 회로를 설계하는 데에 쓰이는 수학적 모델 에이전트는 한 번에 단 하나의 state에만 머무를 수 있다 라우터로부터 에이전트가 메세지를 받고, 에이전트는 메시지를 해독하고 이에 따라 자신의 state를 변경한다 에이전트의 피드백은 router로 다시 전송된다
Boid (bird-oid object) 인공 생명체라는 의미 새처럼 모여 규칙에 따라 군집행동을 하는 각 개체
행동트리(Behavior Tree) 도식화했을 때 직관적이고 쉽게 디자인할 수 있음 런타임에서 테스트 또는 디버깅하기가 까다로움 행동 패턴을 계획한 대로 시행하는 모델(model of plan execution) FSM, HFSM을 구현할 때 상태가 많아지면 유지보수 및 가독성 면에서 사용성이 떨어지게 되는 단점을 보완했다고 한다 ...
무방향 그래프 Undirected Graph 방향이 없는 간선 각 간선은 양방향
Influence Mapping 영향도 알고리즘 수치를 2d grid에 분산시켜 놓은 추상 디자인
Rubberbanding
공간 분할의 타입 Grid QuadTree/OctTree Waypoint graphs Coner graphs Circle-based waypoint graphs Navigation meshess
Finite-State Machine 기본적으로는 논리 회로를 설계하는 데에 쓰이는 수학적 모델 에이전트는 한 번에 단 하나의 state에만 머무를 수 있다 라우터로부터 에이전트가 메세지를 받고, 에이전트는 메시지를 해독하고 이에 따라 자신의 state를 변경한다 에이전트의 피드백은 router로 다시 전송된다
Boid (bird-oid object) 인공 생명체라는 의미 새처럼 모여 규칙에 따라 군집행동을 하는 각 개체
행동트리(Behavior Tree) 도식화했을 때 직관적이고 쉽게 디자인할 수 있음 런타임에서 테스트 또는 디버깅하기가 까다로움 행동 패턴을 계획한 대로 시행하는 모델(model of plan execution) FSM, HFSM을 구현할 때 상태가 많아지면 유지보수 및 가독성 면에서 사용성이 떨어지게 되는 단점을 보완했다고 한다 ...
무방향 그래프 Undirected Graph 방향이 없는 간선 각 간선은 양방향
벡터의 한계 어떤 물체를 화면에 표현하려면 벡터만으로는 부족 벡터는 크기와 방향 성분만을 가짐 위치 정보가 필요 위치는 무엇으로 표현하는가? 점 point
크기 변환 벡터의 크기와 방향 중 크기만 변경하는 것 각 성분에 각 계수만큼의 크기를 곱해 양을 바꿈
선형 변환과 행렬 선형 변환이란 하나의 벡터 공간을 다른 벡터 공간으로 변환하는 함수 선형 변환을 정의하는 두 특성이 변환 후에도 벡터 공간의 조건을 그대로 만족하기 때문
행렬 Matrix m x n 행렬에서 m = n 이면 정방행렬 square matrix 이다 모든 요소가 0이면 영행렬 zeron matrix 이다 어떤 행렬의 행과 열을 뒤바꾸면 전치 행렬 transpose matrix라 한다 전치한 행렬이 원래 행렬과 같다면 대칭 행렬 symmetric matrix라 한다 ...
유클리드 공간 임의의 점과 다른 한 점을 연결하는 직선은 단 하나다 임의의 선분은 양 끝으로 얼마든지 연장할 수 있다 임의의 점을 중심으로 하고 임의의 길이를 반지름으로 하는 원을 그릴 수 있다 R은 실수로 이루어진, R^2은 2차원 공간, R^3는 3차원 공간을 의미
선형변환 (Linear Transformation) 대수학 미지수와 미지수를 사용하는 수학
Mass System
Update Rate Optimization 이슈
Pipeline State Object Cache 구식 API는 Draw Call 전에 관련 GPU 파라미터를 변경하기 위해 여러 번의 콜을 해야했다 Parameter A 업데이트 + Parameter B 업데이트 + … 최신 API는 PSO라는 GPU Parameter의 집합, 즉 GPU State를 패키징...
스태틱 메시와의 차이 기본적으로 스태틱 메시와의 큰 차이는 없다 나나이트 메시는 더 많은 수의 트라이앵글과 인스턴스를 처리할 수 있다 나나이트는 머티리얼을 굽지 않아도 된다 더 적은 메모리를 사용하며, 더 빠르게 렌더링된다 최적화되지 않은 나나이트 메시와 스태틱 메시를 비교할 때 디스크를 차지하는 용량은 비슷하나, ...
개요 Lumen Essential
ALS Plugin 카메라
문제 상황 카메라와 캐릭터 사이에 어떤 장애물이 있고, 시야를 가리는 오브젝트가 특정 타입인 경우 이 오브젝트를 투명화 시켜야 했다 그런데, 게임 내의 대부분의 레벨 액터는 Nanite Naterial을 사용 중이다
Custom Depth Pass
하드락 카메라 액션 게임에서 특정 적을 대상으로 락온을 걸 수 있다 이 때 카메라는 대상을 계속 추적한다
커스텀 3D 프레임워크 - v2
커스텀 3D 프레임워크
미키마우스, 곰돌이 푸, 알라딘 등 디즈니 캐릭터와 함께 하는 3매치 퍼즐 게임