Technical/Interview

[Technical Interview] 게임 클라이언트 면접 복기_3

song.ift 2022. 12. 27. 19:29

과거 면접 때, 답변 복기

(중복되는 것들도 있을 수 있음)

 

 

- 프로젝트별 자랑

니어오토마타 – 애니메이션 툴, 스키닝, 행렬중점, 충돌뼈 충돌체를 달아 세밀한 충돌처리

스틱스 – 엔진의 구조를 직접 만듬, 렌더러를 통해 렌더링 제어, 절두체컬링, 캣멀롬라인의 카메라, 레이픽킹, 네비메쉬

휴 – AABB를 통해 충돌하고 레이어로 나눠 충돌최적화, DX에서 해주는 뷰스페이스변환이나 투영변환, 월드변환등을 직접구현.. 스자이공부와 카메라 역행렬 등 직접 연산을 해보고 그에 따른 최적화를 어떻게 하면 좋을지 생각하면서 코딩, 스탠실버퍼를 써서 거울효과 또다른월드 구현

 

- 메쉬를 어떻게 화면에 띄웠나

DX 내부적으로 메쉬의 정보를 담는 구조체 테이블이 있는데 그 구조체에 담을 정보를 X파일로부터 로드한다. X파일 읽어서 내부에 메쉬의 각 폴리곤, 버텍스, 인덱스, 텍스쳐 uv, 재질 등 메쉬에 대한 정보를 읽어서 컨테이너에 저장하고 쓴다.

스키닝 애니와 애니 둘다 뼈대는 동일하다.
계층 구조를 뼈대(Skeleton) 한.
메시는 뼈대, 정점 배열, 인덱스 배열 등을 포함한 것이다
본은 메시에 포함된 것이라 있다.

 

- 네비메쉬 어떻게 만들었나?

각 cell이란 객체안에 point라는 3개의 점 클래스를 포함하고 있다. 각 점은 각 다음 점으로 향하는 벡터를 생성해 라인을 만들고 3개의 점은 한 cell이 되어 네비메쉬의 한 인덱스로 구성된다. 다른 cell과는 인접한 것을 판단하려면 3점 중 1점이라도 인접한다면 인접cell이라고 각 테이블에 서로의 포인터로 갖고있어 연관시켜준다.

네비메쉬를 타는법은 플레이어 객체가 시작 좌표에 일치하는 네비메쉬 인덱스 번호로 지정하고, 플레이어로 향하는 방향벡터와 각 라인의 노멀벡터끼리 내적을 해서 코사인값이 하나라도 양수 즉 예각이 나오면 밖에 있는걸로 판단하고 인덱스 번호를 옮겨준다.

 

- 최적화 어떤거 했나

충돌체에 1차 충돌 영역과 레이어 영억 만들었음, 특히 AABB, OBB연산때는 구 충돌을 무조건 만들었음

DX에는 절두체컬링, 쿼드트리 LOD 등을 사용해봤음, 렌더러 컴포넌트를 통해 알파븗랜딩, 알파테스팅, 알파소팅등 할것들을 따로 나눠놨고 장치 초기화를 한 번만 하도록 만들었음

책에 있는거라 다른사람들은 모를 수 있음.

 

- 빌보드 어떻게했나

빌보드란 카메라가 어느방향에서 바라보아도 항상 카메라의 정면을 향할 수 있도록 만드는 기법이다. 빌보드가 적용된 메쉬는 항상 카메라를 향하고 있다.

간단하게 생각해보면, 카마레 변환 행렬의 성분 중에서 회전행렬부분만 역변환하면 빌보드 행렬을 구할 수 있는 것이다.

그럼 Y축 회전행렬의 역행렬을 구하면 된다.

 

- 팀프로젝트 진행 당시 팀장으로 역할 능력 분담을 통해 협업 능력을 키웠는데 팀장으로서 힘들었던 것?

두명의 팀원 기한 내에 완수 해야한다는 압박감이 있었다.

매일 회의를 통해 진행 상황 파악 및 앞으로 해야할 것 파악으로 앞으로 효율적으로 할 수 있게끔 했다.

 

- 쉐이더를 사용하는 이유?

장치에서 해주는 기능을 프로그래머가 계산해서 할 수 있기에 필요하다.

HLSL을 통해 사실적인 그래픽 구현이 가능하기에 사용한다.

 

- 상태패턴을 직접 사용한 예시?

상태들을 상태라는 클래스를 추상적인 두고 추상의 클래스를 상속받아 필요한 객체들마다 가져 쓰는 각 객체마다 머신을 가져서 머신은 항상 하나의 행동을 가지게 끔해서 원하는 상태를 컨트롤 했다.

 

- 디자인패턴 사용예시?

자신있는 패턴

컴포넌트패턴 상속이 아닌 포함관계로 필요하느 기능들만 가지게해서 확장성 유용성을 가지게했다.

단점? 각 기능들마다 연관되어 있지않아서 좋기도 했지만 기능들을 일일이 구현해야해서 상호 객체들간의 참조를 할 때 정보를 얻어오는 것이 힘들었다.

 

