C ++이 왜 게임 개발에 인기가 있고 다른 언어가 아닌지 궁금합니다. 나는 당신이 그것으로 매우 빠른 코드를 만들 수 있다는 것을 알고 있지만, 그것을 인기있게 만드는 것은 무엇입니까?
빠르기 때문입니까? OO 패러다임이나 이식성과 같은 언어의 다른 기능입니까? 시간이 지남에 따라 작성된 모든 라이브러리 때문입니까? 아니면 이러한 모든 이유와 다른 이유의 조합?
누군가가 나를 채워 줄 수 있다면 매우 기쁠 것입니다. :-)
C ++이 왜 게임 개발에 인기가 있고 다른 언어가 아닌지 궁금합니다. 나는 당신이 그것으로 매우 빠른 코드를 만들 수 있다는 것을 알고 있지만, 그것을 인기있게 만드는 것은 무엇입니까?
빠르기 때문입니까? OO 패러다임이나 이식성과 같은 언어의 다른 기능입니까? 시간이 지남에 따라 작성된 모든 라이브러리 때문입니까? 아니면 이러한 모든 이유와 다른 이유의 조합?
누군가가 나를 채워 줄 수 있다면 매우 기쁠 것입니다. :-)
답변:
수많은 이유 :
@Graham이 제기 한 것 외에도 언급하고 싶은 몇 가지 이유가 있습니다.
low-level
언어입니다. 그러나 high-level
어셈블러, IMO.
원시 속도는 주된 이유이지만 실제로 많은 게임 회사가 게임의 일부로 다른 언어를 사용하기 시작하는 것은 하나의 결정이 아닙니다. 특정 작업은 컴퓨터가 가능한 한 빨리 작동해야하지만 (예 : 핵심 렌더링 루틴) 게임 플레이 코드의 많은 작업이 그렇게 빨리 실행될 필요는 없습니다 (예 : 플레이어가 클릭 할 때 문을 열어야 함). 이러한 부분에 대해 훨씬 더 간단한 언어를 사용하는 것이 현명합니다. 그렇기 때문에 많은 게임 엔진이 C ++로 작성되었지만 게임 플레이 코드 작성을 위해 Lua와 같은 스크립팅 언어가 내장되어 있습니다.
이해해야 할 까다로운 점은 프로그래밍 언어를 선택할 때 컴퓨터의 효율성과 프로그래머의 효율성간에 전반적인 상충 관계가 있다는 것입니다. 즉, 컴퓨터가 얼마나 빨리 코드를 실행하거나 프로그래머가 얼마나 빨리 코드를 작성 하는가?
C ++에서는 함수 종료 후 사라지는 로컬 변수를 할당 할 수 있습니다. 일반적으로 이들은 스택에 할당됩니다.
스택 변수는 조각화 및 오버 헤드의 동적 메모리 할당 문제에 영향을 미치지 않습니다. 스택에 공간을 할당하는 것은 빠르고 쉽습니다 (포인터를 조정하기 만하면됩니다). 동적 메모리 할당에는 일반적으로 컨테이너에서 적절한 메모리 블록을 검색하여 메모리를 표시 한 다음 점유 된 것으로 태그를 지정합니다. 할당 해제에는 메모리 블록을 컨테이너에 추가하고 기존 블록과 병합 할 수 있습니다. 포인터를 변경하는 것보다 훨씬 많은 오버 헤드가 있습니다.
Java 및 C #은 기본 유형을 제외하고 메모리를 동적으로 할당합니다. 이러한 언어는 런타임 환경에 의존하여 삭제할 변수를 표시 한 다음 가비지 수집기를 임의의 (예약되지 않은) 간격으로 실행하여 메모리를 회수합니다. 일반적으로 프로그래머는 변수가 언제 삭제 대상으로 태그 지정되는지 또는 언제 다시 확보되는지에 대해 제어 할 수 없습니다 (사용 된 메모리 교정은 대부분의 C ++ 및 Java 프로그래머가 경험하지 않는 고급 주제입니다).
C ++의 속도는 주로 실행 코드로 직접 변환되기 때문입니다. Java 및 C #은 중간 코드로 컴파일 된 다음 가상 머신에서 해석됩니다. 일반적으로 해석 언어는 직접 번역 된 언어보다 성능이 느립니다.
structs
. 더 많은 지점으로, 매우 매우 당신이 아닌 속도의 작은 증가는이 그물 거의 다른 통해 하나 개의 언어를 정당화하기에 충분. 실제 이유는 @Graham Perks에 의해 명시되어 있습니다. 이것이 게임 개발자가 알아야 할 것이기 때문에 새로운 게임 개발자가 배우는 것 및 새로운 SDK가 목표로하는 것입니다. 언어만큼 빠르거나 더 빨리, 그리고 (예. 이동)이 많이 있습니다 거의 불편 등을 위해 쓰기로는.
게임은 컴파일러가 없었던 이국적인 하드웨어를 가지고 있었기 때문에 기계어로 작성되었습니다. 또한 하드웨어에는 효율적인 16 비트 정수 수학과 같이 C 프로그래머가 당연하게 생각하는 기능이 부족했습니다.
게임이 익숙한 하드웨어에 정착하면 C 컴파일러를 사용할 수있게되었고 단시간에 모든 게임이 C로 작성되었습니다.
C ++은 한 번에 좋은 생각처럼 보였고 오늘날 대부분의 게임은 C ++이지만 엔지니어는 이제 C로 돌아 오는 것에 대해 불평하고 있으며 실제로 일어날 수 있습니다. 저는 C에서 게임을하고 싶어서 많은 동료들과 같이 일하고 싶습니다. 게임을 향상시키는 것으로 생각되는 C ++에는 새로운 기능이 없습니다.
컴퓨터가 몇 년 전보다 1000 배 빨라진 것처럼 보이며, 고급 언어는 개발 시간 ($)을 줄여 C를 쓸모 없게 만듭니다.
게임 구매자는 하드웨어가 1000 배 더 우수하다는 것을 알고 1000 배 더 좋아 보이고 들리는 게임을 위해 돈을 교환하기를 원하기 때문에 이런 일이 발생하지 않았습니다. 이것은 고급 언어가 사용하는 시스템의 여유를 제거합니다.
게임의 성능 요구 사항은 잔인합니다. 새로운 그래픽 프레임은 반드시 33ms (또는 16ms!) 이내에 렌더링되어야합니다. 이 예산이 충족 될 수 있도록 하드웨어가 수행하는 모든 사항을 고려해야합니다. 프로그래머가 이해하지 못하거나 기대하지 않는 하드웨어와 관련이있는 언어는이 예산을 맞추기가 매우 어려워 질 것입니다. 이것은 상위 레벨에 대한 자동 마이너스입니다.
게임 프로그래머는 낮은 수준의 언어로 작업 할뿐만 아니라 높은 수준의 데이터 구조와 알고리즘도 피합니다. 게임에는 일반적으로 연결된 목록이없고 나무가 거의 없습니다. 가능할 때마다 포인터를 피하는 움직임이 있습니다 *. O (N) 시간 또는 O (1) 공간을 초과하는 알고리즘은 널리 사용되지 않는 경향이 있습니다.
* 포인터가 캐시 미스를 유발하지 않는다면 왜 32 비트를 사용하여 저장합니까? 포인터로 인해 캐시 미스가 발생하면 해당 캐시 미스를 제거하는 것이 가장 좋습니다.
human
유도체에 player
와 enemy
?
모든 프로그래밍 언어에는 다양한 요소에 걸쳐 장단점이 있습니다. 이러한 요인의 예는 다음과 같습니다.
게임 프로그래머가 관심을 갖는 가장 중요한 요소 중 하나는 성능입니다. 대화식 경험을 원합니다. 즉, 반응이 좋으며 최대한 유용한 (또는 흥미로운) 데이터를 출력 할 수 있어야합니다. 당신은 언제든지 당신이 얼마나 많은 건강을 알고 싶어하고 그것을 기다리지 않습니다. 그리고 버튼을 클릭하면, 총을 발사하거나 캐릭터가 말할 때 점프 할 것으로 예상됩니다. 약간의 지연은이 상호 작용을 방해 할 수 있으므로 성능이 필요합니다.
또 다른 중요한 요소는 문제의 언어보다는 구현의 언어로 프로그래밍하는 것을 선호하는 것입니다. 게임 프로그래머는 메모리 레지스터 ED0이 아니라 인간, 오크 및 경주 용 자동차를 다루려고합니다. 그들은 여전히 성능이 필요한 경우 구현 세부 사항을 살펴볼 수있는 옵션을 원하지만 대부분의 경우 게임 세계의 엔티티 수준을 처리 할 수 있다면 좋을 것입니다. 그들은 연결된 목록이 어떻게 작동하는지 항상 신경 쓰지 않고 게임 세계를 시뮬레이션하는 것에 대해 걱정할만큼 충분합니다.
C ++은이 두 가지 주요 요소에 매우 적합합니다. 객체의 표현성을 통해 어셈블리 또는 C 코드의 성능 이점을 얻을 수 있습니다. 이것이 왜 게임에 적합한 지 알아 보려면 다른 언어 옵션과 비교하십시오.
마지막 요점은이 중 일부는 역사적이고 정치적인 것입니다. 다른 프로그래밍 언어들 사이에서 많은 화염 전쟁이 벌어졌습니다. 예를 들어 C #은 게임 개발에 적합 할 수도 있지만 C ++ 이후에 나왔습니다. 또는 사람들은 Microsoft의 것이 마음에 들지 않습니다. 어떤 사람들은 C #으로 옮겨 갔지만 그렇지 않은 사람들도있었습니다. 어떤 사람들은 여전히 베이직, 파스칼, C로 게임을 프로그래밍합니다. 게임 프로그래머는 C와 C ++로 자랐기 때문에 대부분 C ++에 익숙해졌으며 요구를 충족했습니다. 만약 컴퓨터 산업이 자바의 성능과 흡수가 충분한 사람들을 만족시키는 상태에 있다면, 아마도 자바는 사실상 표준 게임 개발 언어 일 것이다.
레거시와 운동량.
옛날에 타임 코드는 최고의 성능을 위해 어셈블러로 작성되었습니다. 컴퓨팅 성능이 향상됨에 따라 컴파일 된 언어는 더욱 실용화되었으며 C는 매크로 어셈블러에 불과한 매우 기본적인 수준에서 성능과 생산성 사이에서 최상의 절충안을 제공했습니다.
C ++은 C의 후계자 일뿐입니다. 이전 코드 나 지식은 버리지 않고 새로운 방법론으로 확장 할 가능성이 있습니다. C ++은 궁극적으로 매우 유연하며 성능에 대한 거의 완전한 제어를 유지할 수는 있지만 C ++에서는 시뮬레이션 할 수없는 디자인 패러다임을 아직 보지 못했습니다.
콘솔 용으로 개발하는 경우 선택의 여지가 없습니다. 전문 SDK는 C ++ 버전으로 만 제공됩니다. 일반적으로 그들은 또한 대부분의 것들에 C 액세스 할 수 있습니다.
많은 개발자가 Consoles + PC이므로 모든 PC 작업을 동일한 언어로 수행하고 기술을 직접 공유하는 것이 좋습니다.
그것이 바로 프로 산업이 살고있는 곳이고 대부분의 사람들이 그 일부가되기를 원하기 때문에 대부분의 게임 프로그래머는 C ++ 프로그래머입니다.
이 모든 것이 발생하기 때문에 대부분의 엔진 개발자는 C ++ 개발자이기도합니다. 따라서 전문가 급 엔진을 평가할 때는 거의 모든 선택이 C ++이됩니다.
그것은 모두 큰 자기 유지 엔진입니다. 이를 중단하려면 기술적 인 발전 이상의 것이 필요합니다.
나는 상당히 C, C 및 C ++에 상당히 중점을두고 있지만, 다른 언어가 거의 없다는 것은 실행중인 플랫폼을 완전히 제어하는 것입니다. 항상 무슨 일이 일어나고 있는지 정확히 알 수 있습니다. GC, 결함 없음.
요즘에는 중요하지 않지만 저전력 플랫폼에 적합 할 수 있습니다.
PC / Mac / Linux에서는 요즘 접할 수있는 언어가 가장 적을 것이며 속도 보너스는 더 이상 큰 차이가 아닙니다 .Minecraft (Java)는 매끄럽고 최소한의 플랫폼 (및 모든 OS)에서 작동합니다 단일 실행 파일로-저 기능이 많고 버그가 적은 저 인력 인디 C / C ++ 앱은 아직 세 가지 플랫폼에서 작동하는 것을 보지 못했습니다.
그래서이 시점에서 나는 그것이 대부분 관성이고 실제 게임은 항상 C / C ++에서 수행된다는 개념에 대해 말하고 싶습니다. 비록 iPhone과 콘솔로 "포팅"하는 능력은 중요합니다. 게임 UI는 Windows와 XBox를 제외하고 많은 노력을 기울입니다).