게임 개발을 통한 버전 관리-언제 분기해야합니까?


26

나는 최근에 프로젝트에서 Version Control 을 사용하기 시작했습니다 (단독으로 작업하고 있음에도 불구하고). 전체 개발 프로세스의 역사를 추적 할 수있는 좋은 방법 (문제 추적 포함)을 제공하며 진행중인 프로젝트의 백업을 유지할 수 있습니다.

버전 제어 사용의 기능과 이점을 천천히 발견하면서 브랜칭이라는 아이디어를 고수했습니다. 언제해야합니까?

새로운 기능을 개발하고 개발할 때마다 또는 특정 이정표에 도달 할 때 한 번만되어야합니까?

분명히, 브랜치는 혼자 일할 때 쓸모가 없지만, 지금은 좋은 습관을 고르고 익숙해 지려고합니다.

Mike McShaffry의 Game Coding Complete 책을 읽으면서 (저는 훌륭한 책) 저자가 세 가지 가지를 유지하는 것을 추천했을 때 완전히 잃어 버렸습니다.

  • 주요 : 정기적 인 변경이 이루어지는 주요 개발 지점.
  • : 마지막 마일스톤에 도달 한 금 지점이 유지됩니다.
  • 연구 : 주요 지점에 악영향을 미칠 수있는 물건을 테스트하는 지점 (게임 엔진의 중요한 구성 요소 수정 등)

그것이 어떻게되어 있어야 하는가? 큰 개발자 팀과 게임 개발 세계에서 실제로 어떻게 작동합니까?

기본적으로 : 게임 개발에서 일반적으로 분기되는 지점은 언제입니까?

답변:


32

분기는 기능에 대한 VCS 지원 (예 : VCS로 쉽게 또는 어려운지 여부)에 따라 다릅니다.

그러나 최소한 독립적으로 지원되는 프로젝트 릴리스마다 분기가 필요합니다. 즉, 동일한 코드베이스에서 빌드 된 별도의 제품인 "Game 2"및 "Game 2 + Expansion"이 있고 업데이트를 패치하고 발행 할 수 있어야하는 경우, 이들 각각을 갖기를 원합니다. 핵심 코드베이스에 대한 수정 사항을 각 제품에 독립적으로 병합 할 수 있도록 기본 코드베이스에서 자체 분기에 존재합니다. (일반적으로 이러한 브랜치는 각 제품이 출시 될 때 또는 초기 릴리스와 함께 나가고 싶지 않은 코드베이스의 작업을하는 사람들이있는 경우 몇 일 / 주 전에 생성됩니다)

분기를 까다 롭거나 고통스럽게 만드는 VCS (SourceSafe, svn 등)를 사용할 때 출시 된 각 제품에 대해 "릴리스"분기를 유지하고 "트렁크"에서 주요 개발을 수행하는 것이 가장 행복 할 것입니다. 해당 릴리스에 대한 핫픽스를 릴리스해야하는 경우 "트렁크"에서 "릴리스"분기로 변경 사항 병합

반면에 분기 및 병합 (git, Bazaar, Mercurial 등)을 중심으로 구축 된 최신 VCS 시스템 중 하나를 사용하는 경우 많은 짧은 기간 동안 개발을 가장 즐겁게 수행 할 수 있습니다. 살아있는 "기능"지점. 예를 들어 AI 길 찾기 작업을하는 경우 "길 찾기"분기를 만들고 코드를 구현할 수 있습니다. 완료하면 해당 분기를 다시 기본 개발 트렁크로 병합하고 선택적으로 작업중인 분기를 삭제합니다.이 방법의 장점은 하나의 작업을 완료 할 필요없이 여러 작업을 동시에 수행 할 수 있다는 것입니다. 다음에 시작하기 전에 작업.

현재 홈 프로젝트 (git 사용)에서 현재 다양한 기능을 수행하는 5 가지 기능 분기가 활성화되어 있습니다. 그중 두 가지는 동일한 프로파일 링 (프로파일 링)에 대한 대체 접근법이고, 두 가지는 실험적인 게임 메카니즘 아이디어이며, 하나는 내 AI 시스템의 큰 리 팩터이며 실제로 코드가 제대로 컴파일되지 않는 방식으로 손상되었습니다. 지금. 그러나 참조 및 백업을 위해 기능 분기에 최선을 다하고 있으며 고장 나더라도 다른 기능에 대한 작업을 중단하지 않습니다. 이러한 다른 기능 분기 (및 주요 개발 트렁크도)는 여전히 올바르게 컴파일 및 실행됩니다.