- c와 c++차이

무엇을 중심인지

C 절차지향 언어 함수 중심으로 순서대로

기능을 우선시 한다.

C++ 객체지향 객체들 간의 통신을 하면서 흘러간다.

이식성, 코드분석에 좋음. 대규모 팀프로젝트에 좋음.

 

- 스마트 포인터 사용 경험?

직접 사용x, 비슷하게 구현해봄.

객체들마다 참조카운트를 만들어사용했다.

객체에서 참조카운트가 있고, 다른 객체에 넘겨줄 경우 참조카운트를 증가, 삭제할 시 참조카운트를 내리고 1이하가 되면 해제하는 방식

 

- 스택메모리란?

프로세스 관점에서는 프로세스에 피룡한 자원들 담는 공간.

함수가 불릴 시 함수에 피요한 정보를 담는 공간. 함수 종료시 스택에 저장된 메모리를 삭제한다.

함수에 필요한 공간은 스택 프레임인다.

스택은 후입선출이다.

 

- 동적 바인딩, 정적바인딩

바인딩은 함수 호출이 되었을 때 함수 호출 된곳과 함수 호출번지를 연결 시켜주는 것

정적바인딩 프로그램이 실행 되었을 때 컴파일 과정에서 함수 호출에 연결되어지는 것으을 미리 정해준다, 일반적인 함수

동적바인딩 컴파일러가 결정할 수 없는 것들을 런타임 시점에 연결해준다. virtual키워드가 대표적이다.

 

- 인라인 함수 사용? 어떤경우?

Get,Set 간결 및 성능 이점

함수 내용이 본체 자체에 구현되어서 주로 .h에 선언을 한다.

결정되는 시점은 컴파일 시점 컴파일러가 인라인화를 결정한다.

보통 코드가 간결화된 코드에 사용한다.

 

- 인라인과 매크로 함수 차이?

공통점 서로 치환을 하는 것이다. 정적 바인딩 없음.

차이점 매크로 전처리기 시점, 인라인 컴파일러

매크로 디버깅 불가능, 인라인 디버깅이 가능하다.

 

- 값 호출, 참조 호출

값호출 값을 복사에서 가져옴 원본에 손상 x

넘겨주는 매개변수를 복사해서 넘겨주기 때문에 속도상 느리다. -> 메모리 효율이 좋지 않다.

참조호출 객체에서 외부에 있는 주소를 참조해서 원본에 바로 접근

프로그래머가 부주위시 원본값 훼손

 

- 정적 변수

Static 변수를 많이 사용하지 않았지만 개발 초기에 많이 사용. 어디서든 접근 가능한 것

Data 영역에 저장 프로그램이 시작될 때 생성 종료될 때 해제. 초기화를 단한번

전역변수와 다르게 지역적 특징도 있어서 선언된 곳에서만 접근 가능하다.

 

- c, c++ 캐스팅의 차이

C의 단점을 보완한 것.

C는 어떤 조건도 없이 무조건 형변환을 한다.

C++은 총 4가지의 형변환이 있다.

Static cast c스타일과 비슷 논리적 판단을한다.

Dynamic cast 상속성을 판단해서 불가능하면 NULL반환을 해서 프로그래머에게 알려줌

Const cast const을 없애고 싶을떄

Reinter cast 포인터와 비포인터간의 형변환

 

- 오버로딩, 오버라이딩 경험

오버로딩 math함수에서 많이 사용

프로그래머적으로 수학적인 계싼이 필요할 경우 계산식을 할 떄 사용

매개변수의 자료형이 다를 때 같은 함수지만 계산이 가능하게 끔 했음.

오버라이딩  상속관계에 사용

같은 부모지만 다른 객체있때 같은 함수라도 서로 다른 일을 하도록 만들었다.

 

- directX 내적, 외적 경험?

보스를 구현할 시 사용

내적 대상과의 각도를 구할 시 사용 두 방향 벡터를 normal해서 공식을 이용해 cos값을 구한 후 acos으로 각도를 구함

외적

판단 시 왼쪽 오른쪽을 판별시 사용 왼손법칙을 통해 도출 값이 양이냐 음이냐에따라 우측에 있냐 좌측에 있냐를 판단했다.

 

- 팀프로젝트에서 가장 자신있는 기술

Catmulrom, 베지어 

카메라를 많이 다뤄옴.

다이나믹한 연출을 직접 만들어서 많이 사용함.

 

- 벡터 리스트 차이

큰 차이점은 장단점에 있다

벡터는 연속된 메모리 공간을 가진 동적배열

중간 삽입삭제어려움 탐색은 빠르다.

리스트는 연결리스트를 통해 다음 순번의 포인터를 가지고 있어서 연속적

탐색 느림 중간 삽입 삭제 빠르다.

둘다 선형 구조 이다.

 

- 선형구조와 비선형구조?

선형구조는 배열과 리스트, 큐, 디큐, 스택.

비션형 트리, 그래프

나누는 기준?

구조적으로 나눈다. 메모리가 연속적이냐 연속적이지 않냐로 나눈다.