본문 바로가기
ETC/Job

게임 클라이언트 프로그래머 직군 면접 준비 (6)

by Dev_카페인 2024. 2. 27.
반응형

게임 클라이언트 프로그래머 직군 면접 준비 (6)

 

데이터 베이스

여러 사람이 공유할 목적으로 체계화해 통합, 관리하는 데이터의 집합. 스프레드 시트와 기능은 거의 유사하지만 컴퓨터 언어로 제어가 가능하며 앱이나 웹을 통해 공유가 가능하여 전세계 누구나 데이터베이스에 접근하고 편집이 가능하다는 장점이 있음.

 

[데이터 베이스 특징]

1. 실시간 접근성(Real-Time Accessibility): 실시간 처리에 의한 응답이 가능해야 한다.

2. 계속적인 변화(Continuous Evolution): 새로운 데이터의 삽입(Insert), 삭제(Delete), 갱신(Update)로 항상 최신의 데이터를 유지한다.

3. 동시 공용(Concurrent Sharing): 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 한다.

4. 내용에 의한 참조(Content Reference): 데이터베이스에 있는 데이터를 참조할 때 사용자의 요구에 따른 데이터 내용으로 데이터를 찾는다.

 

[DBMS의 필수 기능]

정의 기능(DDL) : 모든 응용 프로그램들이 요구하는 데이터 구조를 지원하기 위해 데이터베이스에 저장될 데이터의 형(Type)과 구조에 대한 정의, 이용 방식, 제약 조건 등을 명시하는 기능

조작 기능(DML) : 데이터 검색, 갱신, 삽입, 삭제 등을 체계적으로 처리하기 위해 사용자와 데이터베이스 사이의 인터페이스 수단을 제공하는 기능

제어 기능(DCL) : 데이터베이스를 접근하는 갱신, 삽입, 삭제작업이 정확하게 수행되어 데이터의 무결성이 유지되도록 제어해야 함

 

[트랜잭션의 특성]

Atomicity(원자성) : 트랜잭션의 연산은 데이터베이스에 모두 반영되도록 완료(Commit)되든지 아니면 전혀 반영되지 않도록 복구(Rollback)되어야 함

Consistency(일관성) : 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환함

Isolation(독립성) : 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없음

Durability(영속성) : 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 함

 

[정규화]

논리적 설계단계에서 발생할 수 있는 종속으로 인한 이상 현상의 문제점을 해결하기 위해, 속성들 간의 종속 관계를 분석하여 여러 개의 릴레이션으로 분해하는 과정. 1NF-> 2NF -> 3NF -> BCNF -> 4NF -> 5NF -> 6NF

 

[스키마(Schema)]

외부 스키마(external schema) : 개별 사용자 입장에서 데이터베이스 구조를 기술한 것으로, 여러 형태의 외부 스키마가 존재한다. 이를 sub schema라고 부르기도 한다.

개념 스키마(conceptual schema) : 조직 전체 입장에서 통합된 데이터베이스를 기술한 것으로, 하나의 개념 스키마만이 존재한다. 이를 일반적으로 스키마라고 부른다.

내부 스키마(internal schema) : 저장장치 입장에서 전체 데이터베이스가 저장되는 방법을 명세한 것이다. 하나의 내부 스키마만이 존재한다.

 

[Key의 종류]

슈퍼 키(Super Key) : 테이블의 행을 고유하게 식별할 수 있는 속성 또는 속성의 집합

복합 키(Composite Key) : 2개 이상의 속성(Attribute)을 사용한 키

후보 키(Candidate Key) : 유일성과 최소성을 만족하는 키 (각 튜플을 유일하게 식별할 수 있는 속성의 집합)

기본 키(Primary Key) : 후보 키에서 선택된 키 (null 값 혹은 중복 값으로 가질 수 없음)

대체 키(Surrogate Key) : 후보 키에서 선택되지 않은 키

외래 키(Foreign Key) : 서로 다른 테이블 간의 관계를 맺어주는 키 (다른 테이블의 기본키를 참조)

 

[트랜잭션(Transaction)]

데이터베이스 내에서 한꺼번에 모두 수행되어야 할 연산들의 집합, 하나의 작업 처리를 위한 논리적 작업 단위

 

[이상(Anomaly)]

