본문 바로가기

머신러닝 및 실시간 렌더링

강화 학습·절차 생성의 활용 가능성과 Nanite·Lumen 중심 실시간 렌더링의 품질 비용을 비교합니다.

AI와 행동 트리에서는 사람이 규칙을 정해 AI의 행동을 만들었습니다. 그런데 규칙으로 모든 상황을 미리 정해 두기 어려운 경우도 있고, 화면에 보이는 세계는 점점 더 사실적인 조명과 형태를 요구합니다. 머신러닝(Machine Learning, ML)과 최신 실시간 렌더링(real-time rendering) 기술은 이 두 방향에서 게임의 가능성을 넓히고 있지만, 동시에 새로운 비용과 확인할 일도 함께 가져옵니다.

이 글에서는 게임 개발에서 머신러닝을 쓰는 영역과 언리얼에서 학습한 모델을 게임의 추론으로 연결하는 방법을 살펴보고, 언리얼 엔진 5의 나나이트(Nanite)와 루멘(Lumen), 가상 텍스처링이 무엇을 하고 어떤 비용이 드는지 정리합니다. 마지막으로 이런 기술을 도입할지 판단하는 기준을 세웁니다.


게임 개발과 머신러닝

머신러닝은 데이터에서 패턴을 배워 예측하거나 결정을 내리는 기술입니다. 게임에서는 NPC의 행동을 제어하는 데 그치지 않고, 콘텐츠 생성, 테스트, 최적화 같은 분야에도 쓸 수 있습니다.

강화 학습으로 AI 만들기

강화 학습(Reinforcement Learning, RL)은 AI 에이전트가 주어진 환경에서 시행착오를 거쳐 가장 좋은 행동 정책을 배우는 머신러닝 분야입니다. 게임에서는 NPC가 복잡한 전략을 스스로 익히거나, 플레이어의 행동에 더 자연스럽게 반응하도록 훈련시키는 데 씁니다. 플레이어의 패턴을 학습해 더 도전적인 적을 만들거나, 플레이어의 선택에 따라 바뀌는 대화 시스템을 만들거나, 게임 속 탈것이 스스로 달리고 날도록 학습시키는 것이 그 예입니다.

언리얼의 Learning Agents는 강화 학습과 모방 학습(imitation learning)을 위한 플러그인으로, 5.8 공식 문서에서 실험(Experimental) 기능으로 분류되어 있습니다. 강화 학습이라는 이름의 별도 플러그인이 있다거나 아무 학습 프레임워크와 저절로 연동된다고 가정하지 말고, 쓰는 버전의 학습 환경과 의존성을 확인합니다.

행동 트리가 규칙을 바탕으로 분명한 행동을 정하는 데 뛰어나다면, 강화 학습은 예측하기 어렵고 계속 바뀌는 상황에 대한 적응력을 높일 수 있습니다. 그래서 두 기술을 섞어 AI를 설계하는 방식도 많이 씁니다.

절차적 생성과 머신러닝은 다르다

생성적 적대 신경망(Generative Adversarial Networks, GAN)은 새로운 이미지, 텍스처, 3D 모델을 만드는 데 쓰일 수 있으며, 스타일 전이, 텍스처 생성, 환경 에셋 변형 같은 데 활용됩니다.

언리얼 엔진 5.2에서 실험 기능으로 소개된 PCG(Procedural Content Generation) 프레임워크는 절차적으로 콘텐츠를 만드는 시각적 도구를 제공합니다. 지형, 식생, 물체를 자동으로 배치하고 바꾸거나, 건물과 던전의 구조를 만들거나, NPC의 얼굴과 의상 같은 캐릭터 요소를 무작위로 만들 수 있습니다. 하지만 PCG 자체는 머신러닝이 아닙니다. 규칙 기반의 그래프만으로 배치할 수 있으며, 머신러닝 모델을 결합하려면 입력, 추론, 검증 경로를 따로 구현해야 합니다.

테스트와 최적화

머신러닝 에이전트가 게임을 자동으로 플레이하며 버그를 찾거나 특정 시나리오를 되풀이해 시험하는 자동화된 QA를 만들 수 있습니다. 머신러닝 모델로 게임의 병목을 예측하거나 그래픽 설정을 실시간으로 조절하는 동적 조절 시스템을 만들 수도 있고, 게임 데이터를 분석해 밸런스 문제를 찾고 값을 제안하게 할 수도 있습니다.

언리얼과 머신러닝 연결하기

