Nine Lives
← 전체 글

[디렉터 노트] 1 vs 1000을 기술적으로 완성하기

· 글쓴이 Shay · 공지

1 vs 1000을 기술적으로 완성하기

안녕하세요, 처음으로 인사드립니다. 〈Ember & Blade〉 테크니컬 디렉터 Danny입니다.

이번 개발자 노트에서는 작은 개발팀에서 도전한 기술적 챌린지들, 즉 〈Ember & Blade〉가 1 vs 1000, 무쌍을 찍을 수 있게 해온 작업들을 공유드리려고 합니다.

──────────────────────

1. 프로토타이핑

프로젝트를 시작하기전, 첫번째 프로토타이핑 단계에서 확인하고 싶었던 건 하나였습니다.

“3D에서 1 vs 1000이 실제로 성립하는가.”

어린 시절부터 삼국무쌍(Dynasty Warriors) 같은 게임을 좋아했던 저는 무수히 많은 적을 베며 나아가는 액션게임에 대한 로망이 있었습니다.

그래서 〈Ember & Blade〉는 1 vs 1000으로 베어내는 3D 뱀서지만 무쌍 같은 게임을 만들고 싶다라는 하나의 도전과제를 가지고 시작했습니다.

이 도전 과제는 2D에선 몬스터 하나를 더 그리는 비용이 스프라이트 한 장 수준으로 저렴하기 때문에 어렵지 않았고, 3D에선 많이 어려운 문제로 다가왔습니다.

개체 하나가 늘어날 때마다 드로우콜, 스키닝, 그림자, 애니메이션, 컬링 같은 다양한 비용이 함께 따라오고, “1000마리를 소환해!“라고 하면, 당연하다는 듯 프레임 드랍이 발생합니다.

이걸 기술적으로 해결하는 것이, 저희가 생각한 프리미엄 뱀서류의 시작이였습니다.

그래서 가장 먼저 한 일은 “많이 그리는 방법”을 정하는 것이었습니다.

ECS로 수천 개 개체의 로직을 병렬화하고, GPU Instancing으로 같은 메시를 한 번에 묶어 그리고, VAT(Vertex Animation Texture)로 애니메이션을 미리 텍스처에 구워두기로 했습니다. 특히 VAT는 저희가 3D 뱀서류를 만드는 데 핵심 열쇠 중 하나였습니다.

다음 영상은 900마리를 ECS / GPU Instancing / VAT를 이용해 그리던 초기 프로토타입입니다.

──────────────────────

2. 몬스터를 효율적으로 그리기

저희가 도입했던 VAT는 애니메이션 블렌딩이 매우 어렵고, 애니메이션 갯수의 제한도 있어서 액션 게임류에서 잘 사용되지 않는 기술입니다.

실제로 모든 몬스터를 VAT와 같은 방식으로 최적화하면, 보스나 엘리트 몬스터들의 무게감이 사라져 버리게 되죠.

저희는 그걸 원하지 않았습니다.

보스는 소울라이크 보스처럼 강하면서, 다양한 패턴을 가졌으면 좋겠고, 반대로 잡몹(trash mob)은 시원시원하게 날아갔으면 했습니다.

그렇게 요구사항이 달랐기에, 몬스터를 만들 때, 등급에 따라 두 개의 파이프라인으로 나눴습니다.

엘리트 이상은 스켈레탈 메시. 본 기반 애니메이션을 그대로 사용합니다. 비용이 비싼 대신 개체 수가 적어 감당할 수 있고, 그만큼 퀄리티를 양보하지 않았습니다.

잡몹은 VAT를 이용했습니다. 즉, 스켈레탈 메시가 아니라, 미리 구워둔 애니메이션 텍스처를 읽습니다. 스키닝 비용이 사실상 사라지고, 같은 메시끼리 인스턴싱으로 묶여 한 번에 그려집니다.

대신 애니메이션 종류와 블렌딩이 제한되는데, 화면에서 주로 맞는 역할을 하는 잡몹에게 중요한 기능은 아니라고 판단했습니다.

다음 영상은 VAT 도입 전/후로 프레임과 드로우콜에서 얼마나 이득이였는지를 확인하실 수 있습니다.

배경도 같은 원칙입니다. 1000마리가 뛰어다니는 화면에서 배경까지 욕심을 내면 예산이 남지 않습니다.

최대한 병합하고, 반복 사용하고, 멀리 있는 것은 과감히 단순화합니다. 플레이어의 시선은 대부분 캐릭터 주변에 머물기 때문에, 화면 중앙에 집중했다고 봐주시면 됩니다.

──────────────────────

3. VFX로 효율화하기

저희가 프로젝트를 만들면서, 예상하지 못했던 포인트는 바로 이펙트입니다.

몬스터 1000마리만 신경 쓰면 어떻게든 될 거라 생각했는데, 막상 만들면서 보니 액션 이펙트와 히트 이펙트는 1000개로 끝나지 않았습니다.

한 마리가 맞을 때마다 피격 이펙트, 죽을 때마다 사망 이펙트, 여기에 블레싱들도 뿌려지면, 화면에 이펙트는 1000개를 우습게 넘어갑니다. 몬스터를 아무리 효율적으로 그려도, 이펙트가 프레임을 다시 끌어내리는 상황이었죠.

유니티 엔진에 있는 파티클 시스템은 많은 유니티 게임들이 차용하는 이펙트 시스템입니다. 이 이펙트 시스템은 CPU에서 시뮬레이션 하기 때문에 수백 개까지는 훌륭하지만 수천 개 단위는 감당하기 어렵습니다.