테이블 내에서 데이터 중복성에 의해 발생되는 데이터 불일치 현상

갱신 이상(Modification Anomaly) : 중복 데이터 중 일부만 수정되어 데이터 불일치가 일어나는 현상

삽입 이상(Insertion Anomaly) : 중복된 데이터 중 일부만 수정되어 데이터의 모순이 일어난 현상

삭제 이상(Deletion Anomaly) : 특정 정보 삭제 시 다른 정보까지 삭제되어버리는 현상

 

 

네트워크

 

[OSI 7계층]

물리 계층  데이터 링크 계층  네트워크 계층  전송 계층  세션 계층  표현 계층  응용 계층

데이터 링크 계층 : 신뢰성 있고 효율적인 정보 전송을 할 수 있도록 시스템 간 연결 설정과 유지 및 종료를 담당

네트워크 계층 : 개방 시스템들 간의 네트워크 연결을 관리하는 기능과 데이터의 교환 및 중계 기능을 함

전송 계층 : 종단 시스템 간에 투명한 데이터 전송을 가능하게 함

응용 계층 : TELNET, FTP, SMTP, SNMP, E-Mail 

전송 계층 : TCP, UDP 

인터넷 계층 : IP, ICMP, IGMP, ARP, RARP 

네트워크 액세스 계층 : Ethernet, IEEE 802, HDLC, X.25, RS-232C 

 

C++의 특징은 무엇인가요?

답변: C++은 객체지향 프로그래밍과 절차지향 프로그래밍을 모두 지원하는 고급 프로그래밍 언어입니다. 또한 강력한 추상화와 다형성을 제공하며, 메모리 관리를 직접적으로 다룰 수 있는 저수준 기능도 포함하고 있습니다.

C++에서 포인터와 레퍼런스의 차이는 무엇인가요?

답변: 포인터는 메모리의 주소를 저장하는 변수로, 해당 주소에 저장된 값을 간접적으로 조작할 수 있습니다. 반면 레퍼런스는 변수의 별칭으로, 기존 변수에 대한 참조를 제공하여 해당 변수를 직접적으로 조작할 수 있습니다.

C++에서의 클래스와 구조체의 차이는 무엇인가요?

답변: 클래스는 멤버 변수와 멤버 함수를 포함하는 사용자 정의 데이터 타입으로, 기본적으로 private으로 설정됩니다. 구조체는 클래스와 유사하지만, 기본적으로 public으로 설정되어 있는 멤버 변수만을 가질 수 있습니다.

가상 함수(Virtual Function)와 순수 가상 함수(Pure Virtual Function)의 차이는 무엇인가요?

답변: 가상 함수는 파생 클래스에서 재정의할 수 있는 멤버 함수로, 기본 구현이 있을 수 있습니다. 순수 가상 함수는 파생 클래스에서 반드시 재정의해야 하는 멤버 함수로, 기본 구현이 없으며 "= 0"으로 표시됩니다.

어떻게 C++에서 예외 처리를 할 수 있나요?

답변: C++에서는 try-catch 블록을 사용하여 예외를 처리할 수 있습니다. 예외가 발생할 수 있는 코드는 try 블록에 포함되고, 발생한 예외를 처리하는 코드는 catch 블록에 포함됩니다.

다형성(Polymorphism)이란 무엇인가요?

답변: 다형성은 하나의 인터페이스나 기본 클래스를 사용하여 다양한 자료형의 객체를 처리할 수 있는 능력을 말합니다. C++에서는 가상 함수와 포인터나 레퍼런스를 통해 다형성을 구현할 수 있습니다.

메모리 누수(Memory Leak)가 무엇이며, 어떻게 방지할 수 있나요?

답변: 메모리 누수는 동적으로 할당된 메모리를 해제하지 않아 발생하는 문제로, 프로그램이 실행되는 동안 메모리 사용량이 계속 증가하여 시스템의 성능을 저하시킬 수 있습니다. 메모리 누수를 방지하기 위해서는 동적 할당된 메모리를 사용한 후에는 반드시 해제해야 합니다.

C++에서의 다중 상속(Multiple Inheritance)이란 무엇이며, 어떤 문제점이 있나요?

