256MB 램에서 60fps, Minecraft PS3 소스 코드의 비밀!
최근 유출된 Minecraft PS3 소스 코드를 통해 C++ 기반의 콘솔 게임 개발 노하우를 엿볼 수 있음
메모리 효율성 극대화를 위한 비트 연산, 압축 기법, 힙(Heap) 우회 등 다양한 최적화 기술 적용
멀티 스레딩 환경에서의 락(Lock) 프리(free) 메모리 관리를 위한 독창적인 기법 활용
커뮤니티에서는 소스 코드의 정직한 주석(Honest Comments)과 개발 비하인드 스토리에 주목
포인터와 카운터를 하나의 값으로 묶는 기법
Minecraft PS3 버전은 SparseLightStorage.cpp에서 메모리 포인터와 플레인(plane) 카운터를 64비트 정수 하나에 담아 데이터 격리 아키텍처(Data Isolation Architecture)를 구현했다. 상위 16비트를 카운터로, 하위 48비트를 포인터로 사용하여, InterlockedCompareExchangeRelease64를 통해 락 없이 원자적으로 값을 교환한다. 댓글에서는 이러한 기법이 락 획득(Lock Acquisition)에 따른 성능 저하를 방지하고, 멀티 스레딩 환경에서 효율적인 메모리 관리를 가능하게 한다고 분석한다.
20줄의 회전 큐 기반 가비지 컬렉션
소스 코드에서는 포인터 트릭으로 인해 발생하는 문제를 해결하기 위해 3개의 회전 큐(Rotating Queue)를 활용한 가비지 컬렉션(Garbage Collection)을 구현했다. 각 큐는 삭제할 데이터를 저장하고, 매 틱(tick)마다 큐를 순환하며 데이터를 해제한다. 데이터 미저장 정책(Zero-Retention Policy)을 통해 최소 2 틱 동안 포인터가 유지되도록 보장하여, 동시성 문제를 해결한다. 커뮤니티에서는 이러한 간결하면서도 효과적인 메모리 관리 기법에 주목하며, 콘솔의 제한된 메모리 환경에서 최적의 성능을 내기 위한 전략이라고 평가한다.
광원 데이터 압축 및 Z-order 곡선
Minecraft PS3 버전은 광원 데이터를 압축하여 메모리 사용량을 줄이는 데 주력했다. 특히, 대부분의 블록이 어둡거나 밝다는 점을 활용하여, 128개의 Y 레벨(level)에 대한 인덱스를 사용하여 광원 데이터를 압축한다. 또한, Z-order 곡선(Morton code)을 사용하여 블록의 좌표를 메모리상에서 가깝게 배치하여 캐시 효율을 높였다. 댓글에서는 이러한 기법들이 256MB의 램(RAM)을 가진 콘솔 환경에서 성능 최적화(Performance Optimization)를 위한 핵심 기술이라고 분석한다.
힙(Heap)을 우회하는 메모리 할당
Minecraft PS3 버전은 메모리 단편화(Fragmentation) 문제를 해결하기 위해 XPhysicalAlloc을 사용하여 힙(Heap)을 우회하고, 물리 메모리를 직접 할당했다. 4KB 단위로 메모리를 할당하여, 메모리 해제 시 전체 페이지를 반환하도록 설계했다. 비록 메모리 낭비(Waste)가 발생할 수 있지만, 예측 가능한 메모리 사용량으로 안정적인 게임 플레이를 보장한다. 커뮤니티에서는 이러한 과감한 결정이 콘솔 게임 개발의 특징을 보여주는 사례라고 평가하며, 성능과 안정성(Performance and Stability) 사이의 트레이드오프(Trade-offs)를 보여준다고 분석한다.