프로그램에서 난수(Random)는 실제로는 난수가 아니다. 컴퓨터에서 무작위라는 것은 어찌 되었든 예측이 가능한 결과 값들의 나열에 불과하다1. 특별한 하드웨어를 통한 난수 제어가 아니라면, 생성된 일련의 난수 배열은 예측 가능한 수의 배열에 불과하므로 진정한 의미에서의 난수는 아니다.
난수는 여러 가지로 활용될 수 있다. 가장 간단한 확률부터, 암호화까지 다양한 분야에서 활용될 수 있는데, .NET으로 예를 들면 암호화를 위해 예측할 수 없도록 수가 생성되는 특별한 난수 생성기를 지원하기도 한다2. 데이터 관점에서 보면 난수는 데이터 압축에도 사용될 수 있다.
Information Theory, 정보 이론
정보 이론은 데이터 압축에서 중요하게 사용되는 이론 중 하나이다3. 정보 이론에서 설명하는 엔트로피(Entropy)를 활용할 수 있으면, 프로그램에서 필요한 많은 데이터를 압축하여 보관할 수 있다. 주사위를 굴려 나올 수 있는 경우의 수는 6가지임을 우리가 이미 알고 있고, 그 값들의 나열에 대해 결과 값을 보장받을 수 있다면, 값들의 나열을 저장하는 것이 아닌 나열하기 위한 방법을 저장하는 것은 어떨까.
난수를 활용한 게임 중, 가장 널리 알려진 게임은 단연 마인크래프트라고 생각한다4. 마인크래프트는 월드를 시드 값으로 생성하여 월드의 전체를 사용자의 컴퓨터에 저장하는 것이 아닌 단순히 시드 값과 사용자(즉 플레이어)에 의해 변경된 값을 저장함으로서 데이터를 저장한다5. 그로 인해 마인크래프트는 우리가 사는 지구보다 비교하는 것이 무색할 정도로 큰 월드를 게임 내에 구현하는 것이 가능했다. No Man's Sky 또한 방대한 스케일의 우주를 구현하기 위해 시드를 활용하였다6.
이러한 방식을 일반적으로 절차적 생성 방식(Procedurally generated)이라고 부른다. 절차적 생성은 게임에서 다양한 곳에 사용되는 데, NPC 생성과 같이 보통 그 수가 많은 비효율적인 작업에 사용된다. 비주얼적으로 훌륭한 게임을 위해 100명의 NPC를 일일이 아티스트에게 작업을 요청하는 것보다, 절차적 생성을 이용하여 100명을 만들고, 그 작업을 해야 했던 아티스트를 다른 곳에 활용할 수 있지 않을까?
상업 게임에서는 잘 만든 게임도 중요하지만, 그 무엇보다 지켜져야 하는 것은 일정이다. 모든 게임은 결국, 정해진 개발 기간이 있다. 1인 개발이라 할지라도 자신이 가지고 있는 자원이 한정적인 이상, 개발할 수 있는 기간은 한정적일 수밖에 없다. 개발하면서 기간을 맞추기 위해 상당한 부분을 포기하는 경우가 있을 수 있다. 더 다양한 건물을 만들기 위해 내부 인테리어를 단일화한다던지, NPC 하나하나의 대화 퀄리티를 높이기 위해 NPC의 숫자를 줄인다든지. 이런 다양한 상황에서 절차적 생성 방식은 선택이 아닌 필수가 될 수 있다.
개발 기간의 한계를 극복하라
소규모 개발 인원의 한계를 절차적 생성을 통해 극복한 사례로, 앞서 이야기한 노 맨즈 스카이를 이야기하고 싶다. 노 맨즈 스카이는 하나의 시드로 월드부터 NPC, 그리고 다양한 시나리오까지 여러 부분에서 폭 넓게 사용된다. 개발자는 표현하고자 하는 세계를 효과적으로 표현하는 수단이 되었고, 플레이어는 개발자가 이야기하고 싶은 넓은 세계에 대해서 체험할 수 있게 되었다.
뿐만 아니라, 메인 스토리를 진행하기 위해 생성되는 행성의 위치, 그리고 랜드마크의 위치, 행성 생물군까지 절차적 생성을 통해 유저들이 전부 서로 다른 경험을 하도록 무작위성을 게임 내에서 굉장히 많이 차용하였다. 그로 인해 플레이어 입장에서 계속해서 새로운 행성을 탐험할 수 있게 하고, 매번 새로운 생물을 조우하는 등, 게임 내 경험에 있어서도 큰 작용을 하였다.
만약, 노 맨즈 스카이가 모든 행성, 오브젝트에 대해 수작업으로 작업을 했다면 천문학적인 개발 기간이 필요했을 것이다. 그렇다고 절차적 생성이 무조건적으로 옳은 방법이었을까? 출시 초기, 많은 플레이어는 큰 실망감을 드러내었다. 비슷한 행성군, 기이한 행성 구조등 이해하기 힘든 무작위성이 남발하는 환경에서 플레이어들은 혼란스러움을 경험하였다. 너무 많은 부분에 무작위성을 도입하여, 개발자도 예측하기 어려운 무작위가 남발되었기 때문이다. 절차적 생성은 개발에 있어서 많은 편의를 제공하는 것은 사실이지만, 이처럼 개발자가 원하는 의도를 전달하지 못할 수 있는 경우 또한 사실이다. 그도 그럴 것이, 무작위는 제어를 하지 않겠다는 의미이니까.
다양한 경험(UX)을 하도록 유도하라
의도한 절차적 생성을 게임의 역사에서 살펴보았을 때 가장 성공한 사례가 있다. 디아블로3는 게임 역사상 가장 많은 판매량을 올린 게임 중 하나이며, 시스템의 상당 부분이 난수에 의존한다8. 디아블로 3은 아이템의 성능에 난수가 개입하며, 아이템의 드롭 확률, 마을을 제외한 모든 필드의 절차적 생성등을 통해 모든 유저가 서로 다른 경험을 할 수 있도록 개발하였다. 필드의 부분 부분을 퍼즐처럼 조립하여 구성할 수 있게 하고, 그 순서만 난수를 통해 결정하는 등, 최소한의 난수 개입을 통해 개발자가 의도한 경험을 하도록 제한된 무작위성을 개발하였다. 그 결과, 게임 역사상 가장 성공한 타이틀 중 하나로 평가되고 있다.
물론, 디아블로3의 성공에는 여러 가지 요소들이 있다. 그러나 그중 최소한의 난수 개입이 그 요소 중 하나라는 것은 부정하기 쉽지 않다. 모든 유저가 각기 다른 경험을 하도록 하여, 최종적으로 재미로 이끌어내는 것. 절차적 생성이 주는 가장 큰 장점 중 하나이다. 디아블로는 시리즈 대대로 전통적으로 이어져 내려오는 "노가다"란 작업이 있다. 그저 반복해서 사냥하고, 더 높은 수치의 아이템을 얻어 더 높은 난이도를 도전할 뿐인 이 작업은 호불호가 매우 심한 게임의 재미 요소 중 하나이다. 무작위로 생성된 아이템으로 인해 자연스럽게 생긴 요소 중 하나라고 볼 수 있을 것이다.
우리는 언제나 선택의 갈림길에 있다. 개발 또한 마찬가지이다. 비용을 절감하여 얻을 수 있는 최대한의 이득을 챙기는 것이 바람직할지, 아니면 이득을 포기하더라도 자신만의 철학을 고수할지. 내가 만나본 대부분의 개발자는 자신의 철학을 지키고 싶어했다. 우리는 종종 실용 예술과 순수 예술을 착각하곤 한다. 다크소울과 같이 자신들만의 철학을 끝까지 고수할 것인지, 할리우드의 영화처럼 대중들만을 위한 영화를 만들 것인지. 어려운 선택을 해야만 한다. 난수는 이러한 문제들에 대해 대안이 될 수 있을 것이라 나는 기대한다.
참조
- https://stackoverflow.com/questions/4156907/why-is-random-not-so-random
- https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rngcryptoserviceprovider?view=net-8.0
- https://en.wikipedia.org/wiki/Information_theory
- https://gaming.stackexchange.com/questions/22474/how-do-level-seeds-work
- https://www.reddit.com/r/howdidtheycodeit/comments/njftx2/minecraft_world_saving/?rdt=52829
- https://en.wikipedia.org/wiki/Development_of_No_Man%27s_Sky
- https://www.gameinformer.com/b/news/archive/2012/02/09/how-big-is-a-minecraft-world.aspx
- https://yukaichou.com/gamificationnews/diablo-iii-gamification-winning-addicting/
© 2024 - 2024 Vvidr - All Rights Reserved.
'설계 > 철학' 카테고리의 다른 글
Bit-mask를 활용한 enum(열거형) 정리 (0) | 2024.02.09 |
---|---|
프로그램 이벤트를 효과적으로 관리하는 방법 (0) | 2024.02.08 |