답변: 다중 상속은 클래스가 두 개 이상의 클래스로부터 상속받는 것을 의미합니다. 이는 다양한 기능을 상속받을 수 있지만, 다이아몬드 문제와 같은 문제점을 야기할 수 있으며, 클래스 간의 관계가 복잡해질 수 있습니다.

C++에서의 템플릿(Template)이란 무엇이며, 어떻게 사용하나요?

답변: 템플릿은 클래스나 함수를 일반화하여 다양한 데이터 타입에 대해 동작할 수 있도록 하는 기능을 말합니다. 템플릿을 사용하여 특정한 데이터 타입에 의존하지 않고 범용적인 코드를 작성할 수 있습니다.

C++에서의 스마트 포인터(Smart Pointer)란 무엇이며, 왜 사용하나요?

답변: 스마트 포인터는 동적으로 할당된 메모리를 관리하는데 사용되는 객체로, 메모리 누수를 방지하고 안전하게 메모리를 해제하는 데 도움을 줍니다. 주로 unique_ptr, shared_ptr, weak_ptr과 같은 스마트 포인터가 사용됩니다.

Move semantics(이동 의미론)이란 무엇이며, 어떻게 사용하나요?

답변: Move semantics는 객체의 소유권을 전달하거나 이동시키는 기법으로, 객체의 데이터를 복사하는 대신 해당 데이터의 소유권을 이동시켜 성능을 향상시킬 수 있습니다. 이를 통해 임시 객체의 생성을 줄이고 메모리 할당과 복사 비용을 최소화할 수 있습니다.

Lambda 표현식(Lambda Expression)이란 무엇이며, 어떻게 사용하나요?

답변: Lambda 표현식은 익명 함수를 만들고 사용하는 방법으로, 간단한 함수를 인라인으로 정의하여 사용할 수 있습니다. 주로 STL 알고리즘과 함께 사용되며, 코드의 가독성을 향상시키고 작은 스코프에서 함수를 정의할 수 있습니다.

 

[추상클래스와 인터페이스]

추상클래스는 인스턴스를 생성할 수 없는 클래스로, 하나 이상의 순수 가상 함수를 가지고 있는 클래스입니다.

인터페이스 클래스는 순수 가상함수로만 이루어져 있으며, 모든 멤버 함수는 정의만 있고 구현이 없습니다.

- 인터페이스를 구현하는 클래스는 모든 메소드를 구현해야합니다.

- 추상 클래스는 상태 및 구현을 포함할 수 있습니다.

- 추상 클래스는 추상 메소드를 구현하지 않고 상속될 수 있습니다.

- 인터페이스는 다중 상속이 가능합니다.

 

[객체 지향 프로그래밍(Object-Oriented Programming, OOP)]

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 작성하는 데 사용되는 개념과 기술의 집합으로, 현실 세계의 객체를 모델링하여 프로그래밍하는 방법론입니다.

 

클래스(Class)와 객체(Object):

클래스는 데이터와 데이터를 조작하는 메서드(함수)를 포함하는 사용자 정의 데이터 타입입니다. 객체는 클래스의 인스턴스로, 클래스에서 정의된 속성(데이터)과 메서드(동작)를 가지고 있습니다.

캡슐화(Encapsulation):

캡슐화는 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶는 것을 말합니다. 클래스는 데이터와 해당 데이터를 조작하는 메서드를 캡슐화하여 외부에서의 접근을 제한하고, 데이터 무결성을 보장합니다.

상속(Inheritance):

상속은 기존 클래스의 속성과 메서드를 그대로 물려받아 새로운 클래스를 정의하는 개념입니다. 상속을 통해 코드의 재사용성을 높이고 클래스 간의 계층 구조를 형성할 수 있습니다.

다형성(Polymorphism):

다형성은 같은 이름의 메서드나 연산자가 서로 다른 기능을 수행하도록 하는 것을 말합니다. 다형성을 통해 코드의 유연성을 높이고, 객체들 사이의 상호작용을 간소화할 수 있습니다.

추상화(Abstraction):

추상화는 복잡한 시스템에서 핵심적인 개념 또는 기능을 간추려내어 모델링하는 것을 의미합니다. 추상화를 통해 중요한 개념에 집중하고 불필요한 세부 사항을 숨길 수 있습니다.

 

[멀티 스레딩(Multithreading)]

