(Game Dev Study) Grahpics - nsight-graphics

nsight-graphics 란?

https://developer.nvidia.com/nsight-graphics

Nsight Graphics는 NVIDIA에서 제공하는 그래픽 디버깅 및 프로파일링 툴로, 게임 개발이나 그래픽 애플리케이션 개발에서 성능 최적화와 문제 해결을 돕는 도구입니다.

  • 프레임 분석: 개별 프레임을 세밀하게 분석하여 렌더링 파이프라인의 각 단계에서 발생하는 성능 병목을 파악할 수 있습니다.
  • 셰이더 디버깅: 셰이더 코드를 실시간으로 디버깅하고 성능을 분석할 수 있어, 비효율적인 셰이더나 그래픽 문제를 빠르게 찾아 해결할 수 있습니다.
  • GPU 성능 분석: GPU 사용량과 자원 분배를 분석해 성능 병목을 파악하고, 멀티스레딩 및 CPU와 GPU 간의 효율적인 작업 분배를 돕습니다.
  • 메모리 분석: GPU 메모리와 VRAM 사용을 추적하여 메모리 누수나 과도한 사용을 발견하고, 리소스 최적화를 지원합니다.
  • API 호출 추적: DirectX, Vulkan, OpenGL 등 다양한 그래픽 API 호출을 추적하여 비효율적인 패턴을 찾고 수정할 수 있습니다.
  • 프레임 리플레이: 문제가 있는 프레임을 저장하고 나중에 재생하여, 렌더링 오류나 크래시 문제를 효과적으로 디버깅할 수 있습니다.
  • 실시간 성능 모니터링: 게임 실행 중 HUD와 성능 그래프를 통해 성능 상태를 실시간으로 확인하고 최적화 포인트를 찾을 수 있습니다.

nsight-graphics으로 분석할 수 있는 것

홈페이지에서 소개하고 있는 내용을 먼저 살펴보겠습니다.

Track GPU Performance
최소한의 오버헤드로 GPU 처리량과 사용률을 분석하여 편향되지 않은 활동 데이터를 수집합니다.
캡처된 타임라인에서 중요한 성능 마커를 세부적으로 분석하고, 하드웨어 유닛의 처리량, 캐시 적중률, 메모리 처리량 등을 검사할 수 있습니다.

Analyze GPU Traces
Nsight Graphics는 캡처된 GPU 추적에 대한 자동 성능 분석을 지원합니다.
스트리밍 멀티프로세서(SM) 성능에 대한 심층 프로파일링은 여러 프레임에 걸친 셰이더 실행을 자동으로 추적하여 이루어집니다.

Debug Ray-Tracing and Shaders
레이 트레이싱 API 호출을 디버깅하고 상태를 검사할 수 있습니다. Ray Tracing Inspector는 가속 구조를 노출하여 씬의 지오메트리와 레이의 교차를 최적화하는 데 도움을 줍니다.
또한 레이 트레이싱의 효율성을 확인하여 레이 탐색 속도가 높은지 확인할 수 있습니다.

Vulkan 셰이더 디버거를 통해 셰이더 코드를 디버깅할 수 있으며, 이를 통해 렌더 파이프라인에서 실시간으로 셰이더 소스를 확인하고 직접 수정할 수 있습니다.

Profile Ray-Tracing Shaders
Nsight Graphics의 셰이더 프로파일러는 셰이더 데이터를 노출하여, 정체 현상과 그 원인을 파악할 수 있게 합니다.
실시간 셰이더 프로파일러는 실시간으로 가장 비용이 많이 드는 셰이더를 확인할 수 있습니다.
셰이더 타이밍 히트맵은 픽셀별로 셰이더 처리 시간 지연이 발생한 부분을 씬에 겹쳐 시각화합니다.

레이 트레이싱 셰이더의 프로파일링은 GPU에 대한 광범위한 지식을 요구하는 복잡한 작업이지만, 이러한 기능을 통해 프로파일링 과정을 간소화하고 직관적으로 만들 수 있습니다.

Export C++ Capture
CPU 부하가 적은 환경에서 프레임 분석을 수행할 수 있는 독립된 C++ 프로젝트를 생성합니다.
이를 통해 원래의 애플리케이션에 구속되지 않고 반복 가능한 고립된 분석을 수행할 수 있으며, 최적화 실험을 안전하게 진행할 수 있는 보호된 환경을 제공합니다.

