Lobsters

Some things Veloren does differently

Veloren이 다르게 설계한 것들 — ECS, chonk, 그리고 살아있는 월드 시뮬레이션

Rust로 개발된 오픈소스 복셀 RPG Veloren의 코어 개발자가 프로젝트의 특이한 설계 결정들을 정리했습니다. ECS 아키텍처, 'chonk'라는 독자적 복셀 자료구조, 물리 기반 월드 생성과 상시 시뮬레이션 시스템 rtsim 덕분에 48스레드 서버에서 500명 이상의 플레이어와 수만 개의 엔티티를 하나의 월드 공간에서 처리합니다.

본문

Veloren은 Rust로 작성된 오픈소스 복셀 액션 RPG로, 이 글은 코어 개발자 중 한 명이 개발 과정에서 내려진 비범한 선택들을 기록한 것입니다. 게임을 만들고 있다면 참고할 만한 결정들이라고 저자는 말합니다.

ECS — 다형성이 기본값인 세계

Veloren은 전통적인 객체지향 클래스 계층 대신 ECS(Entity Component System) 위에 구축됐습니다. 2018년 프로젝트 시작 당시에는 Rust 생태계에서조차 데모 수준 외에는 드물게 쓰이는 방식이었고, 팀은 필요한 개념 상당수를 내부에서 직접 만들어야 했습니다. 보상은 확장성으로 돌아왔습니다. 48스레드 서버에서 500명 이상의 플레이어와 수만 개의 엔티티가 상호작용하는 상황에서도 코어 사용률 50% 수준으로 동작하며, 대부분의 MMO가 게임플레이 범위를 줄이거나 플레이어를 다른 월드로 샤딩해야 도달하는 수치를 같은 공간에서 달성합니다. 다만 ECS에서는 컴파일 타임 타입 분기 대신 다형성이 기본값이 되고 엔티티 분류체계를 오히려 명시적으로 opt-in해야 해서, 뜻밖의 부작용이 생겼습니다. 플레이어에게 ItemDrop 컴포넌트가 잘못 부여된 버그로 다른 플레이어를 '줍기' 하면 해당 엔티티가 드롭되며 서버에서 킥되는 사태가 있었고, 탈것(mount) 구현 초기에는 순환 감지와 제어 전달 로직 결함으로 수십 개 엔티티가 서로를 타는 거대한 탑이나 순환 고리가 만들어져 물리 엔진이 모순된 제약을 풀려고 발버둥치는 '베데스다식 대관람차' 혼돈이 벌어지기도 했습니다.

플레이어와 NPC의 이중성

플레이어 캐릭터와 NPC는 가능한 최대 범위까지 동일한 존재로 취급됩니다. NPC도 순간이동하거나 블록을 통과하지 못하고 같은 물리 엔진을 거치며, 절벽 가장자리에서 관성과 마찰을 고려하지 못하는 에이전트 코드라면 실제로 추락합니다. 이동 입력은 '가상 게임패드' 역할을 하는 Controller 컴포넌트로 통일되어, 플레이어는 키보드·마우스·게임패드가, NPC는 에이전트 의사결정 트리가 입력을 공급합니다. 신체 능력의 제약 안에서 입력을 물리 엔진으로 변환하는 이동 컨트롤러 코드와 스킬 트리·경험치 시스템도 완전히 공유되며, 과거 버전에서는 근처 NPC가 레벨업할 때 효과음이 재생되기도 했습니다.

Chonks — 복셀 저장의 제3의 길

복셀 게임의 지형 저장 방식은 보통 해시 테이블로 접근하는 거대한 3D 배열, RLE 인코딩 청크, 옥트리 중 하나입니다. 하지만 배열은 빠르나 압축 여지가 적고, RLE는 동질 블록이 큰 덩어리로 나올 때만 압축이 잘 되며 임의 접근 성능이 나쁘고, 옥트리는 현대 CPU 캐시에 극도로 불리합니다. Veloren은 어느 쪽도 쓰지 않고 'column'과 'chunk'의 합성어인 'chonk'을 씁니다. 단일 레벨 인덱스 테이블에서 NxNxN 블록 그룹을 '동질(homogeneous)' 또는 '이질(heterogeneous)'로 표현하고, 각 chonk을 수직 원점에서 오프셋된 임의 개수의 고정 크기 수직 서브청크로 나눕니다. 캐시 일관성과 압축 사이의 좋은 절충점으로 뛰어난 임의 접근 성능을 제공했다고 합니다.

월드 사전 생성과 '절차적 생성'의 재해석

