더러운 코딩 속임수
Dirty Coding Tricks @ Gamasutra

게임 제작 관련 웹사이트인 가마수트라에 아주 재미있는 기사가 하나 올라왔네요. 일명 '더러운 코딩 속임수'라는 제목으로, 데드라인에 몰린 게임 프로그래머들이 어떻게든 기일을 맞추기 위해 사용한 임시 방편들에 대한 이야기인데요, 더욱 무서운 것은, 모두 실화들이라고 합니다 --a

실제 기사는 위 링크를 따라가면 보실 수 있고 (영어입니다), 시간과 영어의 압박을 느끼시는 분들을 위해 아래에는 제가 재미있다고 생각한 몇 개의 요약을 올려 봅니다.


아, 주의 사항으로, 프로그래밍을 안 해 보신 분들에게는 재미가 없는 얘기도 다소 있습니다.



* Shoot Me From My Good Side 얼짱 각도로 찍어줘

- 모 멀티플랫폼 게임의 PS2 버전에 대한 작업 중, 1스테이지 도입부에서 때때로 게임이 얼어버리는 현상이 발생함. 불행히도 이는 디버깅 정보가 없는 디스크 릴리즈 버전에서만 발생
- 코드 수정->디스크 굽기->게임 실행하여 버그 확인의 과정이 굉장히 오래 걸림
- 이 과정 중에서, 누군가가 카메라 각도가 오른쪽 90도로 잡혀 있을 때는 버그가 발생하지 않는다는 것을 발견
- 데드라인이 다가오면서, 결국 최종 버전에 카메라 각도를 오른쪽 90도로 고정한 채로 출시
- 이와 관련된 고객 불만사항은 접수된 바 없음 -_-


* Identity Crisis 정체성의 위기

- 그 전까지 잘 돌던 게임의 최종 빌드를 만들었는데, 게임이 얼어버림
- 문제는 게임 데이터를 관리하는 시스템에서 발생. 모든 데이터 파일의 ID는 64비트로, 파일명의 CRC32 해시와 실제 데이터 내용의 CRC32 해시의 조합으로 생성. 이 시스템으로 수만 개의 파일을 2년간 관리했으나 지금까지 전혀 문제가 없었음
- 근데 이번에 다른 데이터 파일과 한 텍스트 파일이 우연하게도 같은 ID를 갖게 된 것이었고, 그걸 덮어쓰면서 문제가 발생
- 데드라인은 다음날 아침, 밤새 자원 관리 시스템을 고친다 하더라도, 그것이 문제없이 잘 돌 수 있으리라는 보장은 없음. 모두 절망함
- 어떻게 해결했냐고? 문제가 된 텍스트 파일을 열어서, 파일 마지막에 빈 칸을 하나 넣은 후 다시 저장하여 해결함. 푸헉-_-


* Driving Under the Influence 음주운전
- 다른 사람이 짠 소스 코드를 보는 도중, 다음 코드를 봄

//**************************************************
// Function: AGameVehicle::Debug_GetFrameCount
//
//! A very hacky method to get the current frame count; the variable is protected.
//!
//! \return The current frame number.
//**************************************************
UINT AGameVehicle::Debug_GetFrameCount()
{
BYTE* pEngineLoop = (BYTE*)(&GEngineLoop);
pEngineLoop += sizeof( Array ) + sizeof(
DOUBLE );
INT iFrameCount = *((INT*)pEngineLoop);
return iFrameCount;
}

- 더욱 웃긴건, 같은 오브젝트에 프레임 카운트를 되돌려주는 함수가 분명 존재하고 있었음
- 원 코드를 쓴 사람은, 제정신이 아니었음이 분명함-_-


* 10-Tative Code
- 게임 개발 막판에, 10레벨에서 숨겨져야 하는 오브젝트가 존재했는데, 레벨 전체를 뜯어 고치거나 체크섬을 사용하기는 싫었음
- 그래서 다음 코드를 사용함

if( level == 10 && object == 56 )
{
HideObject();
}

- 약 1년후, 우리 엔진을 사용하는 한 아트 담당자가 10레벨로 오브젝트를 옮긴 후 레벨에 안 나타난다고 불평함. 흠, 과연 왜 그런 현상이 일어났을까나?-_-