요약해보면… 아래 정도겠군요.
“GPU 성능 분석, 셰이더 및 레이 트레이싱 디버깅, 실시간 프로파일링을 통해 게임 및 그래픽 애플리케이션 개발에서 최적화와 문제 해결을 돕는 도구”

살짝 사용해본 경험

  • 테스트해볼 테스트 프로그램을 찾고 실행하는데 까지 뭔가 어렵다는 느낌은 있었습니다만 실행은 해보았어요.
  • Nsight Graphics를 실행 -> Start Activity 할때 사용할 프로그램을 선택하고 실행하면 알아서 프로파일링 툴이 프로그램에 붙습니다.
  • 프레임 디버깅을 실행했을 때, 렌더링 이벤트에 따라 어떤 API들이 호출되는지 디버깅할 수 있네요. (사실 봐도 어떤 내용인지 모르겠음)
  • Draw, Command 실행 등 눈에 띄는 이벤트나 API들을 확인할 수 있었습니다.


Nvidia 예시로는 이렇게도 다 볼 수 있다는데… 툴 창에서 이것저것 더 만져봤어야하나봅니다 😂

Nvidia 그래픽카드에서 동작할 경우 그래픽스 디버깅에 사용할 수 있는 툴로 사용해볼 수 있겠네요.
(AMD 그래픽카드에서 사용할 수 있는지는 모르겠군요)
엔비디아가 하드웨어 레이 트레이싱을 밀고 있어서 이 툴에도 레이 트레이싱 디버깅과 관련한 기능이 좀 있다는 생각도 들었습니다.

짧게 살펴보고 이만 마치겠습니다 😁

가이드 문서, 자료

다른 그래픽스 분석 툴

(Game Dev Study) Grahpics - RenderDoc

RenderDoc이란?

https://renderdoc.org/

그래픽 작업, 렌더링 최적화를 위한 프로파일링으로 사용할 수 있는 디버거 툴로 사이트에서 설명하는 내용을 가져와보면 다음과 같습니다.

RenderDoc is a free MIT licensed stand-alone graphics debugger that allows quick and easy single-frame capture and detailed introspection of any application using Vulkan, D3D11, OpenGL & OpenGL ES or D3D12 across Windows, Linux, Android, or Nintendo Switch™.
→ 요약해보면 오픈소스 그래픽 디버거로 쉬운 프레임 캡처와 상세 분석(검사)을 할 수 있는 툴입니다.

RenderDoc은 Github에서 소스를 공개하고 있으며 빌드는 홈페이지에서 다운로드 받을 수 있습니다.

Source: https://github.com/baldurk/renderdoc
Download: https://renderdoc.org/builds

RenderDoc으로 분석할 수 있는 것

언리얼 서밋 2019에서 다룬 내용을 중심으로 정리해보려합니다.

영상에서는 언리얼 엔진에서 RenderDoc 플러그인을 설정하고 보여주고 있어서 언리얼 엔진의 렌더링 파이프라인에 맞춰 정리해보겠습니다.

위 파이프라인은 추상화한 내용으로 더 자세한 내용은 참고 자료 링크로 남겨두겠습니다.
쉬운 이해를 위해 추상화를 하면서 그림을 그리는 단계와 비교해서 쉽게 설명해주셨어요.

밑그림 - 밑그림 색칠 - 다듬기 - 그리기 - 마무리
각 단계별로 어떤 내용들을 볼 수 있는지 알 수 있었습니다.

⭐ 요약 ⭐

  • PrePass - BasePass - Lighting - Translucency 각 단계에서 일어나는 일을 분석할 수 있음
  • Event Browser 에서 각 단계의 이벤트를 확인하고 Texture Viewer, Mesh Viewer, Pixel History 등의 기능을 통해 분석, 프로파일링할 수 있다

PrePass - 밑그림

RenderDoc에서 렌더링 파이프라인에 따라 이벤트가 발생하고 그 시점에 따라 분석할 수 있게 되어있네요. (화면 왼쪽에 Event Browser에서 확인할 수 있음)

위에서 보고 있는 event는 PrePass(PrePass DDM_AllOpaque …)입니다.