Python Editor Script는 에디터를 자동화하는 경로일 뿐, 패키지 게임에서 일반적인 Python 게임플레이를 실행하는 경로가 아닙니다. 외부 학습 환경이나 지원되는 플러그인의 패키지는 따로 맞춥니다.

ONNX(Open Neural Network Exchange)는 모델을 주고받는 형식입니다. 선택한 런타임이 그 모델의 연산자, opset, 텐서 형식, 대상 플랫폼을 지원해야 추론할 수 있으므로, ONNX로 내보내는 데 성공한 것과 게임에서 동작하는 것은 별개입니다.

NNE(Neural Network Engine)는 언리얼에서 공통 추론 API를 제공하는 경로로, 5.8 문서에서는 베타(Beta) 기능으로 분류되어 있습니다. 모델과 CPU, GPU 런타임의 지원, 데이터 전송, 추론 지연을 확인해야 하며, 예전의 NNI 설명을 지금의 API처럼 쓰면 안 됩니다.


학습한 모델을 게임의 추론으로 연결하기

설계 연습으로 학습한 모델의 입력을 float 12개, 출력을 float 4개로 정하고, 샘플 하나의 텐서 모양을 [1, 12]와 [1, 4]라고 해 봅시다. 이것은 이 모델이 지켜야 할 입출력 약속의 예일 뿐, Learning Agents의 고정 입력 규격이나 자동으로 연결해 주는 API가 아닙니다. 입력의 순서, 단위, 정규화가 학습할 때와 같은지, 출력 네 값이 각각 어떤 행동을 뜻하고 게임의 허용 범위 안에 있는지 어떻게 검증할지를 정합니다. 입력이 잘못되었거나 모델이 실패했을 때 대신 쓸 규칙 기반 행동도 준비합니다.

Epic의 Neural Network Engine Overview 문서는 모델 파일을 가져오는 단계, 대상 런타임에서 모델을 만드는 단계, 입력 텐서의 모양을 정하는 단계, 추론을 실행하는 단계를 나눠 설명합니다. 모델을 가져오는 데 성공해도 선택한 런타임과 플랫폼에서 모델 생성이나 실행이 실패할 수 있습니다. 또 입력과 출력 메모리의 수명은 호출하는 쪽이 관리하고 반환 상태도 확인해야 하므로, ONNX 파일이 생겼다는 사실만으로 게임의 행동이 구현되었다고 말할 수 없습니다.


언리얼 엔진 5의 실시간 렌더링

언리얼 엔진 5는 대규모 지오메트리와 동적 전역 조명을 다루기 위한 두 가지 핵심 렌더링 기술, 나나이트와 루멘을 도입했습니다. 두 기술은 서로 다른 부담을 덜어 줍니다. 나나이트는 삼각형이 아주 많은 메시를 그리는 비용과 LOD를 손으로 만드는 작업을, 루멘은 간접광을 미리 구워 두고 장면이 바뀔 때마다 다시 굽는 작업을 줄입니다. 아래에서는 두 기술을 차례로 보고, 이름이 비슷해 헷갈리기 쉬운 가상 텍스처링이 무엇을 맡는지도 함께 짚습니다.

나나이트

나나이트는 높은 지오메트리 디테일을 화면에 필요한 만큼만 처리하는 가상화 지오메트리(virtualized geometry) 시스템입니다. 메시를 아주 작은 삼각형의 클러스터로 나누고, 카메라 가까이에 필요한 디테일만 실시간으로 불러와 스트리밍합니다. 화면에 보이는 크기에 맞춰 디테일을 고르므로 LOD를 손으로 만드는 부담이 줄어들고, 화면에 보이지 않거나 너무 작게 보이는 클러스터는 렌더링에서 자동으로 빠집니다. 다만 오차, 오버드로, 메모리, 스트리밍 비용까지 없어지는 것은 아닙니다.

덕분에 아티스트는 스캔 데이터나 CAD 데이터 같은 고디테일 에셋을 쓸 수 있지만, 인스턴스 수, 머티리얼, 스트리밍, 저장 공간의 예산은 확인해야 합니다. 아주 세밀한 환경과 물체를 실시간으로 그려 사실감을 높이고, 기존 LOD 방식의 한계를 넘어 손으로 하는 최적화 부담을 줄입니다. 오픈 월드 게임의 지형, 건물, 바위 같은 환경 에셋과 고품질 캐릭터, 무기, 차량 모델에 쓰입니다.