* Meet My Dog, Patches 제 애완견 '땜질'입니다
- pc용 3인칭 슈팅 게임을 PS1으로 컨버전 하는 중 발생한 일임
- ps1은 부동소수점 지원이 없던 관계로 모든 부동소수점 데이터를 정수로 변환하는 과정이 필요했음. 이 과정에서 충돌점 측정(collision detection)이 완전히 망가짐
- 이로 인해 만들어진 아주 작은 구멍들로 주인공 Damp가 빠져서 나오지 못하는 버그가 무수히 발생
- 처음에는 발견한 구멍들을 하나씩 고쳤지만, 출판사의 플레이테스팅에서 매일같이 수십개의 '구멍'들을 발견하여 보고가 들어옴
- 결과적으로 사용한 코드는 다음과 같음

damp_old = damp_loc;
move_damp();
if (NoCollision())
{
damp_loc = damp_old;
}

- 말하자면, 다음과 같은 일을 하는 코드임

IF (Damp will fall through a hole()) THEN
Don't do it

뎀프가 구멍으로 빠질 것 같으면 -> 하지 말아라-_-

- 결국 이런 식의 '땜질'로 구멍으로 빠지는 주인공은 막을 수 있었지만, 땜질 때문에 또 다른 땜질이 필요해지고, 이로 인해 원래 계획보다 몇 달이 늦어졌고, 그 몇 달은 대부분 하루에 14시간 이상 일해야만 했음
- 교훈: 문제가 발생하면 땜질로 처리하지 말고 버그를 원인부터 철저히 수정하자


* You Wouldn't Like Me When I'm Angry 날 화나지 않게 하는게 좋을거야
- XBOX360용 The Outfit을 개발하던 중 있던 일. 출시 약 3달 전, 게임은 약 5 fps의 속도로 돌고 있었음. 상당히 심각한 최적화가 필요.
- 엔진에도 문제가 있었지만, 가장 큰 요인은 게임의 내용. 모델이 너무 복잡하던가, 일부 셰이더가 너무 계산이 많이 필요하던가, 캐릭터가 너무 많은 스테이지 등. 하지만 약 100여명의 팀원들을 하나하나 설득하여 이런 것들을 줄이는 건 거의 불가능.
- 해결책은 약 한 시간 정도 걸림. 동료 프로그래머 한 명이 내 얼굴을 찍은 그림을 구석에 집어넣음. 게임이 30 fps 이상으로 돌고 있으면 웃는 얼굴이 뜨고, 20 이하로 돌면 점점 화난 얼굴로 바뀌는 형태.
- 이로 인해 속도 문제에 대한 사람들의 생각은 "에이, 프로그래머들이 고칠 거야 아마."에서부터 "흠, 내가 이거 넣으면 닉(글쓴이)이 매우 화낼거야! 최적화를 좀 더 해 봐야겠다."로 바뀜


* The Programming Antihero 프로그래밍 반영웅
- 늦은 90년대 한 pc 게임 프로젝트의 막판, 게임 내용은 다 좋았지만, 메모리 용량을 다소 초과하는 상태였음
- 며칠간 정말 가능한 모든 방법을 동원하여 죽어라 고생하여 메모리 사용을 줄였지만, 여전히 1.5메가 정도가 초과됨
- 이런 상황에서, 팀 내 가장 경험 많은 분 중 한 명이 직접 문제를 해결하겠다고 함. 필자는 또 메모리를 줄이는 고된 시간이 될 것을 예상하고 그의 사무실로 들어감
- 하지만 그는 한 소스 파일을 열고 아래의 코드를 보여줌

static char buffer[1024*1024*2];

- 그리고 이 줄을 지워버림. 문제 해결!
- 놀란 필자에게 고참 프로그래머 왈, 이 2MB의 메모리는 그가 개발 초기에 만들어 놓은 예비 메모리라고 함. 그의 경험상 프로젝트 말기에 메모리를 줄이는 것은 거의 불가능하므로, 사전에 예비 메모리를 확보해 놓았다는 것.
- 그는 사무실 밖으로 걸어 나가 메모리 용량을 만족시키게 했다고 선언, 단번에 영웅이 됨-_-

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by anakin | 2009/08/22 14:00 | PC 게임 | 트랙백(3) | 핑백(2) | 덧글(31) | ▲top
트랙백 주소 : http://lunarsix.egloos.com/tb/4216884
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from dahlia's me2.. at 2009/08/24 00:58

