'게임 개발/관리'에 해당되는 글 157건
- 2012/01/05 온라인 게임에서 일회성 마케팅에 대한 생각 (2)
- 2011/10/09 이진 파일 형상 관리 방법 (4)
- 2011/10/01 추가 근무는 자랑거리가 아닙니다. (2)
- 2011/09/10 팀 플레이어를 채용할 것 (4)
- 2011/07/14 위키(Wiki)는 게임 개발에 적합하지 않습니다.
- 2011/06/30 하나로 관리해야 하는 자료를 여러 개로 나누지 말 것
- 2011/06/06 원격 서비스를 명령행에서 중지하고 다시 시작하기
- 2011/03/19 잠수 패치는 소비자의 알 권리를 무시하는 행위
- 2011/03/12 게임 개발에 테스트 서버는 필수 (2)
- 2011/02/04 소프트웨어 개발에서 일정은 의미가 적습니다. (2)
- 2011/01/09 집단 지성을 활용해서 팀의 문제를 빨리 해결하기 (2)
- 2010/06/12 토털 사커에서 배워야 하는 팀의 운영 (2)
- 2010/01/17 즉흥적인 결정을 피할 것 (2)
- 2010/01/17 데이터 수동 입력을 줄이기 위해서 네이밍(Naming)을 활용할 것
- 2010/01/17 회의를 효율적으로 하는 방법
- 2010/01/10 기획자와 현장 고객의 비교 (2)
- 2010/01/09 스크럼(Scrum) 프로세스에 대한 의문 (2)
- 2010/01/09 퍼포스(Perforce)에서 잘못된 체인지리스트(Changelist)를 지우는 방법
- 2009/09/13 추정하지 말고 측정할 것 (2)
- 2009/09/10 TortoiseBlame을 활용해 보아요
- 2009/09/06 외주 결과물에 의존하는 것을 줄일 것 (2)
- 2009/09/06 의존적 공동 작업은 폴링(Polling) 방식이 아니라 이벤트 드리븐 (Event-Driven) 방식이 돼야 합니다 (2)
- 2009/08/09 TortoiseSVN에서 ignore-on-commit을 활용해서 불필요한 커밋 막기
- 2009/07/09 문제를 편법으로 해결하려고 하지 말고, 되도록 장기적 관점에서 접근하고 해결하세요 (2)
- 2009/07/04 외부 도구의 갱신 필요성을 판단하는 기준
- 2009/06/21 서브버전(Subversion) 저장소 일부를 다른 저장소와 동기화하는 방법
- 2009/06/13 서브버전(Subversion) 서버 없이 TortoiseSVN으로 로컬 저장소 만들기 (2)
- 2009/06/08 효율적인 소프트웨어 형상 관리 저장소 관리 방법
- 2009/06/07 게임에서 스크립트 언어의 올바른 활용 방안 (2)
- 2009/06/07 게임 리소스 파일 무결성 보장 방법 (2)
sc \\server_name stop service_name:stop_waitsc \\server_name query service_name | find "STOPPED"if errorlevel 1 goto stop_waitsc \\server_name start service_name:run_waitsc \\server_name query service_name | find "RUNNING"if errorlevel 1 goto run_wait
결정을 서둘지 말라. 하룻밤을 자고 나면 좋은 지혜가 생긴다. - 푸시킨
p4 change -d [번호]예: p4 change -d 1000
어떤 사람은 문제를 정공법으로 공략하려고 하지 않고, 지금 당장 쉽고 편해 보이는 방법으로 해결하려고 합니다. 재치가 있다거나 영리하다는 평가를 받는 사람이 대개 이런 경향을 갖습니다. 이런 사람이 제안하는 방법을 관리에 도입하면 나중에 상당히 골치 아파집니다.
임시방편은 그 순간엔 유용한 해결책이 될 수 있습니다. 하지만, 임시방편은 시간이 지날수록 아무것도 하지 않는 것보다 못하게 되는 때가 잦습니다. 문제는 되도록 장기적 관점에서 접근해서 근본적인 부분을 해결해야 합니다. 임시방편은 어디까지나 임시로 쓰여야 합니다.
문제를 해결하는 방법을 선택하는 기준은, 어떤 방법이 지금 당장 제일 편한가가 아니라, 어떤 방법이 제일 합리적인가입니다.
게임 개발을 하다 보면, 외부에서 제작한 도구를 많이 사용하게 됩니다. 예를 들어, 컴파일러, 그래픽 소프트웨어, 게임 엔진, 그리고 기타 라이브러리 등입니다. 이런 도구는 새 버전이 계속 나오는데, 과연 새 버전을 계속 적용해야 하는지 판단하기 어렵습니다. 이럴 때엔 제일 많은 사람이 사용 중인 버전으로 계속 갱신하는 게 좋습니다.
외부 도구를 지속적으로 갱신하면 다음과 같은 장점이 있습니다. 지원을 쉽게 받을 수 있고, 필요한 기능이 이미 구현돼 있을 수 있으며, 최적화나 버그 수정이 더 돼 있을 수도 있습니다. 반면에 외부 도구를 갱신하지 않으면 다음과 같은 장점이 있습니다. 예상치 못한 부분에서 문제가 생길 확률이 적고, 커스터마이제이션(customization)이 좀 더 쉬우며, 손에 익숙하므로 생산성이 높습니다.
위와 같이 어느 방식이 항상 더 낫다고 말할 순 없어서, 프로젝트의 상황에 따라 결정하는 게 바람직합니다. 하지만, 기본적으로는 제일 다수가 사용하는 버전을 그대로 따라가는 게 장기적으로 봤을 때 편합니다. 장기적으로 볼 때엔 유지보수라는 측면이 제일 중요한데, 어떤 버전이 얼마나 지원을 쉽게 받을 수 있고 얼마나 다수의 개발자가 그 일을 할 수 있는지 생각해 보면, 왜 다수가 사용 중인 버전을 따라가는 게 좋은지 알 수 있습니다.
저장소의 내용 일부를 외부 저장소에 그대로 반영시켜야 할 때가 있습니다. 예를 들면, 개발팀의 소프트웨어를 QA팀에 제공한다든지 할 때입니다. 이런 일을 할 때에도 어떤 방법이 가장 효율적일지 생각해 봐야 합니다.
우선 이럴 때 접근 권한을 어떻게 할 것인지 정해야 합니다. 예를 들어, 개발팀의 저장소를 열어 주고 QA팀에게 읽기 권한만 줄 수도 있을 것이고, QA팀에게 저장소를 열어 달라고 하고 쓰기 권한을 얻을 수도 있을 것입니다. 전자의 방법을 채택하면 동기화를 고민할 필요가 없으니까 제일 좋습니다. 여기서는 후자의 방법을 채택해야만 하는 상황을 가정합니다.
동기화 방법으로 제일 쉽게 떠오르는 것은 변경된 파일을 모았다가 QA팀의 저장소에 복사하고 직접 커밋하는 방법일 것입니다. 하지만 이 방법은 변경된 파일 목록을 일일이 관리해야 하는 문제가 있으므로 추천하지 않습니다.
대안은 서브버전이 관리해 주는 변경된 파일 목록을 이용해 합병(merge)을 사용하는 방법입니다. 이 방법은 개발팀에서 QA팀에게 최신 소프트웨어를 항상 제공하고 싶지는 않을 때 좋습니다. 개발팀에서 소프트웨어를 넘겨 줘야 할 때마다 QA팀 저장소에 합병하면 됩니다.
만약 QA팀이 개발팀의 최신 버전을 항상 자동으로 얻고 싶어 한다면, 서브버전의 external 기능을 사용하면 됩니다. 동기화가 자동으로 되므로, 특별한 문제가 없다면 이 방법이 좋겠습니다.
형상 관리를 하려면 대개 서버 애플리케이션을 설치해야 하는 번거로움이 있습니다. 하지만 TortoiseSVN을 사용하면, 서버를 설치하지 않고도 로컬 저장소를 만들고 형상 관리를 할 수 있습니다. 이 기능은 개인적으로만 사용하는 자료가 있는데, 백업만으로는 충분하지 않고 버전 관리를 해야 하는 파일이 있을 때 유용합니다.
로컬 저장소를 만드려면 탐색기에서 마우스 오른쪽 버튼 클릭으로 컨텍스트 메뉴를 띄운 다음에 'Create Repository here...'를 선택하면 됩니다. 로컬 저장소의 경로는 file:///D:/work와 같은 형태입니다. (\가 아니라 /입니다.) 자세한 사용법은 Chapter 3. The Repository을 참고하시면 됩니다.
기본적으로, 하나의 형상 관리 저장소에 들어가야 할 자료는 해당 소프트웨어의 빌드에 필요한 모든 자료입니다. 소스 코드(.cpp, .h, .sln 등), 모델링 데이터 원본(.max 등), 이미지 데이터 원본(.jpg, .png, .psd등), 각종 기획 문서(.doc, .xls 등), 소스 코드가 없는 라이브러리 파일(.dll, .lib 등), DB 스키마 등 해당 소프트웨어를 빌드하고 유지보수할 때 필요한 모든 자료를 다 넣어야 합니다. 소스 코드를 제외한 데이터의 원본을 저장소에 넣지 않는 개발팀이 많은데, 이러면 나중에 데이터를 수정해야 할 때 원본이 없어서 수정을 못 하는 불상사가 생깁니다. 하지만, 빌드에 필요한 각종 외부 소프트웨어는 버전 관리가 필요없고 용량만 많이 차지하므로 저장소에 넣지 말아야 합니다. 그런 소프트웨어는 다른 파일 공유 서버에 보관하고 링크만 저장소에 넣어 두는 게 좋습니다.
배포용 데이터가 모여 있는 폴더엔 원본을 넣지 말아야 합니다. 원본을 넣어 놓으면 사용자에게 공개할 우려가 있고, 나중에 배포할 때 불필요한 파일을 걸러 내는 작업을 해야 하는 번거로움도 생깁니다.
브랜치(branch)는 소프트웨어 개발에서 필요악입니다. 브랜치에서의 작업이 적으면 적을수록 관리하기 좋습니다. 게임 개발에서는 텍스트 파일이 아닌 이진 파일을 병합해야 하는 일이 자주 발생하는데, 이진 파일을 병합하는 것은 어렵습니다. 그러므로, 게임 개발 시엔 브랜치 사용을 더더욱 최소화해야 합니다. 하지만 그렇다고 브랜치 없이 개발을 진행하는 것은 거의 불가능합니다.
빌드를 통해 만들어 낼 수 있는 파일은 저장소에 올리지 않는 게, 저장소 용량을 아낄 수 있고 충돌이 생기지 않으므로 좋습니다. 하지만 예외적으로, 파일 패킹 등의 추가 과정을 거쳐야 최종 배포본을 얻을 수 있을 때엔 최종 결과물도 저장소에 올려 놓는 게 편합니다. 사내 QA 팀 등에 실제 사용자의 것과 최대한 비슷한 배포본을 빠르게 배포할 수 있기 때문입니다. 그런데 큰 파일을 올려 놓으면 저장소의 크기가 너무 커지는 게 아닌가 걱정할 수 있습니다. 하지만 서브버전 등의 소프트웨어는 파일의 변경 사항만 누적 기록하는 방식을 쓰므로, 파일 내용이 버전마다 많이 바뀌지 않는다면 크게 문제가 되지 않습니다.
빌드로 생성 가능한 실행 파일도 저장소에 넣지 않는 게 원래 원칙입니다. 하지만 시험용으로 배포할 때 실행 파일도 같이 받을 수 있게 하면, 실행 파일과 데이터의 버전이 안 맞을 우려도 없고 배포하기도 편해서 좋습니다. 따라서 로컬 빌드된 실행 파일이 위치할 폴더를 하나 만들고, 빌드 서버가 배포할 실행 파일을 커밋할 폴더는 따로 두는 게 좋습니다. 예를 들어, 빌드된 실행 파일이 위치할 폴더가 local_binary라면 빌드 서버가 배포할 실행 파일 폴더는 binary로 하면 됩니다. 데이터 참조는 "../data" 식으로 똑같이 참조할 테니 문제가 없습니다.
참고:
요즘 게임 개발자는 스크립트 언어를 많이 사용하고 있습니다. 문제는 스크립트 언어를 남용하는 때가 적지 않다는 것입니다.
스크립트 언어를 프로그래머만 사용하고 편집이나 디버깅이 까다롭다면, 스크립트 언어 사용의 큰 장점을 살리지 못하는 것입니다. 게임 개발에서 스크립트 언어를 사용하는 최대 장점은, 프로그래머가 아닌 사람이 게임 로직을 제어할 수 있다는 것입니다. 이 장점을 살리지 못하는 스크립트 사용은, C++ 대신에 다른 언어를 사용하는 것일 뿐입니다. 프로그래머만 스크립트 언어를 사용한다고 해도, 빌드와 게임 로딩에 걸리는 시간을 줄인다거나 코드가 간결해지는 장점이 있을 수도 있습니다. 하지만 낯선 언어, 기능이 부족한 편집기와 디버거, 그리고 C++과의 연동 작업 등을 고려하면, 단점이 더 많습니다.
텍스트 데이터 표현을 스크립트 언어로 하는 것도 스크립트 남용의 좋은 예입니다. 스크립트 언어는 로직을 제어하는 데에만 써야 합니다. 텍스트 데이터 표현엔 XML이나 엑셀 문서 등의 좋은 포맷이 많이 있습니다.
스크립트 언어는 분명히 장점을 갖고 있지만, 단점이 더 많은 일에도 스크립트 언어를 사용하는 것은 좋은 선택이 아닙니다.
무효한 자료 입력을 막는 제일 좋은 방법은 입력 시 무효한 값을 입력할 수 없게 원천봉쇄하는 것입니다. 엑셀(Excel)이나 액세스(Access)에서는 필드 값의 범위를 정할 수 있고, VBA를 써도 유효성 검사를 할 수 있다고 합니다. 써 보진 않았지만, XML에서도 스키마를 이용하면 유효성 검증이 된다고 합니다.
두 번째로 고려해야 할 방법은 유효성 검사 도구를 만드는 것입니다. 직접 도구를 제작하지 않고는 유효성 검사가 불가능한 때도 있으므로, 거의 필수적인 도구입니다. 이 도구를 만들어서 빌드 서버가 빌드할 때 유효성 검사도 함께하게 하면 좋습니다. 각 리소스 작업자가 이 도구를 커밋 전에 항상 실행할 수도 있겠지만, 그건 좀 불편합니다.
리소스 파일 관리를 어떻게 할 것인가는 게임 개발에서 상당히 중요한 일입니다. 따라서 관리자는 이런 문제를 어떻게 하면 쉽게 해결할 수 있을지 계속 고민해야 합니다.
참고:
엑셀을 이용한 데이터 입력의 딜레마
엑셀로 작업한게임데이터의 유효성검사에대해..

댓글을 달아 주세요
개발자의 관점에서는 그렇습니다. 하지만 마케팅팀에서는 어떨까요?
마케팅팀은 어떻게 해서든 가입자를 끌어모으면, 잘한것이고, 아니면 못한것입니다. 컨텐츠가 재미가 없어서 2레벨도 못키우고 접든말든, 가입자만 쑤셔넣으면 장땡입니다.
더군다나 마케팅팀의 권한이 강력할경우, 마케팅계획에 따라서 개발진행이 되는경우도 허다합니다.
"신규컨텐츠라고?, 무슨 헛소리야? 발렌타인데이 이벤트가 코앞이라고!!"
"마비노기는 "나오" 같은 NPC 로 마케팅을 하는데, 우리는 그런게 없잖아? 우리도 뭔가 NPC 구성을 바꿔야 하겠는걸?"
개발팀장이 정치력이 없다면? 더이상 자세한 설명은 생략하겠습니다.
네.. 한 제품과 연관된 여러 조직의 성과가 따로 측정되는 방식에서는 말씀하신 문제가 필연적으로 발생하는 듯합니다. 그리고 대개 마케팅팀이나 사업부의 입김이 개발팀보다 세서, 게임의 방향이 엉뚱하게 가는 경우가 많네요.