지원 범위는 버전마다 바뀝니다. 5.8 문서는 나나이트 스켈레탈 메시도 설명하므로 스켈레탈 메시를 일괄로 지원하지 않는다고 분류하면 안 됩니다. 반투명 머티리얼, 변형 방식, 대상 RHI 같은 것은 그 버전의 지원 표에서 확인합니다.

루멘

루멘은 언리얼 엔진 5의 실시간 전역 조명(Global Illumination, GI)과 반사 시스템입니다. GPU의 레이 트레이싱 하드웨어에 기대지 않고 소프트웨어로 장면을 추적해 전역 조명과 반사를 계산할 수 있으며, 하드웨어 레이 트레이싱과 함께 쓸 수도 있습니다.

손전등을 비추거나 문이 열려 빛이 들어오는 것처럼 장면이 바뀌면 루멘은 전역 조명과 반사를 갱신합니다. 다만 캐시, 추적 범위, 품질 설정 때문에 반응이 늦거나 아티팩트가 생길 수 있습니다. 직접광, 하늘빛, 스스로 빛나는 표면의 기여를 처리하지만, 광원, 머티리얼, 추적 방식마다 지원과 한계가 다르므로 작은 발광 물체나 화면 밖의 정보는 따로 확인합니다.

루멘을 쓰면 빛이 환경에 자연스럽게 반사되고 퍼져 사실적인 조명을 만들 수 있고, 라이트맵 베이킹이나 손으로 하는 GI 설정이 줄어 아티스트가 조명 설계에 더 집중할 수 있습니다. 실시간으로 바뀌는 장면에서도 조명의 품질을 유지하므로, 낮과 밤의 순환이나 날씨 변화, 부서지는 환경과 움직이는 물체에 의한 그림자와 GI 변화, 실내와 실외의 부드러운 전환에 쓰입니다. 대신 높은 품질의 루멘은 GPU 자원을 많이 쓰므로 대상 플랫폼에 맞춰 품질 설정을 조정해야 합니다.

가상 텍스처링

가상 텍스처링(Virtual Texturing)은 나나이트와 별개의 텍스처 가상화 기술로, 기가텍셀 규모의 아주 큰 텍스처를 효율적으로 스트리밍하고 관리합니다. 지금 필요한 부분만 메모리에 불러오므로 GPU 메모리의 부담을 줄입니다.


두 분야가 만나는 곳

머신러닝과 실시간 렌더링은 서로 보완할 수 있습니다. 머신러닝으로 에셋을 자동으로 만들거나 낮은 해상도의 에셋을 높은 해상도로 키워 나나이트가 다룰 고품질 데이터를 마련할 수 있고, 머신러닝 모델이 게임의 현재 상태를 분석해 루멘의 품질이나 렌더링 해상도를 동적으로 조절하게 할 수도 있습니다. 나나이트와 루멘으로 만든 사실적인 환경에서 머신러닝 기반 AI가 상호작용하면 몰입감도 커집니다.

하지만 머신러닝과 렌더링이 하나의 기능으로 자동 연동되는 것은 아닙니다. 각 기술의 입력과 결과 적용 경로를 따로 구현하고, 지원되지 않는 환경에서의 기본 동작도 정해야 합니다. 앞의 자동 QA, 밸런싱, 그래픽 설정 예측도 적용할 수 있는 설계의 예일 뿐, 이 교재에서 구현하거나 실행한 결과가 아닙니다.


도입을 판단하는 기준

이런 기술을 도입하기 전에는 목표 플랫폼, 추론 비용, 렌더링 예산, 대신 쓸 경로를 함께 점검합니다. 경로마다 준비할 것과 따로 측정할 것은 다음과 같습니다.

경로준비할 것따로 측정할 것
머신러닝 학습관측, 행동, 데이터, 평가 기준규칙 기반 기준선과 비교한 품질
실행 중 추론지원되는 모델, 런타임, 입출력 형식전송, 추론, 결과 적용의 지연
나나이트지원되는 메시, 머티리얼, 플랫폼지오메트리, 스트리밍, 메모리
루멘장면, 추적 방식, 조명 설정GPU 시간, 변화에 대한 반응, 아티팩트

나나이트의 메시 처리, 머신러닝의 입력과 추론, 루멘의 조명 비용은 서로 다른 일이므로 하나의 기능처럼 합쳐 생각하지 않고 각각 측정합니다.


