SungJin Kang

SungJin Kang

hour30000@gmail.com

© 2024

Dark Mode

언리얼 엔진5 나나이트라는 기술이 이제서야 등장한 이유 ( LOD, SSD )

언리얼 엔진5 데모를 PS5에서 구동한 이유는 무엇일까??
뭐 여러 이유가 있겠지만 이 글에서는 언리얼5의 기능인 나나이트 ( Nanite ) 의 관점에서 글을 써보겠다.

우선 나나이트는 무엇인가?
나나이트는 쉽게 얘기하면 보통 게임 엔진들이 가지고 있는 LOD를 엄청 많은 삼각형들을 가지고 할 수 있게 해주는 기능이다.

여기서 LOD라는 것은 그릴려는 오브젝트의 메쉬 버텍스의 수를 오브젝트와 카메라의 거리에 따라 유동적으로 조절하는 기능이다.
왜 조절하냐? 이유는 아주 멀리 있는 오브젝트에 복잡한 버텍스로 그릴 필요가 없기 때문이다. 티도 나지 않는다.
아주 많은 버텍스를 그려서 아주 세세하기 메쉬를 그려봤자 오브젝트가 멀리 있을 경우 눈에 잘 뛰지도 않고 티도 나지 않기 때문에 그냥 오브젝트가 멀리 있는 경우 기존의 메쉬의 단순화된 ( 버텍스 수를 줄인 ) 버전으로 그려서 복잡한 버텍스를 처리하는 데 드는 성능 소모를 줄이는 것이다. 각 LOD의 버텍스 데이터는 모두 항상 VRAM에 로드되어 있어야한다.

언리얼 엔진5의 나나이트는 이 LOD의 성능을 극대화하여서 거의 화면 상의 픽셀 하나 당 삼각형이 하나씩 배치될 정도로 엄청난 수의 삼각형을 그릴 수 있게 만들어준다.
과거에는 버텍스 수가 많아지게 되면 느려지기 때문에 게임에서는 LOD와 같은 기술을 사용하거나 버텍스 수를 줄여서 최적화를 하였는데 언리얼5에서는 거의 영화에서 사용하는 실사에 가까운 메쉬들 ( 엄청난 수의 버텍스를 가진 )을 그냥 무식하게 게임에 사용한다.
이를 가능하게 해주는 것이 LOD이다. 멀리 있는 메쉬에는 적은 수의 버텍스를 가지고 그리고 가까운 오브젝트들에만 많은 양의 버텍스를 가지고 그리기 때문에 GPU가 빠르게 렌더링할 수 있는 것이다.
나나이트는 여기서 LOD간의 전환을 섬세하게 조절하여 LOD간의 전환을 사람이 눈치 챌 수 없을 정도로까지 자연스럽게 만들어준다.

그럼 이 나나이트라는 기능이 왜 이제서야 등장한 것인가?

무식하게 엄청난 수의 버텍스를 가진 메쉬를 사용하고 LOD를 통해 멀리 있는 오브젝트들의 경우 간소화된 버전의 LOD 메쉬로 그려서 빠르게 렌더링을 한다고 했는데 게임에서 카메라는 계속 움직이기 때문에 멀리 있던 오브젝트가 가까워지면 원래는 멀리 있어서 간소화된 버전의 LOD를 엄청난 양의 버텍스를 가진 LOD 버전으로 교체해주어야한다. 여기서 성능 저하가 발생하는데 무식할 정도로 많은 버텍스를 가진 메쉬를 그대로 사용하기 때문에 이 메쉬들의 버텍스 ( 각각의 LOD 버전의 버텍스 )가 VRAM에 다 들어가지 않는 것이다. 그렇기 때문에 VRAM에 여유 공간이 없어지고 그 버텍스 데이터들을 DRAM에 올리기도 사이즈가 너무 커 HDD에 올려 두었다가 필요할 때 그때 그때 VRAM에 올리는 것이다. 언리얼 엔진은 나나이트라는 기술을 통해 적절한 버전의 LOD를 선택하여 버텍스 데이터들을 임의로 HDD에서 VRAM으로 로드한다. ㄴ

참고로 VRAM에도 페이징 시스템이 존재하여서 VRAM내에 사용한지 오래된 버텍스 데이터는 DRAM으로 축출되고 심지어는 디스크로까지 축출된다. ( 이 말은 굳이 VRAM에서 데이터를 Manual하게 Unload 해주지 않아도 오래된 데이터들은 자동으로 DRAM, HDD로 축출된다는 뜻이다. ) ( 캐쉬에서 DRAM으로, HDD로 데이터가 축출되는 것과 같이 VRAM에서도 VRAM 공간이 부족해지면 자동으로 DRAM, HDD ( Virtual Memory, Page out )로 데이터 축출이 되는 것이다. 이에 대해서는 이 글을 읽어보아라. ) )

핵심은 얼마나 빨리 버텍스 데이터를 HDD에서 VRAM으로 가져오느냐이다.
HDD에서 바로 VRAM으로 데이터 전송이 불가능하고 HDD에서 DRAM으로 버텍스를 전송, DRAM에서 VRAM으로 버텍스를 전송하는 과정을 거쳐야한다.
다행히도 DRAM에서 VRAM으로의 전송은 생각보다 느리지 않다. ( DRAM에서 GPU로의 데이터 전송, DRAM에서 GPU로의 데이터 전송2 ) 문제는 HDD에서 DRAM으로 데이터를 전송하는 것이 매우 느리다는 것이 문제다… 다행히도 SSD라는 것이 등장하였고 SSD에서 DRAM으로 데이터 전송이 빨라져 이 나나이트라는 기술이 가능하게 된 것이다. ( SSD가 등장하기 전 HDD 시대에는 HHD와 DRAM간의 데이터 전송이 느리기 때문에 나나이트라는 기술이 불가능했다. )

그럼 왜 에픽게임즈는 언리얼 엔진5의 데모를 PS5에서 구동하여 공개하였는가?

위에서 말한대로 핵심은 디스크에서 VRAM까지 얼마나 빠르게 버텍스 데이터를 전송하느냐이다. 일반적으로 PC에서는 디스크에서 DRAM을 거쳐서 VRAM까지 버텍스 데이터를 전송한다. 이것은 느리다.
반면 PS5는 GPU와 CPU가 같은 메모리를 사용한다. ( Unified 메모리 ) 그 만큼 디스크에 있는 데이터가 빠르게 GPU에 전달된다. ( 한 단계만 거치면 됨. )
사실 이거는 예전 콘솔도 가능했다 ( PS4도 Unified 메모리 가짐 ). 다만 PS5에서는 NVME SSD를 채택하면서 디스크에서 메모리로 데이터를 전송하는 속도가 엄청나게 빨라졌다는 것이다.
이를 통해 엄청난 수의 버텍스를 가진 LOD간의 전환이 매우 매우 빨라져 티가 나지 않을 정도까지 LOD를 빠르게 전환할 수 있는 것이다.

또한 이러한 버텍스 데이터는 매우 크기 때문에 디스크에 압축이 된 상태로 저장이 되어 있는데 PS5는 CPU의 개입없이 하드웨어단에서 이러한 압축된 버텍스 데이터를 매우 빠르게 압축 해제해준다. ( 일반적으로 압축된 파일을 해제하려면 CPU가 필요하다. )

references : https://www.tweaktown.com/news/71340/understanding-the-ps5s-ssd-deep-dive-into-next-gen-storage-tech/index.html