멀티 스레딩은 하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 기술입니다. 스레드는 프로세스 내의 실행 흐름이며, 동일한 주소 공간을 공유하므로 스레드 간 데이터 공유가 쉽습니다. 멀티 스레딩을 통해 프로그램은 동시에 여러 작업을 수행하거나, 작업을 분할하여 병렬로 처리할 수 있습니다. 이는 응용 프로그램의 응답성을 향상시키고, CPU 자원을 효율적으로 활용할 수 있게 해줍니다. 그러나 스레드 간의 동기화와 상호 배제 같은 복잡한 문제를 다루어야 하므로 프로그래밍이 어려울 수 있습니다.

[멀티 프로세싱(Multiprocessing)]

멀티 프로세싱은 여러 개의 독립적인 프로세스가 동시에 실행되는 기술입니다. 각 프로세스는 독립된 주소 공간을 가지므로 데이터 공유가 어렵고, 프로세스 간 통신(IPC, Inter-Process Communication)이 필요합니다. 멀티 프로세싱을 사용하면 여러 작업을 병렬로 처리할 수 있으며, 여러 CPU 코어를 활용하여 전체 시스템 성능을 향상시킬 수 있습니다. 하지만 프로세스 간 통신의 오버헤드가 있고, 시스템 자원을 효율적으로 관리해야 합니다.

 

[짐벌락 현상]

두번째 고리가 도는 것 때문에 첫번째 고리와 세번째 고리가 겹쳐지면, 첫번째 고리와 세번째 고리의 회전이 겹쳐져 버리기 때문에 한 축에 대한 자유도를 상실하게 된다. 그래서 두번째 고리를 움직일 때에 조심스러울 수밖에 없는데 이것이 바로 짐벌락 현상이다.

 

[malloc, calloc, new에 대해서]

리턴값과 매개변수 라이브러리 제공 함수라는 차이점이 있습니다. 할당할 타입의 자료형 포인터를 반환합니다. malloc의 경우 데이터 타입의 공간을 매개변수로 받습니다. malloc은 메모리만 할당해주고 new의 경우에는 할당과 동시에 초기화됩니다. new 키워드는 C++ 자체 라이브러리이고 malloc은 라이브러리를 필요로합니다.

calloc으로 메모리 할당 시 할당된 공간의 값을 모두 0으로 초기화 합니다. 데이터 타입 사이즈와 개수를 매개변수로 받습니다.

 

[댕글링 포인터(Dangling Pointer)]

포인터가 여전히 해제된 메모리 영역을 가리키고 있다면, 이러한 포인터를 댕글링 포인터(Dangling Pointer)라고 한다.

 

[null nullptr의 차이점]

기본의 NULL의 의미는 0으로 치환되어 상수로 취급되어 처리되었습니다. 반면에 nullptr은 포인터 취급을 받습니다. 따라서 nullptr을 씀으로서 오버로딩 같은 상황에서 NULL이 갖던 모호함을 해결할 수 있습니다.

 

[정적 캐스팅(Static Casting)]

정적 캐스팅은 컴파일 타임에 수행되는 캐스팅으로, 프로그래머가 명시적으로 변환하고자 하는 타입을 지정합니다. 기본적으로 안전하지 않으며, 캐스팅할 수 없는 경우 컴파일러는 경고를 발생시키지 않습니다.

[동적 캐스팅(Dynamic Casting)]

동적 캐스팅은 런타임에 수행되는 캐스팅으로, 상속 관계에서 사용됩니다. 이 캐스팅은 상속 관계가 있는 클래스 간에만 사용할 수 있으며, 포인터나 참조 타입에 대해서만 작동합니다.

[상수 캐스팅(Const Casting)]

상수 캐스팅은 변수의 상수성을 제거하는 캐스팅입니다. , const 지정자를 추가하거나 제거할 때 사용됩니다. 이 캐스팅은 일반적으로 안전하지 않으며, 주로 C 스타일 캐스팅으로 대체됩니다.

[재해석 캐스팅(Reinterpret Casting)]

재해석 캐스팅은 데이터의 비트 패턴을 재해석하여 다른 형식으로 해석하는 캐스팅입니다. 이 캐스팅은 가장 위험하며, 주로 하드웨어와의 상호 작용에서 사용됩니다.

 

[RValue LValue]