제목 : 홍민희의 생각
더러운 코딩 속임수...more

Tracked from [Bloodevil =.. at 2009/08/24 02:39

제목 : 코딩 속임수
더러운 코딩 속임수 위에서 가져왔습니다.아놔. ㅠ 구구절절막... * Shoot Me From My Good Side 얼짱 각도로 찍어줘 - 모 멀티플랫폼 게임의 PS2 버전에 대한 작업 중, 1스테이지 도입부에서 때때로 게임이 얼어버리는 현상이 발생함. 불행히도 이는 디버깅 정보가 없는 디스크 릴리즈 버전에서만 발생 - 코드 수정->디스크 굽기->게임 실행하여 버그 확인의 과정이 굉장히 오래 걸림 - 이 과정 ......more

Tracked from 엘키의 주절 주절 at 2009/12/10 10:10

제목 : 더러운 코딩 속임수
게임 제작 관련 웹사이트인 가마수트라에 아주 재미있는 기사가 하나 올라왔네요. 일명 '더러운 코딩 속임수'라는 제목으로, 데드라인에 몰린 게임 프로그래머들이 어떻게든 기일을 맞추기 위해 사용한 임시 방편들에 대한 이야기인데요, 더욱 무서운 것은, 모두 실화들이라고 합니다 --a 실제 기사는 위 링크를 따라가면 보실 수 있고 (영어입니다), 시간과 영어의 압박을 느끼시는 분들을 위해 아래에는 제가 재미있다고 생각한 몇 개의 요약을 올려 봅니다. ......more

Linked at 박피디의 게임 아키텍트 블로그.. at 2009/10/12 23:47

... 빨리 내기 위해 마스터 본이 나오고(사실 발매일 임박할때까지 살몬의 신전 버그를 못잡아서 나가는 길을 막아버리고 시치미뗀 상태로 내버린 바로 그것 되겠다..)'더러운 코딩 속임수' 에서 나온 얘기랑 별 반 다름 없는 일이 벌어지고 있는데...사실 시간에 쫓겨서 개발하다보면 어쩔 수 없이 이런 일이 벌어지게 됩니다.처음에는 '옛날 ... more

Linked at at 2009/10/14 01:11

... op photos inspiration screen design art dual) 벨푼트의 호숫가 산장 : 더러운 코딩 속임수 Latte's Planet :: .노트북을 통해 아이팟터치 무선랜 ... more

Commented by JOSH at 2009/08/22 14:07
손발이 오그라들고... 존내 민망해지고... 얼굴이 뻘개지는 현장...
하지만_마감앞에서는_어쩔_수_없다는.jpg
Commented by 함부르거 at 2009/08/22 15:20
참 저런 거 하기 싫은데 하다 시간에 쫓기다 보면 하게 되요. ㅠ.ㅠ
그건 그렇고 마지막 고참 선생은 진짜 최고네요. -,.-=b
Commented by 머스타드 at 2009/08/22 15:51
마지막 고참 정말 킹왕짱이네요. 요즘 같으면 쓸 수 없는 방법이겠지만요;;;
Commented by shortly at 2009/08/22 16:23
오오 맨마지막 오오오 오오오오..
Commented by 수하 at 2009/08/22 17:26
1, 2번째의 예나 마지막 두 예는 나쁘지 않고 오히려 적절 내지는 훌륭했다는 생각마저 드는군요.
가운데 셋은 쫌;; 작업자가 많~이 맞아야 겠다는.
Commented by utena at 2009/08/22 20:24
CRC-16에서 충돌예시를 본 적은 있는데 32도 쉽게(?) 충돌하는군요
....근데 카메라 각도 90도는...-_-
Commented by asdf at 2009/08/22 21:25
세상에 완벽한 것은 없다는거에 공감이 가는군요.
잘 굴러가기만 하면 되지...-_ㅜ
Commented by 리군 at 2009/08/23 00:40
프로그래밍은 전혀모르지만 대충 어떤 상황인지는 알겠네요

