2009-06-17 6 views
6

Valve와 같은 회사는 게임을 세 가지 주요 게임 플랫폼에 모두 출시 할 수 있습니까? 이상적인 해결책은 모든 플랫폼에 대해 모든 것을 다시 작성하는 대신 최대한 많은 코드를 재사용하는 것이므로 Windows, Xbox360 및 PS3 간의 코드 공유에 관한 모범 사례에 관심이 있습니다.크로스 플랫폼 게임 개발에 대해 어떻게 알 수 있습니까?

답변

6

다른 컨텍스트에서 플랫폼 독립적 인 코드를 작성하는 것과 다르지 않습니다. 범용 인터페이스 뒤에있는 플랫폼 별 세부 정보 (입력, 창 상호 작용, 기본 이벤트 루프, 스레딩 등)를 숨기고 지원하려는 모든 플랫폼에서 정기적으로 테스트하십시오.

Cell의 스레딩 모델은 "일반적으로"스레딩하는 데 약간의주의가 필요하다는 점에서 이례적인 것입니다. 저는 밸브 직원이 아니며 자신의 비밀도 알지 못합니다. 그러나 PS3를 목표로 삼고 자하는 대부분의 게임 개발자는 개별 셀 프로세서가 필요한만큼 작업 큐를 사용한다는 사실을 알고 있습니다. 이것은 반드시 Cell을 사용하는 최선의 방법은 아니지만 더 일반적인 스레딩 모델 (예 : frex, PC 및 360 모두 사용하는 모델)로 일반화됩니다.

2

몇 년 전에 오페라의 CEO는 인터뷰에서 독립 플랫폼 개발의 핵심은 단일 OS/플랫폼 라이브러리에서 벗어나는 것이라고 말했다. 그는 계속해서 OS 성능을 향상시키는 자체 라이브러리를 개발했다고 말했습니다.

제 생각에 대기업에는 Xbox, PS, Windows, FooOS, 팀이 따로 있습니다. 각 플랫폼은 다르게 조정해야하며 다른 구현 방법이 필요합니다. 나는 그들이 모든 플랫폼에 대해 하나의 소스를 수행한다고 생각하지 않는다. 오히려 각 운영 체제마다 하나씩 구축하여 효율성을 향상시킵니다. EA가 PC 버전보다 먼저 콘솔 게임을 출시 했었다는 것을 기억하고 있습니다.

다른 문제는 서로 다른 하드웨어가 서로 다른 프로그래밍 기술을 필요로한다는 것입니다.

두 가지 극단이 있습니다. 예를 들어 모두 자바에 맞는 하나의 소스를 구축하지만 비효율적 인 위험을 감수하거나 40 버전을 작성하십시오. 하나는 각 플랫폼에 최적화 됨

1

전 교육용 컴퓨터 게임에 친구를 사귈 때 (The Learning Company가 분야를 강타하기 전까지) 그는 모든 것을하기위한 플랫폼 간 라이브러리를 만드는 훌륭한 팬이었습니다.

다른 게임보다 게임에서 더 쉽습니다. 예를 들어, Mac 및 Windows에서 실행되는 워드 프로세싱 응용 프로그램을 사용하는 경우, Mac에서는 Mac 응용 프로그램, Windows에서는 Windows 응용 프로그램처럼 보이고 동작해야합니다. 게임을 작성하면 기본 동작, 모양 및 느낌을 준수 할 필요가 없습니다.

4

Game Developer Magazine 기사와 GDC 협상이 주제에 있습니다. 사실, GDC08에서 밸브, they delivered a talk describing their approach을 언급 한 이래로.

이 정말 내가 (그리고이) 시간에 따라 시간에 대해 이야기 할 수있는 큰 주제이지만, 엘리베이터 요약은 다음과 같습니다

  • 는 엔진의 부품이 완전히 플랫폼 별있는 결정하고 뒤에 넣어 추상화. 예를 들어 파일 및 자산로드는 각 콘솔마다 다시 작성해야합니다. 게임 코드가 말하는 유니폼 API를 제공하는 IFileSystem 인터페이스 뒤에 숨길 수 있습니다.
  • PS3는 추상화 지점이 다른 플랫폼과 완전히 다른 곳이어야하므로 어렵게 만듭니다. 충돌 및 탐색과 같은 게임 기능조차도 셀에 대해 다르게 작성해야합니다.
  • 가능한 한 플랫폼에 독립적 인 리프 게임 코드 (엔티티, 인공 지능, 시뮬레이션)를 유지하려고 시도하십시오 ...
  • 그러나 게임 코드의 가장 잎이 많은 페이지라도 때때로 perf 또는 메모리에 대한 플랫폼 별 #ifdef 또는 TCR 이유. 제조사가 서로 상충되는 인증 요구 사항을 가지고 있기 때문에 UI를 많이 재 작성해야합니다.
  • "성능에 대해 걱정하지 않는다"또는 "메모리가 문제가되지 않는다"는 말을하는 사람은 급여에 포함되지 않아야합니다.
+2