C++에서 모든 표현식은 Lvalue 또는 Rvalue 입니다. Lvalue는 단일 표현식 이후에도 없어지지 않고 지속되는 객체입니다쉽게 생각해서 이름을 가지는 객체는 Lvalue라고 얘기할 수 있죠. 그러므로 const 타입을 포함한 모든 변수는 Lvalue 입니다반면에 Rvalue는 표현식이 종료된 이후에는 더이상 존재하지 않는 임시적인 값입니다상수 또는 임시 객체는 Rvalue 라고 얘기할 수 있겠네요.

 

[Call By Value Call By Reference 차이 ]

Call By Value

인자로 받은 값을 복사하여 처리하는 방식, Call By Value에 의해 넘어온 값을 증가시켜도 원래의 값이 보존된다.

값을 복사하여 넘기기 때문에 메모리 사용량이 늘어난다.

Call By Reference

인자로 받은 값의 주소를 참조하여 직접 값에 영향을 주는 방식, 원래의 값에 영향을 주는 리스크가 존재한다.

값을 복사하지 않고 직접 참조하기 때문에 속도가 빠르다.

 

[얕은 복사(Shallow Copy)]

얕은 복사는 객체의 멤버 변수들을 단순히 복사하는 것으로, 복사되는 객체와 원본 객체가 같은 데이터를 참조하게 됩니다. , 복사된 객체의 멤버 변수는 원본 객체의 멤버 변수와 같은 메모리 공간을 참조합니다. 이는 포인터를 사용하는 경우에 특히 두드러지게 나타납니다.

[깊은 복사(Deep Copy)]

깊은 복사는 객체의 멤버 변수들을 새로운 메모리 공간에 복사하여, 복사된 객체와 원본 객체가 서로 독립적인 데이터를 가지게 합니다. 따라서 복사된 객체를 수정해도 원본 객체에 영향을 주지 않습니다.

 

[포인터(Pointer)]

 auto_ptr : 스마트 포인터의 시초라고 할 수 있으며, 기본적으로 동적으로 할당된 객체를 자동 소멸시켜 메모리 누수에 대한 걱정을 덜어주는 기능 수행한다.

 unique_ptr : auto_ptr의 위와 같은 문제점에 의해 unique_ptr이 생겨나게 되었을 것 같다. 위의 두가지 문제점 중에 배열에 대한 객체생성을 못하는 부분을 해결해주는게 unit_ptr이다. auto_ptr과 동일하게 유일소유권의 특징은 가지고 있다.

 shared_ptr : auto_ptr unique_ptr의 단점을 해결하기 위해 나온 즉, 유일 소유권의 개념을 극복한 소유권을 공유할 수 있는 pointer reference count라는 개념을 사용하여 객체를 참조하고 있는 smart pointer의 개수를 세고 있으며, 참조 횟수는 특정 객체에 새로운 shared_ptr이 추가될 때마다 1씩 증가하며, 수명이 다할 때마다 1씩 감소합니다.

 weak_ptr : 위와 같이 배열에 대한 포인터 해제 문제뿐만 아니라 circular references에 대한 문제가 존재한다.

 shared_ptr이 서로에 대한 참조를 하고 있다면 각각의 pointer reference count가 영원히 0이 될 수 없는 dead lock상황이 발생하게 된다. 다음 예제를 통해 알아보자

 

[람다(lambda)]

람다는 익명 함수를 생성하는 간단한 방법으로, 코드 블록을 함수 객체로 감싸고 나중에 호출할 수 있습니다. 주로 함수형 프로그래밍 스타일을 지원하고, 함수를 매개변수로 전달하거나 반환하는 경우에 유용하게 사용됩니다.

[캡쳐](매개변수) -> 반환타입 { 함수 본문 }

[값 캡쳐(value capture)]

외부 변수를 람다 내부로 복사합니다. 람다가 만들어질 때 외부 변수의 값을 복사하며, 이후에 값이 변경되어도 람다 내부에는 영향을 주지 않습니다.

[참조 캡쳐(reference capture)]

외부 변수를 람다 내부로 참조로 가져옵니다. 람다가 만들어질 때 외부 변수의 참조를 가져오므로, 외부 변수가 변경되면 람다 내부에도 영향을 줍니다.

 

