롤러코스터 타이쿤의 최적화 기준: 내부 구조 분석

3 days ago 8

  • 1999년작 RollerCoaster Tycoon은 거의 전부 어셈블리어로 작성된 시뮬레이션 게임으로, 수천 명의 손님을 실시간으로 처리하면서도 안정적인 성능을 유지한 사례로 평가됨
  • 개발자 Chris Sawyer는 고수준 언어 대신 저수준 제어를 택해, CPU 연산 효율을 극대화한 마지막 세대의 어셈블리어 게임을 완성함
  • 팬 프로젝트 OpenRCT2를 통해 원본의 정밀한 최적화 패턴과 메모리 절약 기법이 역공학적으로 분석됨
  • 게임은 비트 시프트 연산과 데이터 타입 세분화를 활용해 연산 속도와 캐시 효율을 높였으며, 경로 탐색 깊이 제한충돌 연산 제거로 대규모 시뮬레이션을 가능하게 함
  • 이러한 구조는 기술적 제약을 창의적으로 활용한 최적화의 전형으로, 오늘날에도 설계 단계에서 불필요한 연산을 제거하는 접근의 중요성을 보여줌

RollerCoaster Tycoon의 최적화 구조 분석

  • 1999년 출시된 RollerCoaster Tycoon(RCT) 은 거의 전부 어셈블리어(Assembly) 로 작성되어, 수천 명의 에이전트를 실시간으로 시뮬레이션하면서도 당시 하드웨어에서 안정적인 프레임을 유지한 게임으로 평가됨
  • 독일 게임 팟캐스트 Stay Forever 에서 다룬 내용을 기반으로, Chris Sawyer 가 어떻게 극단적인 수준의 최적화를 달성했는지를 구체적으로 분석함
  • 원본 소스코드는 공개되지 않았지만, 팬들이 제작한 OpenRCT2 프로젝트를 통해 코드 구조와 최적화 기법을 역공학적으로 확인할 수 있음
  • 어셈블리어 기반의 성능 극대화

    • RCT는 C나 C++ 대신 어셈블리어로 작성되어, 당시 다른 게임보다 훨씬 세밀한 성능 제어가 가능했음
      • 예를 들어, Doom (1993)은 대부분 C로 작성되었으나, RCT는 거의 전부 어셈블리어로 구현됨
      • 이 접근은 1990년대 후반에는 이미 드문 방식이었으며, RCT는 마지막 대형 어셈블리어 게임 중 하나로 평가됨
    • 당시에는 컴파일러의 자동 최적화가 제한적이었기 때문에, 수동 최적화가 성능에 큰 차이를 만들었음
  • OpenRCT2를 통한 코드 분석

    • OpenRCT2 는 팬들이 원본 게임을 완전히 재구현한 오픈소스 프로젝트로, 원본 자산을 그대로 사용하면서도 100% 호환성을 유지함
      • 초기 버전은 원본 코드와 거의 동일한 동작을 재현했으며, 이후 다양한 개선이 추가됨
    • 이 프로젝트를 통해 원본 코드의 세밀한 최적화 패턴을 확인할 수 있었음
  • 데이터 타입의 세분화 — 메모리 절약

    • RCT는 금액 데이터의 크기를 상황별로 다르게 저장
      • 예: 전체 공원 가치는 4바이트 변수 사용, 상점 가격은 1바이트 변수 사용
    • 이러한 세분화는 메모리 절약과 캐시 효율 향상을 위한 것으로, 현대 CPU에서는 성능 차이가 거의 없어 OpenRCT2에서는 단일 8바이트 변수로 통일됨
  • 비트 시프트를 이용한 수학 연산 최적화

    • 코드에는 NewValue = OldValue << 2; 와 같은 비트 시프트 연산이 자주 사용됨
      • 이는 OldValue * 4 와 동일한 효과를 내지만 훨씬 빠르게 계산됨
      • 반대로 >> 연산은 2의 거듭제곱으로 나누는 연산을 대체함
    • 이러한 최적화는 곱셈·나눗셈이 2의 거듭제곱일 때만 가능하므로, 게임 내 수식 자체가 이 조건에 맞게 설계된 것으로 보임
    • 즉, 게임 디자인 단계에서부터 CPU 연산 효율을 고려한 수학 구조가 사용된 셈임
  • 성능을 고려한 게임 디자인

    • RCT는 Chris Sawyer가 프로그래머이자 유일한 게임 디자이너로 참여했기 때문에, 설계 단계에서부터 성능을 고려한 구조를 만들 수 있었음
    • 대표적 사례는 손님(Pathfinding) 시스템
      • 대부분의 시뮬레이션 게임은 손님이 목적지를 정하고 경로를 탐색하지만, RCT에서는 손님이 무작위로 걷다가 우연히 놀이기구를 발견함
      • 이 방식은 대규모 경로 탐색 연산을 피하는 구조로, 수천 명의 손님을 동시에 처리할 수 있게 함
    • 경로 탐색이 필요한 경우(예: 정비공이 고장난 놀이기구로 이동)는 탐색 깊이 제한을 두어 프레임 드랍을 방지함
      • 일반 손님은 5개의 교차로까지만 탐색, 정비공은 8개까지 탐색
      • 지도를 구매한 손님은 탐색 한도가 7로 증가함
    • 이러한 제한은 단순한 기술적 절충이 아니라, 게임플레이 요소로 자연스럽게 통합된 최적화 구조
  • 군중 처리와 충돌 회피 생략

    • RCT는 손님 간 충돌이나 회피 연산을 완전히 제거
      • 수천 명의 손님이 동일한 경로 타일을 공유할 수 있음
    • 대신, 주변 인구 밀도를 추적하여 혼잡도가 높으면 손님의 행복도가 감소하도록 설계됨
      • 플레이어는 여전히 혼잡을 관리해야 하지만, 계산량은 훨씬 적음
    • 이 방식은 복잡한 물리 연산을 제거하면서도 게임 경험을 유지한 대표적 사례로 평가됨
  • 현대 개발에 주는 시사점

    • RCT의 최적화는 기술적 제약을 창의적으로 활용한 사례로 평가됨
    • 오늘날에도 이러한 접근은 가능하지만, 프로그래머와 디자이너 간의 긴밀한 협업이 필요함
    • 때로는 기술적 문제를 해결하기보다, 문제 자체를 설계 단계에서 제거하는 접근이 더 큰 성능 향상을 가져올 수 있음

Read Entire Article