이 단계에서는 하위 이벤트에서 각 에셋들의 메쉬들을 Mesh Viewer를 통해 확인하고 과도하게 메쉬를 복잡하게 만들지 않았는지를 확인할 수 있습니다.
(폴리곤을 과도하게 사용하지는 않았는지 = 너무 디테일하게 메쉬를 만들었는지)

BasePass - 밑그림 색칠

BasePass는 PrePass와 동일하게 모델을 화면에 맞게 변형합니다. 그 후에 PrePass과 대조해서 필요한 곳에만 색칠하는 작업을 반복합니다. PrePass를 이용하여 필요한 곳만 색칠할 수 있습니다.
이 단계에서는 Texture Viewer에서 각 에셋을 텍스쳐로 색칠하는데에 필요하지 않은 텍스쳐가 사용되거나 잘못된 경우를 찾아볼 수 있습니다.

영상 예시로는 범용 머터리얼을 사용해서 발생한 이슈로 필요한 텍스쳐만 사용하는 머터리얼로 수정하고 해결하는 것을 볼 수 있었습니다.

Lighting - 다듬기

Lighting 단계에서는 에셋들이 빛의 영향을 잘 받는지 비효율적으로 빛의 범위가 크게 설정되어있지는 않은지 확인할 수 있습니다.

라이팅 각 이벤트를 눌러보고 Texture Viewer의 Outputs를 보면 어떻게 라이트가 적용되어 렌더링 씬이 바뀌어가는지 알 수 있어요.


영상에서는 불필요한 큰 라이트 범위를 조정해서 라이팅 렌더링 비용을 개선했습니다. 👍

Translucency - 그리기

이 단계는 대략 그림이 완성되었으니 마지막 마무리로 계속 이미지를 겹쳐서 그리는 단계입니다.
이 때에 추가로 그리는 범위가 커질수록, 겹쳐서 그릴수록 어려워지게됩니다. (비용이 커짐)

이 부분에 대한 프로파일링, 최적화는 언리얼 엔진 에디터에서도 쿼드 오버드로(Quad Overdraw)나 셰이더 복잡도(Shader Complexity) 뷰를 통해서 보고 개선해볼 수 있습니다.

RenderDoc에는 Pixel History 기능을 통해서 픽셀이 어떻게 변화했는지 볼 수 있는 편리한 기능이 있습니다.

  1. Texture Viewer → Outputs → 이미지에서 확인하고자하는 픽셀 영역을 오른쪽 버튼을 누릅니다
  2. Outputs 하단에 History를 누릅니다 → 픽셀이 변화한 히스토리를 확인합니다

영상에서는 확인한 곳의 픽셀은 안개에 의해 색이 변해야하는 곳인데 변하지 않는 것을 픽셀 히스토리를 통해서 확인 → 개선!

PostProcess - 마무리

PostProcess 단계는 포토샵의 필터 적용과 같은 단계로 볼 수 있는데요. RenderDoc에서 언리얼 엔진의 PostProcess를 보기는 쉽지 않다고 합니다.
어떤 기능에 의해 합쳐진 효과들이 적용되고 보이게되어서 RenderDoc에서는 한계가 있다고 합니다.

나중에 엔지니어나 TA 분에게 물어보고 공부해보는 것으로 해야겠군요 😃

마무리

오랜만에 최적화 부분을 이것저것 들여다보니 재미있었네요. 😎
찾다보니 RenderDoc은 오픈소스로 알려져있는 툴이고 Nvidia나 Intel에서도 분석툴이 있어서 나중에 한번 슬쩍보는 것도 재미있겠다 싶습니다.
나중에 시간나는대로 Nvidia 부터 살펴보고 포스트해보겠습니다. 👋

가이드 문서, 자료

다른 그래픽스 분석 툴

(Game Dev Study) DirectX, Vulkan 정리

Low level Graphics API (저수준 그래픽스 API)

DirectX, Vulkan을 소개하기에 앞서 저수준 그래픽스 API는 뭔지 알아봐야겠죠?

https://en.wikipedia.org/wiki/List_of_3D_graphics_libraries

위키에서는 3D 그래픽스 라이브러리로 이야기하고 있지만 그래픽스 API로 이해하고 보시면될 것 같습니다.
말 그대로 컴퓨터에서 3D를 볼 수 있게하는 그래픽스 엔진, 라이브러리로 이해하시면 편하겠네요.