[순차 자료구조(ArrayList)와 연결 자료구조(LinkedList)의 차이점]

-순차 자료구조는 시작 위치부터 빈자리 없이 자료를 순서대로 연속하여 저장하는 방식으로, 데이터의 논리적인 순서와 물리적인 순서가 일치합니다.

-연결 자료구조는 물리적 위치가 논리적인 순서와 상관없이 저장되며, 링크에 의해서 논리적인 순서를 표현하는 방식입니다.

-순차 자료구조는 원하는 데이터에 무작위로 접근할 수 있지만, 연결 자료구조는 순차적인 접근만 가능합니다.

 

[컨테이너(Container)]

시퀀스 컨테이너는 자료를 입력한 순서대로 저장하기 때문에 저장 검색 알고리즘이라고 불립니다. 많지 않은 양의 자료/검색속도가 중요하지 않은 경우에 사용되며 vector, list, string, dequue등이 이에 해당합니다.

연관 컨테이너는 일정한 규칙에 따라 자료를 조직화하여 저장하는 것을 말합니다. 자료를 정렬하여 저장하기 때문에 검색에 유리하고 많은 양의 자료/빠른 검색이 중요할 때 사용합니다. 대표적으로 map, set이 그에 해당합니다.

어뎁터 컨테이너는 시퀀스 컨테이너를 변형시켜 스택, , 우선순위 큐 형태로 저장하는 것을 말합니다.

 

[렌더링 파이프라인 (Rendering Pipeline)]

3D 세계에 대한 기하학적 표현과 이 세계를 바라보는 관점을 정의하는 가상 카메라를 이용해 2D 이미지를 만들어 내는 역할을 합니다. 렌더링 파이프라인에는 일련의 과정이 있습니다.

1. 입력 어셈블러 (Input Assembler) : 메모리에 사용자가 채워놓은 기본데이터(삼각형, , )를 다른 파이프라인 단계에서 사용하기 위한 기본 형식으로 조립하는 단계

2. 꼭지점 셰이더 (Vertex Shader) : 변환(Transformation), 스키닝(Skinning), 조명(Vertex Lighting) 등의 작업을 수행한다. 이중 변환 작업 과정에 대해 좀더 설명하자면, [오브젝트 공간] -> 월드 변환 -> [월드 공간] -> 뷰 변환 -> [카메라 공간] -> 투영 변환 -> [클립 공간] 순으로 최종적인 정점을 생성한다.

3. 덮개 셰이더 (Hull Shader) : 이 다음 단계인 테셀레이션(Tessellation) 단계를 위한 준비 단계이다. 모델의 단일 표면을 여러개의 삼각형으로 분할 하고, 각 입력 패치에 해당하는 도형 패치를 생성하고 계산한다.

4. 테셀레이터 (Tessellator) : 주어진 메쉬의 삼각형들을 더 잘게 쪼개서 새로운 삼각형을 만드는 과정이다. 카메라에 가까운 삼각형들은 테셀레이션을 적용하여 세부도를 높이고 먼 삼각형들에게는 테셀레이션을 적용하지 않는 방식으로 구현 할 수 있다.(Level-Of-Detail, LOD) 이는 메모리를 절약할 수 있고, 계산량을 줄일 수 있다.

5. 도메인 셰이더 (Domain Shader) : 테셀레이션의 세번째 단계로 출력 패치에서 세분화된 꼭지점위치를 계산한다.

6. 기하 셰이더 (Geometry Shader) : 입력받은 정점 데이터에 정보를 추가하거나 삭제하여 입력받은 기본 도형을 다른 도형들로 확장하거나 출력하지 않도록 버릴 수 도 있다. 가장 흔한 용도는 하나의 점이나 선분을 하나의 사각형으로 확장하는 것이다.

7. 래스터 라이저 (Rasterize) : 투영된 3차원의 삼각형으로 부터 픽셀의 색상들을 계산한다.

8. 픽셀 셰이더 (Pixel Shader) : 각 픽셀의 데이터를 생성하는 단계. 조명을 계산하거나 텍스쳐를 입혀서 프래그먼트를 색칠하는 단계

9. 출력 병합 (Output Merge) : 픽셀 셰이더가 생성한 데이터들을 입력받아 최종적으로 픽셀의 색상을 생성하여 렌더 타겟으로 출력하는 단계. 후면 버퍼에 기록

 

