게임에서 작업에 대한 C ++ 작업 경험을 얻는 가장 좋은 방법 (C #에서 제공) [닫기]


19

저는 몇 가지 다른 언어와 함께 C # (5 년 경험)을 경험 한 소프트웨어 개발자입니다.

저의 "꿈의 직업"은 비디오 게임에서 개발자로 일하고 있습니다.

대부분의 작업에는 현재 가지고 있지 않은 C ++에 대한 지식이 필요합니다 (일부 기본 사항 제외).

주위를 둘러 보았고 대부분의 대형 게임 회사는 3-5 년 동안 C ++에 대한 이전 경험에 따라 무언가를 요구합니다.

내 질문은-C #에서 오는이 필요한 경험 수준에 도달하기에 좋은 경로는 무엇입니까?

가능한 몇 가지 방법을 생각했습니다.

책에서 C ++에 대한 추가 정보를 얻으십시오. C ++로 작성된 오픈 소스 프로젝트에 참여하십시오. 특히 게임 산업에서 C ++을 배우고 실무 경험을 쌓는 가장 좋은 방법은 무엇입니까?


1
감사합니다. 확인하겠습니다. 나는 이것이 프로그래밍 초보자가 아니라는 것과 정확히 같은 질문인지 확실하지 않습니다.
spaceOwl

3
경험을 어디서 어떻게 얻었는지, 또는 그 대가를 지불했는지 아닌지는 아무도 신경 쓰지 않습니다. C ++에 대한 경험이 필요하면 C ++ 프로그래밍을 시작하십시오.
Maik Semder 2013 년

@liortal Repost : 참고 항목 초보자를위한 유용한 팁은 무엇입니까? (일부 이상한 사람은이 스레드에 대한 모든 의견을 삭제했습니다).
bobobobo 2016 년

답변:


29

게임 개발자로서 C # 직원을 고용하는 주요 관심사는 저수준 지식이 부족하다는 것입니다.

따라서 작업에 SIMD 명령을 활용하기 위해 클래스의 데이터 레이아웃을 다시 정렬하거나 코드를 다시 작성하는 것과 같은 저수준 최적화가 필요한 프로젝트를 고려하십시오. C ++ 오픈 소스 게임을 통해 최적화하고 이력서에 프레임 속도 증가를 게시하십시오.

인터뷰를한다면 이력서의 C ++에 대한 관심과 C / C ++ / 저급 인터뷰 질문에 답변 할 수 있는지에 대해 더 관심이 있습니다. 문제가있을 수있는 표준 인터뷰 질문에주의를 기울 이겠습니다 (경고 : C # 전문가 아님).

  • C ++ 클래스는 메모리에 어떻게 배치됩니까? 바이트 다이어그램을 그립니다. vtable 포인터와 멤버 변수의 패딩 / 정렬을 포함합니다. 파생 클래스는 어떻습니까? 곱셈 파생 클래스는 어떻습니까?
  • 가상 함수 호출은 낮은 수준에서 어떻게 발생합니까? 메모리에서 값을 읽고 주소로 점프하는 것과 같은 어셈블리 작업에 대해 이야기하십시오.
  • 다양한 상속 관계를 가진 유형에 대한 포인터 사이의 C 스타일 캐스트, static_cast 및 dynamic_cast에 대해 알고 있습니다. 예를 들어, 클래스 B와 C는 모두 클래스 A에서 파생됩니다. 이러한 다양한 캐스트를 사용하여 A *에서 B * (또는 B *에서 C *)로 캐스트하려고하면 어떻게됩니까? (C #이 이러한 특정 캐스트를 허용하지 않을 것이라고 생각하기 때문에 언급했습니다.)
  • stl 벡터를 참조 대신 값으로 전달하는 것이 왜 끔찍한가요? (C #의 대부분의 유형은 참조 유형이므로 C #에서 이러한 종류의 실수를하는 것은 기본적으로 불가능하기 때문에 언급합니다.)
  • 구조 나 함수가 캐시 친화적이라는 것은 무엇을 의미합니까? 배열 구조가 배열 배열보다 성능이 우수한 이유는 무엇입니까?
  • 힙, 스택 및 정적 메모리를 이해하십시오. 객체가 새 객체로 할당 된 경우 프로세스 메모리에서 어디에 있습니까? 지역 변수는 어떻습니까? 글로벌 변수?
  • 메모리 누수 란 무엇입니까? 이를 피하기위한 모범 사례는 무엇입니까? ( C # 에는 삭제 가 없기 때문에 언급했습니다 !)
  • 메모리 액세스 위반 충돌을 어떻게 디버그합니까? 소스 코드가없는 미들웨어 라이브러리에서 충돌이 발생한 경우는 어떻습니까?

1
재 게시 : vtable에 포인터가 메모리에 어디에 내가 우연히 때문에 나는 이미 알고의 유용성을 알고 그 전에 관련 버그 . 그러나 두 번째 질문은 어떻게 유용합니까? "값을 메모리로 읽는 것과 같은 어셈블리 레벨 연산"을 아는 것은 어떻게 유능한 C ++ 프로그래머가됩니까?
bobobobo 2016 년

WoW UI 인턴 스팟에 대한 블리자드 인터뷰는 포인트 1, 2, 3 (더 낮은 정도), 5 및 7에서 진행되었습니다. 또한 디버깅 / 테스트에 대한 질문도했습니다 (8 포인트와 유사). 일반적인 게임 개발 회사의 경우에도 마찬가지입니다.
Dean Knight

2
@DeanKnight 나는 그것을 의심하지 않습니다. 그러나 나는 OP가 어떻게 그런 종류의 질문 이 누군가를 인터뷰 에이스를 돕는 데 도움이되는 대신 좋은 C ++ 프로그래머 (원래 질문이 더 나은 C ++ 프로그래머가되는 방법에 관한 것)로 만든다고 생각하는지 알고 싶습니다 .
bobobobo

2
회의적이지만 보보 보보이지만 vtable 포인터 버그에 대한 링크는 가상 함수 호출의 내부를 아는 것이 얼마나 유용한지를 보여주는 훌륭한 예입니다. 대신 vtable에 포인터 존재의의, 비슷한 버그 곳을 고려 그것의, 쓰레기 . 그것이 쓰레기 임을 깨닫는 한 가지 방법 은 가상 함수 호출의 분해를 단계별로 수행하고 유효한 vtable 또는 유효한 메소드로 이동하는 대신 프로그램이 아무데도 나가는 것을 보는 것입니다.
Eric Undersander

1

에릭이 말한 것. 또한 "새로운"것이 필요하지 않은 곳에 피하기 위해 추가 할 것입니다. C #에서는 매우 일반적이지만 C ++ 11에서는 나쁜 습관으로 간주되며 스택 할당보다 느리고 수동으로 할당을 해제해야하기 때문에 더 위험합니다.

나는 또한 오래된 책에주의를 기울이고, 그들은 오래된 관행을 가르칩니다. 나는 개인적으로 신뢰할 수있는 포럼 / 웹 사이트, stackoverflow / isocpp를 선호합니다.


감사. 공부할 언어 특성보다는 수행해야 할 작업에 대한보다 광범위하고 일반적인 조언 / 권장 사항을 찾고있었습니다.
spaceOwl

"피하는 것은 new"현명한 권장 사항이 아닙니다. new포인터가있을 때 사용 합니다. 의 경우 class Derived : Basea Base var = Derived();는 불법이지만 Base *var = new Derived();합법적입니다. 따라서 다형성이 제대로 작동하려면 포인터가 필요합니다.
bobobobo 2016 년

예, 그러나 std :: unique_ptr을 사용하여 다형성을 달성하고 알몸 포인터를 피할 수 있습니다 (단, unique_ptr 생성자에 새 키워드가 있더라도)
Eric B

죄송합니다. 위의 의견에서 실수를했습니다. Base var = Derived() 일 것이다 , 그러나 것 슬라이스 당신에게, 미지을하고, 정보가 손실 var. 슬라이싱 문제를 해결하기 위해 포인터를 사용할 수 있습니다.
bobobobo 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.