이런 API를 통해서 언리얼 엔진이나 각종 게임 엔진에서 오브젝트들을 렌더링하고 그래픽 결과물들을 보여주고 있습니다.

DirectX, Vulkan 소개

DirectX

https://ko.wikipedia.org/wiki/DirectX

마이크로소프트에서 만든 주로 게임 개발에 널리 쓰이고 있는 API입니다. (멀티미디어를 위한 API)
DirectX에는 2D, 3D 등 그래픽 렌더링을 위한 API가 포함되어있습니다.

DirectX는 마이크로소프트 플랫폼(Windows, Xbox)에서 동작하는 그래픽스 API로 많은 게임에서 사용되는 API입니다.
현재 최신 버전은 12버전으로 Dx12, D3D12로 많이 부르기도합니다.

관련 자료들은 마이크로소프트 페이지에서도 확인하실 수 있으니 참고해보세요!

Vulkan

https://ko.wikipedia.org/wiki/%EB%B2%8C%EC%BB%A8_(API)

Vulkan은 크로스 플랫폼 3D 그래픽스 API입니다. 모바일, 리눅스, 마이크로소프트 플랫폼 등에 사용될 수 있다는 뜻이죠.
크로노스 그룹에서 OpenGL의 차세대 버전으로 준비하다가 Vulkan이라는 이름으로 릴리스되었습니다.

OpenGL처럼 게임이나 미디어 처럼 고성능 실시간 3D 그래픽스 앱을
모든 플랫폼에서 고성능으로 CPU를 적게 사용하도록 개발하는 것을 목표로 만들어진 API입니다.

영상에서는 기존 OpenGL 보다 Vulkan이 CPU 코어 활용성이 좋고 에너지를 덜 쓰는 것을 비교해서 보여주고 있네요.

DirectX 11, DirectX 12, Vulkan 뭘 써서 개발해야할까?

요즘 게임 개발을 하는데 바로 저수준 그래픽 API를 사용해서 개발하는 경우는 별로 없을겁니다.
언리얼 엔진이나 유니티 등 상용 엔진들을 사용해서 게임 컨텐츠를 개발하고 있죠.

컨텐츠 개발 이후 최적화에 있어서 어떤 것을 중점으로 최적화를 할지, 어떤 플랫폼에 런칭을 할지에 따라 위 질문에 있는 모든 것을 사용해야할 수도 있습니다.
Dx11이 Dx12 보다 버전이 낮지만 현재 개발된 환경에 따라 11 버전을 사용해야할 수도 있겠죠.
API에 맞게 최적화도 필요한 것이 있어 각 개발 환경에 맞춰 개발해야한다 정도로 이야기할 수 있을 것 같습니다. (너무 정론이네요 😂)

DirectX vs Vulkan?

2개의 API를 확인해보았으니 비교를 안해볼 수 없죠! 사실 Youtube에서 2개의 API를 치면 많이 나오는 것이 비교내용입니다.
게이머 입장에서는 그래픽 품질은 좋고 FPS가 잘나오면 최고이니까요. 게임 개발 엔진들에서도 각 API를 사용하여 개발할 수 있도록 지원하고 있기도하구요.

영상만 보았을 때는 Dx11은 Dx12, Vulkan에 비해 안좋은 버전으로 보이지만 사실 버전에 맞춰 게임 코드도 최적화가 필요하기에 버전만 12로 올리기는 어렵습니다.

다른 블로그 글이나 아티클들을 보면 두 API를 비교한 것은 대부분 성능상의 비교가 대부분인데요.
이건 사실 하드웨어 + 게임(앱) 마다 천차만별이라서 뭐가 더 좋고 나쁘다를 판별하기는 어렵다고 생각합니다.

마무리

사실 2개의 API를 비교하고 차이점을 정리하기에는 어려움이 있네요.

각각 그래픽을 렌더링하기 위해 다른 동작을 사용하고 있는 것도 있고 기본 개념이 같은 것들도 있었습니다.

이번 포스팅을 위해 공부를 얕고 짧게했지만 누가 우위에 있냐는 크게 중요하지 않은 것으로 결론을 내렸습니다.

아마 다음에는 하나하나 조금 더 깊게 공부할만한 주제로 찾아올 수 있지 않을까 싶네요.

다음에는 게임 개발에 필요한 그래픽스에 대해 조금이나마 더 알 수 있는 지식으로 찾아오겠습니다. 감사합니다. 😈