다이나믹 라이팅(Dynamic Lighting)과 스태틱 라이팅(Static Lighting)의 차이는 무엇인가요?

답변: 다이나믹 라이팅은 런타임 중에 조명이 변경될 수 있는 라이팅 기술을 말하며, 주로 캐릭터나 물체 주변에 동적인 그림자를 생성하는 데 사용됩니다. 스태틱 라이팅은 미리 계산된 조명 정보를 사용하여 빠르게 렌더링되는 기술을 말하며, 주로 환경이 변하지 않는 장면에 적합합니다.

렌더링(Rendering)이란 무엇이며, 게임에서 어떤 역할을 하나요?

답변: 렌더링은 3D 모델이나 2D 이미지를 화면에 표시하는 과정을 말합니다. 게임에서는 플레이어에게 시각적인 효과를 제공하고, 게임 세계를 실제로 보여주기 위해 중요한 역할을 합니다.

게임 그래픽스에서의 쉐이딩(Shading)이란 무엇인가요?

답변: 쉐이딩은 렌더링 과정 중에 표면의 색상, 질감, 광택 등을 결정하는 기술을 말합니다. 주로 버텍스 쉐이딩과 픽셀 쉐이딩으로 나누어지며, 이를 통해 현실적인 그래픽 효과를 구현할 수 있습니다.

텍스처링(Texture Mapping)이란 무엇이며, 어떤 역할을 하나요?

답변: 텍스처링은 3D 모델의 표면에 이미지나 패턴을 적용하여 현실적인 모양과 질감을 제공하는 기술을 말합니다. 게임에서는 텍스처링을 통해 다양한 표면을 표현하고 세부적인 디테일을 추가할 수 있습니다.

렌더링 파이프라인(Rendering Pipeline)에 대해 설명해주세요.

답변: 렌더링 파이프라인은 3D 모델을 화면에 표시하는 과정을 단계적으로 설명한 것입니다. 주로 버텍스 처리, 변환 및 조명, 클리핑, 래스터화, 픽셀 처리 등의 단계로 구성됩니다.

안티 앨리어싱(Anti-Aliasing)이란 무엇이며, 어떻게 작동하나요?

답변: 안티 앨리어싱은 게임 그래픽스에서 나타나는 계단 현상을 완화하기 위한 기술로, 주로 라인이나 모서리 주변에 부드러운 효과를 추가하여 그래픽의 부드러움을 향상시킵니다.

 

[블린 퐁 조명 모델(Blinn-Phong Lighting Model)]

Phong 조명 모델은 빛의 세 가지 주요 요소를 사용하여 표면을 묘사합니다.

주변광(Ambient Light): 물체 주변에서 나오는 일반적인 조명 효과를 나타냅니다. 이는 빛의 직접적인 향상이 없는 영역에서 나오는 간접적인 조명입니다.

환경광(Diffuse Light): 빛이 표면에서 고르게 반사되는 효과를 나타냅니다. 빛이 표면에 닿은 부분의 색상은 표면에 따라 다르게 표현됩니다.

반사광(Specular Light): 빛이 표면에서 반사되는 광택 효과를 나타냅니다. 표면에 더 많은 반사 광이 있을수록 더 많은 광택이 생깁니다.

[Forward Rendering]

전통적인 방식의 렌더링으로 메시 하나를 그리면서 모든 계산을 한 번에 시행하는 방법으로 라이팅의 계산 수는 메시의 수에 비례한다. 때문에 여러 개의 리얼타임 라이팅을 다루는 데 취약하다. 비교적 저사양에서도 잘 작동하며, PC의 경우 안티앨리어싱 처리를 하드웨어서 지원 받기 때문에 거의 완벽한 처리를 할 수 있고, 반투명 처리도 문제 없이 동작한다.

[Deferred Rendering]

디퍼드 렌더링은 많은 양의 실시간 라이팅을 처리하기에 좋은 방식 입니다. 멀티 렌더 타겟(MRT, Multi-Render Target) 방식을 이용하여 여러개의 지오메트리 버퍼(G-버퍼)에 오브젝트의 다양한 정보들을 한꺼번에 렌더링합니다. 이렇게 오브젝트에 대한 정보들을 모아 G 버퍼에서 렌더링한 후, 라이팅은 이후에 라이팅 프래그먼트 셰이더에서 한꺼번에 처리합니다. 라이팅 처리를 마지막까지 지연시킨 후 처리한다고 하여 디퍼드(Defferred, 지연된) 렌더링이라 합니다.

