아이돌 마스터 신데렐라 걸즈 스타라이트 스테이지는 작년 9월에 나온 안드로이드/iOS 스마트폰용 게임으로서, 다양한 운영체제와 스마트폰의 성능에 맞춰 그래픽을 렌더링해 60fps를 유지하도록 디자인한 것이 특징입니다.
개발을 시작했을 때 유니티와 Cocos2d-x라는 게임 엔진을 놓고 고민하다가 결국 유니티를 골랐다고 합니다. 게임 엔진 평가에만 한달이 걸렸다네요. 한달 동안 게임의 이미지 효과 등을 모두 검증해 냈다고 하니 말이 검증이지 참 많은 일은 한 듯.
유니티로 낙착을 본 이유는 60fps 유지를 위해서라고 합니다. 이건 양보할 수 없었다네요. 또 아이돌의 그래픽을 예쁘게 묘사하기 위해, 하이엔드 스마트폰은 고품질 렌더링을 표시한다는 목표를 처음부터 갖고 있었다고 합니다.
검증은 2D 리듬 게인과 3D 파트로 나눴고, 60fps 실현은 미들웨어의 프로파일 외에도 SoC 업체 제공의 프로파일까지 활용해 쉐이더 부하를 조사했습니다. 60fps를 유지하기 위해서 이미지 효과를 조절했으며, 그래픽을 매력적으로 보이기 위해 블룸과 피사계 심도를 적극 활용했습니다.
Cocos2d-x는 소스코드가 공개됐다는 장점이 있으나, 유니티는 개발 효율이 좋고 수년간 축적되온 경험 덕분에 결국 유니티에 기울어졌습니다. 또 검증 기간 동안 나온 최종 결과물을 보고 높은 품질을 이유로 들어 유니티로 결론이 났다고.
문제는 쓰로틀링입니다. 스마트폰과 태블릿에 부하가 쌓여 발열이 늘어나면 CPU와 GPU의 클럭이 줄어들고, 이 경우 필요로 하는 성능을 내지 못하게 됩니다. 그래서 3D도 경량과 표준의 두가지 프리셋으로 나눴다고 합니다(2D도 마찬가지지만 여기선 생략).
아이폰은 기종 수가 적고 성능도 확실하게 구분됐으니 아이폰 5 이전은 3D 경량, 아이폰 6부터는 3D 표준으로 돌아가도록 설정했습니다. 안드로이드는 이렇게 간단하게 안되니까 SoC를 조사해서 3D 부하 수준을 정했습니다. 또 MV는 부하가 가볍기에 성능이 낮아도 3D 표준 그래픽으로 표시.
3D 경량에서는 피사계 심도의 블룸 효과를 쓰지 않지만.
3D 표준에서는 씁니다.
1 프레임을 1/4로 줄여 깊이 텍스처를 만들고 여기서 밝기를 추출해 합성하는 식으로 특수 효과를 실현했습니다. 이 깊이를 표현하는 텍스처를 만드려면 1패스 만큼의 처리가 필요하기에 느린 SoC에선 처리가 힘들 것입니다.
라이팅의 경우 실시간이 아니라서 그렇지 앰비언트 라이트를 타임라인 툴로 제어합니다. 이걸 잘 쓰면 스포트라이트처럼 보이는 빛도 표시 가능. 또 캐릭터 윤곽성은 컬링 표면을 반전시켜 그리는 셀 쉐이딩의 고전적인 방법을 씁니다. 윤곽선의 색이나 굵기는 버텍스 컬러로 제어합니다.
캐릭터 아래에 표시되는 그림자는 조명을 반영해서 계산해낸 게 아닌 가짜 그림자입니다. 쉐도우 맵에선 깊이 텍스처가 필요하니 3D 경량 모드에선 그려낼 수 없고, 그림자가 없으면 입체감이 많이 떨어지니까 가짜 그림자를 넣었다고 하네요. 또 광원이 매우 많은 곳에선 쉐도우 맵을 제대로 재현하지 못한다는 문제도 있습니다.
60fps를 실현하기 위해 드로우 콜을 줄이는 데 신경썼습니다. 유니티에 표준 탑재된 드로우 콜 감소 기능인 드로우 콜 스태틱 배칭과 다이나믹 배칭을 사용해 드로우 콜 40%를 줄였다고 하네요.
캐릭터 모션은 모두 모션캡처로 만들었으나 실제로 움직일 때는 인버스 키네매틱스를 쓰지 않고 애니메이션은 모두 회전시켜 만들었습니다. 회전 시엔 캐릭터 끝 부분이 흔들릴 수 있는데, 마이크 스탠드처럼 스테이지에 고정돼 움직이지 않는 물건을 배치, 모션이 흔들리는 걸 눈에 띄지 않도록 만들었습니다. 또 캐릭터마다 모션이 약간씩 차이나도록 만들어 실제 사람이 춤추는 것처럼 이렁한 그래픽을 만들었습니다.
의상의 경우 따로 시뮬레이션을 해서 최소한의 접촉 판정도 수행합니다. C#에서 이런 연산은 무겁기에 네이티브 코드로 옷의 움직임을 처리, 10~20% 정도 CPU 부하를 낮췄습니다.