Riot Games의 VALORANT 콘텐츠 서포트 테크니컬 리드인 Marcus Reid는 현재 게임 엔진을 담당하는 엔지니어링 팀에서 일하며, 디자이너, 아티스트 등 VALORANT 개발팀 전반에 걸쳐 논엔지니어링 콘텐츠 개발자를 지원하고 있습니다. Marcus는 2017년에 Riot Games에 합류하기 전까지 2년간 The Coalition에서 Gears of War 4 와 Gears of War Ultimate Edition 의 엔지니어로 근무했습니다.
안녕하세요, 발로란트(VALORANT) 콘텐츠 지원팀의 테크니컬 리드, 마커스 리드입니다. 라이엇 게임즈(Riot Games)는 6월 2일에 5:5 캐릭터 기반 전략 FPS를 출시했습니다. 발로란트 팀은 언리얼 엔진으로 탄탄한 기반을 세우고 발로란트의 핵심 차별화 요소 개발에 집중할 수 있었습니다. 저희는 시나리오에 맞게 엔진의 특정 부분을 대폭 개선했으며, 에픽이 제공하는 기능과 그 커뮤니티를 최대한 활용할 수 있도록 새로운 엔진 버전이 나올 때마다 정기적으로 업그레이드했습니다. 비교적 소규모인 우리 엔지니어링 팀은 이 방식 덕분에 에디터로 게임을 만드는 수많은 콘텐츠 개발자를 지원할 수 있습니다. 저희는 개발 주기 대부분을 언리얼 엔진에서 이미 제공하는 기능을 다시 제작하기보다 게임플레이와 서비스 역량을 발전시키는 데 할애했습니다.
대규모 엔진 수정은 대부분 발로란트의 엄격한 성능 요건에 따라 진행되었습니다. 다양한 하드웨어 구성에서 클라이언트의 퍼포먼스를 측정하고, 목표 틱레이트와 컨커런시(코어당 게임 수)로 서버 성능을 평가합니다. 다음 예시는 퍼포먼스 목표를 달성하기 위해 엔진에서 수정한 두 부분을 자세히 보여줍니다.
레이나(Reyna)는 무시(Dismiss) 스킬로 적을 처치하면 잠시 투명 상태가 되어 적의 허를 찌르거나 도망칠 수 있습니다.
저사양 GPU를 위한 렌더러 커스터마이징
발로란트의 최소 사양 클라이언트 목표는 2012년 초 출시된 내장 GPU, Intel HD Graphics 4000 기준으로 30 FPS(33.3ms 프레임타임)입니다. 플레이어가 프레임타임을 향상하기 위해 퀄리티 세팅을 조절해도 경쟁적 무결성을 유지해야 합니다. 즉, 설정을 바꿔도 총격전의 상황 판단이나 명확성에 영향을 주지 않는 것이 중요합니다.
이런 목표를 달성하려면 게임 내 모든 콘텐츠에 아트 예산을 엄격히 배정하고, 핵심 아티스트의 노력과 창의성을 활용하여 최소 사양 성능을 저해하지 않으면서도 게임을 멋지게 구현해야 하죠. 엔지니어링 팀이 목표 퍼포먼스를 달성하려면 아티스트의 도움이 필수적입니다.
다음은 발로란트 팀이 엔진의 렌더링 레이어에 대규모로 투자한 목록의 일부입니다.
언리얼 엔진의 모바일 렌더링 패스를 기반으로 한 커스텀 포워드 렌더러.
UE4.14에서 데스크톱에 추가된 포워드 셰이딩 렌더러보다 앞서 구현했습니다.
최소한의 인스트럭션과 텍스처 샘플을 사용해 필요한 기능만을 지원하는 고유한 베이스 패스 셰이더.
머티리얼 퀄리티를 낮음으로 설정하면, 베이스 환경 머티리얼의 픽셀 셰이더는 인스트럭션 41개와 한번의 텍스처 룩업만을 사용합니다.
보통 스테이셔너리 및 무버블 라이트로 제한되는 기능 일부를 최소한의 오버헤드로 스태틱 라이팅 패스로 포팅하였습니다.
예시: 각각의 맵에는 1인칭 무기에 다이내믹 섀도를 드리울 수 있는 단일 스태틱 디렉셔널 라이트가 있습니다.
발로란트 의 게임플레이 환경은 스태틱 라이팅만 사용합니다.
면 방향에 따른 컬링, 커스텀 비저빌리티를 쿼리를 갖춘 오클루전 컬링, 단순화된 버텍스 포그 지원 그리고 커스텀 라이팅 추가 등 다양한 데칼 관련 개선이 있었습니다.
일반 뎁스 패스 대신 레벨 내 주요 요소(벽, 바닥 등)들의 간소화된 지오메트리로 구성된 Z Prepass Mesh를 모아 Depth 렌더링에 활용했습니다.
측정에 따르면 씬의 개별 메시 뎁스 드로 콜보다 모아진 메시의 경우 대폭 성능 향상이 있었습니다.
이 방식은 나중에 GPU 씬을 통한 자동 드로 콜 병합으로 폐기될 수 있습니다. 에픽이 지원하는 새로운 엔진 기능으로 커스터마이징한 부분을 대체할 수 있다면 언제나 환영입니다.
엔진 수정과 아티스트의 수고 덕분에 발로란트는 최소 사양에서도 30FPS 이상을 유지할 수 있습니다. 이런 최적화는 최신 GPU가 장착된 기기에서는 1~3ms에 불과한 풀 프레임 렌더 타임을 볼 수도 있다는 뜻이기도 합니다.
날렵하고 민첩한 제트(Jett)는 칼날 폭풍(Blade Storm) 스킬로 칼을 던져서 반격합니다.
게임 서버의 애니메이션 오버헤드 감소
발로란트의 게임 서버는 CPU 코어당 세 게임, 초당 128틱의 싱글 스레드 방식으로 동작합니다. 각 서버 인스턴스의 프레임타임 예산은 2.6ms에 불과합니다. 이 목표를 달성하려면 게임 전체에 걸쳐 수많은 최적화 작업이 필요합니다. 캐릭터 애니메이션은 하나의 영역에서 이 작업이 어떻게 이루어졌는지 잘 보여주는 예시입니다.
게임 서버는 타격 판정에 무관한 모든 스켈레탈 메시의 애니메이션을 생략합니다. 전투가 불가능할 때(예를 들면 각 라운드에서 무기를 사는 단계)는 애니메이션이 완전히 비활성화됩니다.
타격을 정확히 판정하려면 무기 발사체에 타격을 입을 수 있는 모든 액터의 애니메이션을 평가하고, 정확한 본 위치를 세팅해야 합니다. 총이 발사되면, 게임 서버가 네트워크 지연과 클라이언트/서버 프레임타임을 모두 고려하여 클라이언트가 총을 발사한 순간까지 시뮬레이션을 되감기합니다. 시뮬레이션 되감기는 서브프레임 서버 타임 오프셋 시점의 이전 본 위치 사이를 보간한 다음, 타격 가능한 액터에 대해 대미지를 계산합니다. 타격을 확인한 다음 서버 시뮬레이션을 현재 시점으로 복구하고 계속 진행합니다.
측정 결과, 캐릭터 하나의 애니메이션 업데이트와 평가에 드는 시간은 최대 0.1ms입니다. 서버 프레임마다 캐릭터 10명을 애니메이션 시키면, 전체 프레임 예산 중 40% 정도가 사용됩니다. 비용은 대부분 평가 단계에서 발생하며 업데이트 단계는 비교적 비용이 낮습니다.
처음에는 애니메이션이 몇 프레임마다 발생하도록 레이트를 제한하고, 평가가 끝날 때마다 최종 본 위치의 스냅샷을 저장해봤습니다. 되감기를 하면 항상 애니메이션 평가와 현재 프레임 스냅샷이 이루어지고, 타격 시점과 가장 가까운 두 스냅샷 사이를 보간하여 충돌 테스트합니다.
다음으로는 타격을 입을 가능성이 전혀 없는 액터를 배제하는 로직을 추가하여 불필요한 되감기를 줄였습니다. 덕분에 무관한 액터에 대한 강제 애니메이션 평가를 제외할 수 있습니다. 서버는 관련성 판단을 위해 플레이어가 쏘는 무기의 조준 벡터를 따라 구체 캐스트를 내보냅니다. 이때 모든 최근 움직임과 무기 오류를 인식할만큼 큰 구체를 내보내게 됩니다. 이 구체와 충돌하는 모든 캐릭터는 되감기 및 평가를 하게 됩니다.
뛰어다니고 있는 사이퍼(Cypher)가 총을 쏜 플레이어의 총알에 타격을 맞았는지 평가 하기 위해 되감기해야 합니다. 소바(Sova)는 거리가 충분히 멀기 때문에 서버가 타격 여부를 확인하기 위해 소바의 본 위치를 전부 평가하지 않아도 됩니다.
이렇게 선택적으로 되감기를 하면, 타격 입을 가능성이 있는 캐릭터만 상황에 따라 애니메이션을 평가하지만, 모든 캐릭터에 대한 본 위치 스냅샷을 만들기 위한 주기적 평가는 계속 이루어집니다. 이러한 평가를 없애기 위해 업데이트 단계를 실행하고, 최종 본 위치의 스냅샷을 찍기보다는 각 AnimGraph 노드의 입력 스냅샷을 찍습니다. 그러면 애님그래프(AnimGraph)를 임의의 과거 시점으로 되감기하고 그래프를 평가해서 본 위치를 얻을 수 있습니다.
AnimGraph 노드 입력 스냅샷을 저장하는 것은 각 노드 유형별로 필요한 상태에 대한 이해가 필요한 대규모 엔진 수정 작업이지만, 그만큼 속도도 빨라집니다. 모든 최적화를 마친 지금은 애니메이션 프로세싱에 서버 프레임당 평균 0.3ms가 소요됩니다.
결론
언리얼 엔진은 발로란트의 기반이 된 환상적인 툴과 탄탄한 기능들을 제공합니다. 저희 엔지니어링 팀은 ‘바퀴를 다시 발명하기 위해’ 시간을 낭비하지 않게 되고, 콘텐츠 개발자는 에디터로 훨씬 생산적인 작업을 할 수 있습니다. 언리얼 엔진 덕분에 발로란트를 돋보이게 하는 게임 요소들을 빠르게 반복처리할 수 있습니다.
지금 언리얼 엔진을 다운로드하세요!
세계에서 가장 개방적이고 진보된 창작 툴을 시작하세요.
뛰어난 기능과 무료 소스 코드 액세스를 제공하는 언리얼 엔진은 추가 플러그인을 설치하거나 구매하지 않아도 바로 사용할 수 있습니다.