[Lighting Baking]

조명 베이킹은 실시간 렌더링에서 미리 계산된 빛 정보를 사용하여 조명 효과를 구현하는 기술입니다. 이를 통해 복잡한 조명 계산을 줄이고 시스템 성능을 향상시킬 수 있습니다.

 

[모델 변환(Model Transformation)]

모델 변환은 객체를 원하는 위치, 회전 및 크기로 이동시키는 프로세스를 말합니다. 이는 모델의 로컬 좌표계에서 전역 좌표계로 변환하는 과정을 포함합니다. 이를 위해 이동(Translation), 회전(Rotation), 크기 조절(Scale) 등의 변환 행렬을 사용합니다.

[뷰 변환(View Transformation)]

뷰 변환은 세계의 장면을 관찰자의 시점으로 변환하는 과정을 말합니다. 관찰자의 시점에 따라 장면을 보여주기 위해 카메라의 위치와 방향을 고려하여 뷰 변환 행렬을 적용합니다.

[프로젝션 변환(Projection Transformation)]

프로젝션 변환은 3D 장면을 2D 이미지로 투영하는 과정을 말합니다. 이는 시점 투영(Perspective Projection)이나 직교 투영(Orthographic Projection)을 사용하여 수행됩니다. 이러한 변환을 위해 투영 변환 행렬을 사용합니다.

[뷰포트 변환(Viewport Transformation)]

뷰포트 변환은 뷰 공간의 장면을 스크린 공간의 좌표로 변환하는 과정을 말합니다. 일반적으로 이는 화면의 크기와 위치에 따라 수행됩니다.

이러한 변환은 보통 행렬의 곱셈 연산을 사용하여 수행됩니다. 따라서 행렬 연산의 기본 개념과 행렬 간의 곱셈, 역행렬 계산 등의 연산에 대한 이해가 필요합니다.

 

[A* 알고리즘]

경로 탐색 알고리즘으로, 시작 노드부터 목표 노드까지의 최단 경로를 찾는 데 사용됩니다. 이 알고리즘은 효율적이고 널리 사용되며, 휴리스틱 함수를 사용하여 탐색을 가속화합니다. 간단히 말해, A* 알고리즘은 가장 가까운 경로를 먼저 탐색하고 목표 지점에 도달할 때까지 계속해서 경로를 수정해 나가는 방식으로 동작합니다.

[JPS(Jump Point Search) 알고리즘]

A* 알고리즘의 개선된 버전으로, 그리드 기반의 경로 탐색에서 효율적인 경로를 빠르게 찾을 수 있도록 고안되었습니다. JPS는 사전에 탐색한 지점에서 불필요한 경로를 건너뛰고 직접 목표 지점으로 향하는 점프 포인트를 찾아내는 방식으로 동작합니다. 이를 통해 경로 탐색의 효율성을 크게 향상시킬 수 있습니다.

[다각형 클리핑 알고리즘(Polygon Clipping Algorithm)]

다각형으로 다른 다각형을 잘라내는 알고리즘입니다. 많이 사용하는 다각형 클리핑 알고리즘으로는 서덜랜드-호지맨 알고리즘(Sutherland-Hodgman Algorithm)으로 볼록 다각형으로 다른 단순 다각형을 잘라내는 알고리즘입니다.

 

[C++ C#의 차이점]

C++은 정적 타입 시스템을 사용하며, 포인터를 직접 조작할 수 있습니다. 반면에 C#은 가비지 컬렉션을 사용하여 메모리 관리를 자동화하고 포인터 연산을 제한합니다. C++은 메모리 관리, 포인터 조작 등과 같은 저수준의 작업을 직접 다루어야 하므로 개발 생산성이 낮을 수 있습니다. 반면에 C#은 가비지 컬렉션 및 고수준의 추상화를 제공하여 개발 생산성을 향상시킵니다. C#은 풍부한 라이브러리와 기능들이 많이 있고 호환성이 좋습니다.

 

 

 

반응형