마지막 고참 최고 짬밥은 폼이 아니군요
Commented by 르네 at 2009/08/23 00:48
땜질 공감합니다.. ㅠㅠ 땜질은 또다른 땜질을 낳을뿐이죠
Commented by 나예♡ at 2009/08/23 02:37
마지막 ㄷㄷㄷ ㅋㅋ 컴공학부생으로서 재밌네요
Commented by 少雪緣 at 2009/08/23 04:11
밸리에서 보고와서 덧글 남깁니다. 마지막의 고참은...그야말로 '계획대로!' 군요. 90년대의 2MB메모리라면...아아;;;
Commented by 배둘레햄 at 2009/08/23 05:03
마지막의 예가 왠지 모를 대단한 의미를 담고 있다고 생각하면 착각일지....;;;;



뿜었습니다...;;;



Commented by 키노코 at 2009/08/23 05:40
여러가지로 재밌는 이야기가 많네요!

마지막 이야기에서 그 고참 프로그래머분이 처음에 2MB의 예비 메모리를 확보해두지 않았다면, 아마 차후에 최적화를 했어도 초과했을 것 같네요. 처음부터 저런 제약이 있었기에 그 만큼 최적화가 가능하지 않았을까 생각해봅니다.
Commented by 앤써니 at 2009/08/23 07:07
음...게임으로 졸작을 만들고 있는 그래픽이지만...
이런것도 있었군요...;;
퍼갈께요ㅇㅅㅇ;;
Commented by   at 2009/08/23 08:34
마지막 좀 대단하군요 =_=)/
Commented by ZeX at 2009/08/23 09:21
맨 마지막... 저거 선견지명이라고 해야할까요 --;;
Commented by 이안 at 2009/08/23 09:55
마지막 저건 전설이 아닌 레전드.대단해요!
Commented by SDPotter at 2009/08/23 10:40
마지막이 정말 최고군요!!!!!!
Commented by 망나니 at 2009/08/23 10:42
마지막 짱이군요.^^; 전직 개발자 입장에서 재미있게 읽었습니다.
Commented by 자연풍선생 at 2009/08/23 10:45
마지막 고참 짱인데요!!
Commented by 하이얼레인 at 2009/08/23 11:06
static char buffer[1024*1024*2];

.............................아아 이 분의 관록이 느껴집니다(...)
Commented by 물빛바람 at 2009/08/23 11:23
- 해결책은 약 한 시간 정도 걸림. 동료 프로그래머 한 명이 내 얼굴을 찍은 그림을 구석에 집어넣음. 게임이 30 fps 이상으로 돌고 있으면 웃는 얼굴이 뜨고, 20 이하로 돌면 점점 화난 얼굴로 바뀌는 형태.
- 이로 인해 속도 문제에 대한 사람들의 생각은 "에이, 프로그래머들이 고칠 거야 아마."에서부터 "흠, 내가 이거 넣으면 닉(글쓴이)이 매우 화낼거야! 최적화를 좀 더 해 봐야겠다."로 바뀜


이거 멋지네요!
Commented by Alias at 2009/08/23 11:31
다른 사례도 대단하지만.... 역시 맨 마지막의 사례가 압권이네요....
Commented by 타치코마 at 2009/08/23 13:05
다 재미있지만 마지막이 정말 웃겼습니다!
체크포스트 하겠습니다.
Commented by 자라 at 2009/08/24 09:26
ㅎㅎ 역시 마지막 사례가.. 저도 써먹어야겠습니다 :)
Commented by jong10 at 2009/08/25 22:43
맨 마지막은 진짜 완전 천재네요 ㅋㅋㅋㅋ
Commented by 오스카 at 2009/09/14 22:21
마지막 정말.... ㄷㄷㄷ
Commented by ohyecloudy at 2009/09/19 15:00
마지막 정말 재미있네요. ㅎㅎ 잘 읽었습니다.
Commented by 박형근 at 2009/09/30 10:26
크~ 짱이네요!
마지막꺼는 짬밥의 포스가 느껴지는군요. 이건 '더러운 코딩 속임수'가 아니라 '현명한 미래 대책 보험'아닐까요?ㅋ
Commented by 동우리 at 2009/10/19 01:12
마지막은 정말...전율이 느껴지는 한 수네요.
Commented by 크론도팬 at 2009/10/21 23:01
제가 아는 코쟁이 프로그래머들에게 이 이야길 보내 주었는데.. 모두 다 웃다 뒤로 넘어갔습니다.

:         :

:

비공개 덧글



< 이전페이지 다음페이지 >