겪어보지 않으면 모른다.바닥부터 만들기.

내 항상 주장하지만 남이 만들어놓은 소스 기반 위에서 작업하는거랑 까만 화면에 main()부터 찍어서 작업하는건 지구와 안드로메다 성계까지의 거리만큼 큰 차이가 있다.

아무리 썩었어도 돌아가는 소스 위에서 뭘 할때는 가시적으로 결과가 나온다. 진행은 된다. 원래 작업하려던 부분만 집중하면 된다.
아무것도 없는 상태에서 시작하면 새로운 할 일이 끊임없이 늘어난다.
꽤 깊은 뎁스를 가지는 트리를 탐색하는것과 같다.

기능 1을 만들려면 기능 1-A, 1-B, 1-C가 필요하다. 그럼 1-B, 1-C는 스택(머리속, 혹은 작업 노트)에 기록하고 1-A를 시작한다. 1-A를 작업하다보면 1-A1과 1-A2와 1-A3의 작업이 필요하다. 여기서 1-A2와 1-A3 작업을 스택에 푸쉬하고 1-A2작업을 시작한다. 1-A2작업을 하다보면 또다시 1-A2-a1작업과 1-A2-a2작업을 할 필요가 생기고…이런식으로 미친듯이 스택에 작업이 쌓인다.

2002년에 처음 엔진을 만들때가 그랬다. 아~~~무것도 없는 상태에서 main()과 dllmain()으로 시작한 프로젝트였다. 최초에 DLL 4개를 만들었다. 제일 먼저 3dsmax 플러그인을 만들어서 데이터를 뽑아냈고 그 파일을 읽어서 화면에 매시를 띄웠을때 절반 온줄 알았다. 화면에 뭔가를 띄웠다면 이제 시작할 수 있는 최소한의 자격을 갖춘 것이다. 이제부터 시작이지.

캐릭터 렌더링을 예로 들어보자.
캐릭터 A의 모델 데이터를 읽어서 그걸로 화면에 두개의 캐릭터를 띄워는데 하나는 뛰기 애니메이션의 15프레임을 렌더링하고 하나는 서 있는 애니메이션의 10프레임을 렌더링한다. 두 녀석의 상태가 다르다. 모델 데이터를 복사본으로 2개 가지고 있을까? 그렇게 해도 되지만 같은 캐릭터 100마리만 띄워도 메모리가 터져나갈 것이다.

여기서 공유할 수 있는 데이터와 공유할 수 없는 데이터를 분리해내야한다. 로컬좌표계 상에서의 위치,노멀,텍스처 좌표, 오브젝트마다의 트랜스폼 매트릭스는 공유대상이다.
애니메이션의 키값도 공유대상이다. 애니메이션을 적용해서 만든 변환 매트릭스는 공유대상이 아니다. 지금은 모두 shader를 사용하지만 그 당시엔 FVF고정 파이프라인을 사용하던 시대였고 스키닝도 CPU로 했다. 따라서 스키닝 처리를 하면 버텍스 데이터가 매 프레임 새로 나와야하고 이것도 어딘가 저장을 해놔야 한다. 그리고 이건 공유대상이 아니다. (이것도 애니메이션 캐시를 사용할땐 공유대상이다).

즉 어떤 캐릭터 모델 하나를 로드해도 이 녀석을 참조하는 인스턴스가 여러개일 경우, 각각에 대한 컨텍스트가 필요하다. 컨텍스트에는 명백히 공유될수 없는데이터들만 들어가야 메모리를 절약할 수 있다. 이 와중에 CPU스키닝 속도가 느려서 SSE를 이용한 스키닝 코드를 어셈블리어로 새로 만들었다.

예시로 언급한 내용, 그까짓거 별거 아니지. 금방 만들 수 있을것이다. 근데 이것도 초기 단계에서의 시작에 불과하다. 이후로 뭔 기능 하나 만들때마다 10뎁스씩 되는 서브트리가 계속 생긴다.

그러던 와중에 이 엔진으로 게임을 만들기 시작한(실제로 샘플 게임을 개발하지 않으면 그 엔진은 절대로 검증도,완성도 되지 않는다) 개발팀에서 요구사항이나 버그리포트등이 밀려온다. 내 엔진 개발 도중에 샘플로 만들던 게임은 코룸 온라인이었다.

미칠듯이 정신없는 생활을 1-2년 하고 나면 드디어 서서히 스택 사이즈가 줄기 시작한다. 스택에 남은 자료(할일)가 일정 개수 이하로 떨어지고 그 상태가 계속 유지될때쯤 되면 그 엔진을 기반으로 한 게임이 돌고 있다.

뭐 이런 스토리인데 이거 겪어보지 않으면 절대 모른다.
남의 엔진 유지보수만 해봤어도 절대 모른다.
남이 짠 소스를 보면 그저 다 똥같고 내가 하면 훨씬 잘할것 같지. 그걸 몽땅 새로 만들때 얼마나 빡신지는 모른다. 자기가 작업한 부분(shader라든가)만 신경쓰면 다 자동으로 되는줄 알지.

그래픽 뷰어 만들면 엔진 만드는줄 아는 의욕 넘치는 개발자들이나 남의 엔진(인하우스와 상용엔진 다 포함해서) 코드좀 보면 그거 다 자기도 만들 수 있을것 같은 생각을 하는 개발자들 종종 보는데 답답해서 적어본다.

까만 화면에 main()부터 시작하면 진짜 다르다.


겪어보지 않으면 모른다.바닥부터 만들기.”에 대한 답글 12개

  1. fbx에서 mesh 불러서 화면에 그릴 수 있으면 뭔가 할 수 있을 줄 알았는데 그게 아니었습니다… ㅜㅜ

    좋아요

  2. 안녕하세요. 게임 엔진과 그래픽스에 관심이 많은 게임 개발자를 꿈꾸는 사람입니다. 혹시 과외 같은 건 안하시나요 ? 간절하게 배우고싶습니다! 컴공 전공자라 기본기는 있습니다…

    좋아요

  3. 안녕하세요, 구리구리한 자체 엔진으로 구리구리한 자체 게임을 개발하고 있는 BK 라고 합니다,
    지나가다가 뭔가 반가워서, 댓글 남깁니다,
    보기드문 분이시군요( 요즘 다들 유니티, 유니티, 뭐 엔진 개발을하는 분위기가 별로 없으니까요), ㅎㅎㅎ

    좋아요

댓글 남기기