정리

  • 머신러닝은 강화 학습으로 AI를 훈련시키고, 콘텐츠 생성, 자동 QA, 최적화, 밸런싱에도 쓸 수 있으며, 언리얼의 Learning Agents는 5.8에서 실험 기능입니다.
  • PCG 프레임워크는 규칙 기반의 절차적 생성 도구로, 머신러닝과는 다른 기술입니다.
  • 학습한 모델은 ONNX 같은 형식으로 가져와 NNE(5.8에서 베타)로 추론하며, 런타임 지원, 텐서 모양, 메모리 수명, 반환 상태를 확인하고 대신 쓸 규칙 기반 행동을 준비합니다.
  • 나나이트는 가상화 지오메트리로 고디테일 메시를 화면에 필요한 만큼 처리하고, 5.8에서는 스켈레탈 메시도 지원하지만 지원 범위는 버전마다 확인합니다.
  • 루멘은 실시간 전역 조명과 반사를 제공하지만 GPU 비용과 반응 지연, 아티팩트가 있으며, 가상 텍스처링은 큰 텍스처를 필요한 만큼 스트리밍합니다.
  • 각 기술은 따로 구현하고 측정하며, 지원되지 않는 환경의 기본 동작을 정합니다.

연습 문제

1. 에이전트 30명의 추론 비용

한 번의 호출을 차례로 처리하는 가상의 예에서 전처리와 전달에 0.5ms, 추론에 0.8ms, 결과 검증과 적용에 0.2ms가 들어 합이 1.5ms라고 합시다. 에이전트 30명이 모두 같은 프레임에 이 경로를 한 번씩 차례로 실행하면 얼마가 걸릴까요?

해설 보기

30×1.5 = 45ms입니다. 60FPS의 프레임 예산이 약 16.67ms이므로 이 경로만으로도 예산을 크게 넘습니다. 이것은 가정한 경로의 합일 뿐 실제 엔진에서 잰 값이나 전체 프레임 시간은 아니며, 호출을 여러 프레임에 나누거나 한 번에 묶어 처리할 수 있는지도 검토할 거리입니다.

2. GPU로 바꾸면 해결될까

앞의 경우에서 추론 런타임을 GPU로 바꾸기만 하면, 전송과 동기화 비용이 반드시 없어지고 전체 프레임도 그 합만큼 줄어들까요?

해설 보기

그렇지 않습니다. GPU를 고른다고 CPU와 GPU 사이의 데이터 전송이나 동기화 비용이 사라지지는 않으며, NNE의 GPU 인터페이스와 렌더 그래프 인터페이스는 텐서를 주고받는 방식과 실행 조건도 다릅니다. 지원되는 연산과 런타임, 플랫폼, 호출을 묶거나 나눌 수 있는지, 같은 대상 장면에서의 실제 CPU, GPU 비용을 확인해야 합니다.

3. 나나이트를 켜면 메모리 걱정이 없을까

나나이트를 켜면 LOD를 손으로 만들 필요가 줄어드니, 수백만 폴리곤의 스캔 에셋을 수천 개 배치해도 메모리와 저장 공간 걱정이 없다고 생각해도 될까요?

해설 보기

그렇지 않습니다. 나나이트는 화면에 필요한 디테일을 골라 그려 렌더링 부담을 줄이지만, 고디테일 에셋 자체의 저장 공간과 스트리밍, 메모리 비용은 그대로 남습니다. 인스턴스 수와 머티리얼도 비용에 영향을 줍니다. 디스크 용량, 다운로드 크기, 스트리밍 대역폭, 메모리를 대상 플랫폼에서 따로 측정하고 예산을 정해야 합니다.

기능의 상태는 Epic의 Learning Agents API 문서, Neural Network Engine 문서, Working with Nanite-Enabled Content 문서에서 쓰는 엔진 버전에 맞춰 확인합니다.

이것으로 11장을 마칩니다. 11장에서는 플러그인의 모듈 구조와 런타임, 에디터 모듈의 분리, ToolMenus와 슬레이트로 에디터 도구를 만드는 방법, AI 컨트롤러와 행동 트리, 블랙보드로 NPC의 판단을 설계하는 방법, 그리고 머신러닝과 나나이트, 루멘 같은 최신 기술의 쓰임과 비용을 살펴봤습니다. 다음 장의 프로젝트 기획과 설계부터는 지금까지 배운 내용을 모아 탄약을 줍고 HUD에 표시하고 저장하는 작은 실전 프로젝트를 만듭니다.