큰 팀의 전문 게임 개발 경험에서 우리는 여전히 구 버전 (및 상업적으로 지원되는) 버전 제어 시스템을 고수하고 있습니다. Perforce가 가장 일반적으로 사용되며 Subversion이 뒤 따릅니다. 내가 일하는 모든 곳에서 우리는 '트렁크'브랜치와 모든 산출물 (마일스톤 / 데모 / 릴리스 / 등)에 대해 별도의 '릴리스'브랜치를 가졌습니다. 때때로 누군가는 그들이 만들고 테스트하고있는 큰 변화를 위해 개인 브랜치를 만들지 만, 이것은 매우 드물며, 실제로는 "게임을 다른 물리 라이브러리로 실행하도록 변환"과 같은 것들에 해당합니다. 출시 된 제품.


1
멋진 답변입니다. 다른 사람들이 자신의 경험에 따라 소금 알갱이를 가져올 지 알아보기 위해 허용되는 답변으로 표시하기 전에 조금 기다릴 것입니다.
Jesse Emond

8

위의 훌륭한 대답은 있지만 분기 할 때와 태그를 지정할 때입니다.

대부분의 vc에서는 태그를 지정할 수 있습니다 (때로는 레이블이라고 함). 플레이 빌드, 베타 테스트 또는 기능이 포함 된 주요 빌드를 만들 때마다 태그를 적용해야합니다. 어떤 종류의 Continuous Integration을 사용하는 경우 CI 시스템은 성공적인 빌드에 태그를 지정해야합니다. 기본적으로 다시 가지를 원할 때 (분기를 만들거나 해당 버전에서 어떻게했는지 확인하기 위해) 태그 / 레이블을 만듭니다. 그들은 일반적으로 저렴하고 추가하기가 간단합니다.

매우 강력하게 권고하는 다른 것은 자산과 코드를 동일한 버전 관리 시스템에 유지하는 것입니다. 자산을 일치시키고 분기 할 수없는 경우 코드의 분기 (또는 태그)를 갖는 것은 완전히 쓸모가 없습니다. 이것이 게임 회사가 Perforce를 좋아하는 주요 이유 중 하나입니다. 바이너리 아트 파일을 코드를 저장하는 것과 마찬가지로 행복하게 저장하는 것이 행복합니다.

아 그리고 언제든지 컴파일 된 파일을 VCS 중지에 체크인하고이를 피할 수있는 방법에 대해 생각하고 싶을 때. 내 경험상 거의 일치하지 않는 데이터, 누락 된 소스 (예 : 압축 된 DDS 텍스처가 체크인되지만 소스 png는 체크인되지 않음) 및 혼란을 초래합니다. 어딘가에 캐시 된 익스포트 된 파일에 의해보다 나은 서비스를 제공하는 자산 파이프 라인이있는 경우 (모든 사람이 동일한 파일 세트를 다시 생성하지 않음) VCS에서 소스 자산을 빌드하고 익스포트 된 파일을 캐시 (또는 공유 드라이브 또는 별도의 VCS). 그러나 내 보낸 파일을 직접 확인하지 마십시오-특히 팀의 일원으로 일하는 경우 물릴 것입니다.


태그 지정에 대한 +1 (내가 이야기하고 싶었지만 이미 말보다 훨씬 말이되지 않고 언급하는 방법을 확신하지 못했습니다). 컴파일 된 (또는 다른 방식으로 처리 된) 파일을 VCS에 체크인하는 것에 대한 좋은 지적은, 그 실수를 저지른 여러 곳에서 일해 왔으며 항상 가슴 아프게됩니다.
Trevor Powell

1

나는 그 책을 좋아했고 관심이있는 모든 사람에게 추천합니다. 한 명의 인디 프로젝트의 경우 별도의 버전을 만들거나 원치 않는 한 실제로 분기 할 필요가 없습니다. 안드로이드 용과 PC 용, 또는 그 라인을 따라있는 것과 같은 것입니다.

당신이 말했듯이, 좋은 습관을 고르려면 Mike의 접근 방식으로 갈 것입니다. 그것은 두 가지 인디 프로젝트에서 사용하는 많은 의미와 접근 방식입니다.


1

아무것도 당신이해야 다시 갈 수 있어야하고 더 많은 일을 할 branchable (아직 ... 반드시 분기하지만).

그 이유는 간단합니다. 다른 코드가 아닌 해당 코드의 고정 버전을 발행 할 수 있어야하므로 해당 지점에서 작업해야합니다.

VCS는 다릅니다. git과 같은 일부는 나중에 커밋에서 분기하기가 매우 쉽고 CVS와 같은 일부는 나중에 작업하기가 매우 번거 롭습니다.

아마도 선택한 버전 제어 시스템에서 최상의 성능을 발휘하는 방법을 묻는 stackoverflow에 대한 질문을하고 싶습니까? 당신이하지 않은 경우 정말 역사의 많은 아직 시작, 당신은 당신이 일을하고 당신을 위해 최상의 버전 제어 시스템의 추천을 요청하는 방법을 설명하는 질문을 열고 할 수 있습니다?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.