그래서 주요 이펙트를 VFX Graph라는 GPU 기반의 이펙트 시스템으로 전환해 시뮬레이션을 GPU로 넘겼습니다. GPU는 이런 대량 병렬 계산에 특화 되어 있어서, 감당할 수 있는 파티클의 자릿수가 달라집니다.

이펙트 제작 워크플로를 바꾸고 기존 이펙트를 하나씩 다시 만들어야 하는 큰 공사였지만, 결과는 아래 영상으로 확인하실 수 있습니다.

다음 영상은 세라피엘의 블레싱 중 하나인 ’너에게 꽂혀(Crush on You)’입니다. 더 많은 파티클을 뿌리지만 더 빠릅니다. 초기에 만들어진 스킬이라 유니티 파티클 시스템 버전과 VFX Graph 버전이 둘 다 남아 있는, 비교하기 좋은 예시입니다.

여기에 더해, VFX Graph의 신기능을 이용한 최적화도 도입하고 있습니다.

최근에 도입한 것은 Graphics Buffer를 이용해 VFX를 인스턴싱 하는 것입니다.

기존에는 히트가 발생할 때마다 이펙트를 하나씩 복제(Clone)해야 해서, 복제 부하가 생기는 데다 인스턴싱도 되지 않는 문제가 있었습니다. 이제는 Graphics Buffer를 이용해 VFX 인스턴스는 하나만 두고, 그 하나가 여러 개의 이펙트를 한 번에 그립니다.

레미엘의 ’짜릿한 카드샷’은 그 효과를 본 첫 번째 블레싱이었습니다. 영상에서 보이듯, 카드 한 장 한 장을 복제해서 그릴 때와 Graphics Buffer로 한 번에 그릴 때의 모습이 확실히 다르다는 걸 확인하실 수 있습니다.

──────────────────────

4. 재활용, 그리고 또 재활용

지금까지가 “어떻게 그리는가”의 이야기였다면, 마지막은 “어떻게 아끼는가”의 이야기입니다.

사실 여러분이 화면에서 보시는 것 중 상당수는 오브젝트 풀링(Object Pooling)을 이용해 미리 만들어져 있는 것들을 활용하고 있습니다. 데미지 인디케이터, 방금 스폰된 몬스터, 터지는 이펙트 등 거의 전부가 이전에 쓰였다가 회수되어 다시 사용되고 있습니다.

이유는 단순합니다. 1 vs 1000의 전장에서는 초당 수백 개의 오브젝트가 생기고 사라집니다. 이걸 매번 새로 만들고 버리면, 게임 로직이 병목이 아니라, 메모리를 할당하고 정리하는 비용만으로도 무거운 게임이 되어버립니다.

그래서 저희 게임에서 몬스터는 죽어도 실제로 사라지진 않습니다. 대기열로 돌아갔다가, 다음 웨이브에서 새 몬스터로 다시 등장합니다. 방금 여러분이 벤 그 몬스터가, 조금 뒤에 다른 얼굴로 또 달려오고 있는 셈이죠.

같은 원칙은 배경이나 다른 리소스에도 적용됩니다.

배경 애셋과 텍스처를 여러 곳에서 다시 쓰면 빌드가 가벼워지고, 메모리에 올라가는 양이 줄고, 로딩이 짧아집니다.

──────────────────────

마치며

여러분들이 1 vs 1000의 무쌍을 하실 수 있게, 저희는 오늘도 다양한 기술을 조사하고 프로토타이핑해 보고 있습니다. 예를 들어 모던 그래픽스 API에는 PSO(Pipeline State Object)로 셰이더를 미리 준비시키는 워밍업 기술이 있고, 지금도 계속 발전하고 있습니다.

현재는 저희가 만족스러울만큼 워밍업이 되지 않아서, 일부만 차용하고 있는데, Unity에서 더 발전된 워밍업 방식이 제공된다면 적극적으로 도입할 생각입니다.

무모한 도전 같았던 프로젝트가 현재 모습이 되기까지 꽤 많은 시행착오가 있었고, 앞으로도 그럴 것 같습니다.

이 작업들의 결과물은 9월 3일 공개되는 데모에서 직접 확인하실 수 있습니다.

최적화라는 게 원래 잘 되어 있을수록 눈에 띄지 않는 일이라, 여러분이 아무것도 느끼지 못하고 그저 시원하게 적을 베어 넘기셨다면 그게 저희에게는 가장 좋은 결과입니다.

실제로 오늘 개발자 노트에서 다루는 내용들에 대한 더 자세한 내용은 Unite Seoul 2026의 “수백 마리의 적, 가벼운 빌드(Hundreds of Enemies, One Lightweight Build)” 발표에서 자세히 다뤘습니다. 최적화에 대한 깊은 이야기가 궁금하신 분은 아래 영상을 참고해 주세요.

[Unite Seoul 2026] 수백 마리의 적, 가벼운 빌드:〈엠버 앤 블레이드〉로 만든 3D 뱀서의 비주얼과 최적화

발표 자료는 이 링크( https://nine-lives.dev/insights/unite-2026 )에서도 보실 수 있습니다.

성능이나 기술 관련해 궁금한 점, 혹은 플레이 중 발견하신 이상 현상이 있다면 댓글이나 Discord에 오셔서 이야기를 남겨주세요. 앞으로도 더 많은 최적화로 찾아뵙겠습니다.

마지막으로, 여러분이 〈Ember & Blade〉를 켰을 때 뜨는 로딩 화면에서 워밍업을 준비하는 비하인드 씬을 공개하며 글을 마칩니다.

— Danny, Technical Director

태그: ember-and-blade, devlog

스팀 원문 보기 ↗