Minecraft처럼 탐험에 따라 월드를 확장하는 대신 Veloren은 시작 시 저해상도로 월드 전체를 미리 생성하고, 플레이어가 가까워지면 보간과 노이즈 기반 기법으로 세부를 채웁니다. 이 사전 생성 덕분에 항상 아래로 흐르는 긴 강처럼 지역적 제약 해결만으로는 불가능한 요소를 구현하고, 게임 시작 전 월드 시뮬레이션을 돌릴 시간도 얻습니다. 저자는 절차적 생성을 '무작위 게임 콘텐츠'로 보는 통념이 정확히 거꾸로라고 지적합니다. 절차적 생성이란 인간의 패턴 인식 성향을 자극하는 요소 간 제약을 정의하는 일이며, 조합 공간의 무작위 탐색이 아니라 자기일관성을 통해 복잡한 서사를 짜는 것입니다. 강을 찾으면 수원까지 걸어갈 수 있어야 하고, 몬스터를 죽이면 근처 마을 사람들의 대사가 바뀌어야 합니다. 좋은 절차적 생성에는 무작위성이 거의 필요 없는데, 무작위성은 플레이어가 가져오는 것이고 생성기의 역할은 그 무작위성을 결과가 있는 자기일관적 체계로 교정하는 데 있기 때문입니다. 또한 저해상도 사전 생성은 원경 지형의 정확한 LoD(Level of Detail) 스탠드인을 만들어 저사양 하드웨어에서도 사실상 무제한 시야 거리를 제공합니다.

물리 기반 월드 생성

색이 어울리는지, 산이 흥미로운지 같은 미적 출력에 집중하는 '목적론적(teleological)' 생성 — 절차적 노이즈나 Wave Function Collapse 같은 기법 — 과 달리 Veloren은 세계의 물리적 입력을 재현하는 내부 모델을 정의하고 그 효과를 시뮬레이션하는 '존재론적(ontological)' 생성에 무게를 둡니다. 대표 사례가 게임의 상징이 된 산악 지형과 복잡한 하천망을 만든 물리 기반 수력 침식 모델이며, 절차적 경로 생성기는 간소화된 이동 비용 모델로 거점 사이의 에너지 효율적 경로를 찾습니다. 저자는 이 물리 기반 접근이 Veloren 특유의 '나보다 큰' 일관된 세계감의 핵심이라고 봅니다.

RTSim — 플레이어가 없어도 돌아가는 세계

물리 기반 시뮬레이션은 초기 생성에서 멈추지 않습니다. rtsim(Real Time SIMulation)은 저해상도 월드 데이터를 이용해 플레이어가 근처에 없어도 전 세계를 계속 시뮬레이션합니다. 모든 NPC는 rtsim 안에 분신을 두고 있어, 플레이어의 시야 거리를 벗어나도 디스폰되지 않고 rtsim에 흡수되어 이동과 상위 의사결정 트리의 효과가 계속 추적됩니다. 퀘스트 시뮬레이션, 세력 역학, 게임 경제의 일부까지 rtsim이 처리하며, 해적과 떠돌이 도적이 세계를 가로질러 거점을 습격하는 광경이나 상인의 이주를 관찰할 수 있습니다. Veloren 월드에는 수만 명 이상의 NPC가 존재하는데 rtsim은 이들 전부를 동시에 추적하도록 설계됐습니다.

보이지 않는 벽 없음, 하나의 월드 공간

Veloren은 월드 경계 같은 물리적 제한이든, 임의의 상호작용 불가 규칙 같은 개념적 제한이든 '보이지 않는 벽'을 두지 않는다는 설계 제약을 초기에 세웠습니다. 덕분에 장난꾸러기 플레이어가 강력한 보스를 던전에서 근처 마을로 끌고 오는 상황도 허용되며, 게임 시스템은 극단적으로 이상한 상황에서도 계속 작동하도록 방어적으로 설계됐습니다. 로딩 화면으로 구역을 나누지 않고 모든 요소를 같은 물리 공간에 두는 결정도 마찬가지입니다. 지표 아래 최대 1km, 여러 층 깊이로 뻗은 정교한 동굴 네트워크 위에서 성능을 유지하는 것이 과제였고, 특히 조명이 어려운 문제였습니다. 베이크드 복셀 라이팅, 포인트 라이트, 지향성 섀도 매핑, 반사, 주변광 모델, 광 산란을 일으키는 볼류메트릭 안개와 구름까지 지원하는 환경에서, 대낮에도 지표의 빛 정보가 가장 깊은 동굴로 새지 않게 만드는 데 많은 시간이 들었습니다. 번개 같은 전역 효과가 섀도 맵을 통해 주변광 데이터를 새어 나오게 하거나 스크린 공간 반사에 나타나는 문제까지 플레이어 시점의 가시성을 일일이 처리해야 했다고 합니다.

원문: blog.jsbarretto.com / 번역·요약: Trawling