"성능에 대해 걱정하지 않는다"또는 "메모리는 문제가 아닙니다"라고 말하는 사람은 급여에 포함되지 않아야합니다. " 슬프지만 사실이야. 대부분의 종류의 소프트웨어의 경우, 사람들은 원근법으로 올바른 코드를 신속하게 작성하는 데 큰 도움이 될 수 있습니다. 게임 개발에서 그들은 독약입니다 : - / –

3

이 질문은 두 개의 별도의 질문들로 나눌 수 있습니다 (물론, 더 PS3 나 XBOX360 지원하지만, 동일한 원칙이 적용되지 않는다). "어떻게 휴대용 코드를 작성할 수 있습니까?" "주류 게임 플랫폼의 다양한 요구 사항은 무엇입니까?"

첫 번째 질문은 상대적으로 대답하기 쉽습니다. 이 아닌 휴대용 코드를 추출하기위한 가장 좋은 방법은 쓰기 휴대용 코드에 설명되어 있습니다 : http://books.google.ca/books?id=4VOKcEAPPO0C&printsec=frontcover

연습에 이론을 켜기, 퀘이크 3 소스 코드는 C 코드베이스에 대해 별도의 영역으로 다른 플랫폼을 나누는 꽤 좋은 일을한다, available at http://www.idsoftware.com/business/techdownloads/ 그러나 플랫폼 당 한 번 구현 된 추상 인터페이스와 같은 C++ 패턴은 보여주지 않습니다.

질문의 두 번째 부분 인 "주류 게임 플랫폼의 다양한 요구 사항은 무엇입니까?" 더 어렵습니다. 그러나 가장 큰 변화의 영역은 여전히 ​​렌더러, 오디오 하위 시스템 및 네트워킹입니다.

각 콘솔 플랫폼에는 일련의 인증 요구 사항이 있으며 각 콘솔 소유자와의 계약에 따라 사용할 수 있습니다. 요구 사항은 사용자 경험의 일관성을 유지하고 게임 플레이 또는 정 성적으로 높은 수준의 문제에 집중하지 않습니다. 예를 들어, 게임에서 합리적으로 흥미로운 움직이는 로딩 화면을 표시해야 할 수 있으며 검은 색 화면은 받아 들일 수 없습니다.

가능한 한 빨리이 설명서를 준비하는 것이 특정 콘솔 플랫폼을 개발할 때 올바른 선택을하는 열쇠입니다.

마지막으로 콘솔 devkit을 사용할 수없는 경우 Windows에서 Mac으로 코드를 포팅하는 것이 좋습니다. Mac은 OS 포트를 제공하여 유니버설 바이너리를 지원하는 경우 Windows뿐만 아니라 프로세서 포트에도 연결되지 않도록합니다. 이렇게하면 코드가 엔디안에 영향을받지 않습니다.

PC와 Mac을 모두 지원하는 경우 나중에 액세스 할 수 있으면 세 번째 플랫폼을 지원할 수있는 좋은 위치에 있습니다.

부록 당신이 쓴 :

이상적인 솔루션 대신 모든 플랫폼 많은 게임 포팅 시나리오에서

에 대한 전체를 다시 작성 가능한 한 많은 코드를 재사용하는 것입니다, 가능한 한 많은 코드를 재사용하지만 각 플랫폼에 대해 최적의 코드를 작성하려면 이 아닌이 이상적 솔루션입니다.코드는 프로젝트간에 재사용 될 수 있으며 엔진이 가져 오는 컨텐츠와 비교할 때 상대적으로 저렴합니다.보다 합리적인 목표는 수정없이 모든 플랫폼에서 실행되는 최소 공통 분모 컨텐츠를 목표로하는 것입니다 (미디어 용 컨텐츠를 압축하는 빌드 단계 괜찮다).

3

동시에 개발하는 것이 좋습니다. 하나의 플랫폼만으로는 찾을 수없는 모든 종류의 버그를 발견 할 수 있습니다.

저 메모리에 쓰기가 즉시 충돌하지 않았기 때문에 DOS의 프로그래머는 항상 null 포인터를 가지고있었습니다. Amiga, Atari ST 또는 Macintosh로 포팅 할 때 붐! 도스 프로그래머에게 아슬 아슬하게 배송 된 게임에 몇 개의 null 포인터가 있다고 말한 것을 기억합니다. 그는 몇 초 동안 생각하고 웃으며 말했다. "그건 몇 가지를 설명해줍니다."

이제 게임에 큰 예산이 생겼으므로 마케팅과 광고 예산을 낭비하지 않도록 게임을 모두 동시에 운송해야합니다.

동시 개발에 대한 조언은 하나의 리드 플랫폼을 선택하는 것이지만 다른 플랫폼 (들)은 1 주일 이상 뒤지지 않도록하십시오. 코드의 어떤 부분이 모든 플랫폼에 공통이고 어떤 부분이 다른지를 프로그램 할 때 분명해질 것입니다. 차이점을 하나 이상의 플랫폼 특정 영역으로 가져옵니다.

내 경험은 C/C++입니다. 다른 언어 (예 : Java 및 Objective-c)에 대해 포트해야하는 경우 더 큰 문제입니다.