(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 부터 살펴보고 포스트해보겠습니다. 👋

가이드 문서, 자료

다른 그래픽스 분석 툴

Perforce(P4V) 체크아웃, 체크아웃 해제

체크아웃(Check Out), 체크아웃 해제(Check out file Revert)

Perforce Client(P4V) basics

체크아웃 방법

체크아웃 후 파일 오픈!
체크아웃 후 파일이 열린 모습
  • 체크아웃하려는 파일을 워크스페이스 파일 트리에서 파일을 선택, 오른쪽 버튼으로 체크아웃합니다.
  • Check Out, Check Out and Open 메뉴를 통해서 체크아웃할 수 있습니다.

체크아웃 참고

작업할 이미지 파일이 Lock된 상태"
이미 누군가 파일을 체크아웃했다고 합니다

  • 이미지, 에셋 등 Exclusive file을 체크아웃할 때 다른 작업자가 체크아웃하고 있을 경우 체크아웃할 수 없습니다.
  • 작업을 하고자할 경우 현재 진행중인 작업이 마무리되고 체크아웃하여 작업할 수 있습니다.

체크아웃 해제

파일 체크아웃 해제: Revert

  • 체크아웃한 파일들을 더 이상 수정하지 않는다면 Revert를 이용하여 체크아웃을 해제할 수 있습니다.
  • Changelist에서 마우스 오른쪽 버튼 -> Revert Files 또는 Revert Unchanged Files로 리버트할 수 있습니다.
    • Revert Files : Changelist에 있는 모든 파일의 수정을 취소합니다.(리버트합니다)
    • Revert Unchanged Files : Changelist에 있는 수정되지 않은 파일을 pending list를 제외합니다. (이것도 리버트라고 볼 수 있겠네요)
  • 파일 각각 선택하여 리버트할 수도 있습니다.

Revert시 변경한 내역이 있는 파일이 있는 경우

  • 다른 옵션 설정 없이 그냥 리버트해도 상관 없습니다.
  • 두번째 옵션(Get the latest revision and then check out all files that were reverted)의 경우 리버트 후 파일들을 최신 데이터로 업데이트한 뒤 체크아웃해줍니다.

다른 Perforce 가이드 문서들

Unreal Engine 크래시 분석 서비스 조사

조사 목적

  • 언리얼 엔진으로 게임을 만들 때에 사용하는 크래시 분석 서비스는 무엇이 있는지 알아봅니다.
  • 단순히 크래시 덤프를 수집하는 것에 그치지 않고 어떤 크래시가 많이 발생하고 있는지 트렌드나 특이점을 확인할 수 있는 서비스들이 있는지 찾아봅니다.

언리얼 크래시 리포터(Unreal Crash Reporter)

Unreal Crash reporter

언리얼 엔진 크래시 분석 서비스

알아본 크래시 분석 서비스

Sentry 👍

Sentry dashboard

https://sentry.io/welcome/
https://docs.sentry.io/platforms/unreal/

센트리(Sentry)는 웹 서비스, 앱 서비스에서도 많이 쓰는 이슈 관리 솔루션으로 알고 있습니다.
언리얼에서 사용하고자 할 경우에는 minidump를 직접 올리거나 크래시 리포터에 연결, 크래시 덤프를 올리는 방식인 것 같습니다.
가이드 문서를 보면 제한 사항이 있네요.

  • 20MB for a compressed request → 크래시 덤프 업로드시 압축된 데이터가 20MB 이하여야 하고
  • 100MB for the full crash report after decompression → 크래시 덤프 압축을 해제하면 100MB 이하여야 함

이런 제한을 참고해서 센트리를 도입해서 유의미하게 쓸 수 있는지 검토해야겠네요.
(덤프에 많은 정보를 남길 경우 센트리를 쓰지 못한다는 이야기… 😂)

플러그인이 있어서 설정은 쉬웠네요.
센트리 설정 경험기: Sentry - Uneal Engine 4.27 integration

BugSplat 👍

BugSplat dashboard

https://www.bugsplat.com/
https://docs.bugsplat.com/introduction/getting-started/integrations/game-development/unreal-engine

요 서비스는 언리얼 플러그인까지 있는 서비스여서 설정은 편할 것 같습니다.

센트리는 제한이 있었는데 BugSplat에도 제한 사항이… 있군요.
센트리랑 비슷하게 압축된 덤프의 사이즈가 20MB 여야합니다. 😂 (참고 링크)

  1. 에디터에서 프로젝트 설정에 “크래시 리포터 포함” & “디버그 파일 포함” 설정해주기
  2. DefaultEngine.ini 에 크래시를 보낼 주소를 입력해주기
    1. DataRouterUrl=”https://{database}.bugsplat.com/post/ue4/{appName}/{appVersion}”
  3. 4.26 이후 버전에는 DefaultEngine.ini 파일을 아래 경로에 복사해줘야 함(폴더가 없으면 다 만들어서 넣어줘야 함)
    1. 패키지 빌드 폴더\Engine\Restricted\NoRedist\Programs\CrashReportClient\Config
  4. 패키지 빌드에서 크래시 발생시키면 대시보드에서 바로 볼 수 있음

BugSplat도 Trial로 설정해보고 테스트해보았는데 가이드 문서대로 설정해볼 수 있었습니다.
BugSplat 설정 경험기: BugSplat - Uneal Engine 4.27 integration

Backtrace 👍

Dashboard

https://backtrace.io/
https://support.backtrace.io/hc/en-us/articles/360040106172-Unreal-Integration-Guide

백트레이스 서비스는 언리얼 엔진 설정이 가능한 솔루션이네요.
가이드 문서상 크래시 덤프 사이즈 제한은 보이지 않습니다.

요 친구도 플러그인이 있지는 않고 따로 크래시 리포터 설정에 DataRouterUrl 설정만 해주면되네요.
BugSplat과 동일하게 패키지 빌드 폴더\Engine\Restricted\NoRedist\Programs\CrashReportClient\Config 경로에 DefaultEngine.ini 가 있어야 크래시 덤프가 업로드되는 것 같습니다.

따로 플러그인은 있지 않고 단순 크래시 리포터 설정으로 가능하며 다른 크래시 분석 서비스와 비슷한 기능들을 가지고 있습니다.

  • Overview: 대시보드로 크래시 전체적인 현황을 볼 수 있는 뷰
  • Release: 업데이트된 버전 별로 크래시 지표를 볼 수 있는 뷰
  • Triage: 발생한 크래시를 테이블로 볼 수 있는 뷰. 필터를 적용해서 볼 수도 있음
  • Debug: 각 크래시별 정보를 상세히 볼 수 있는 뷰

크래시 정보를 상세히 볼 수 있도록 심볼 업로드는 프로젝트 세팅 > 심볼 설정에서 할 수 있습니다.

백트레이스도 크래시 분석 서비스들과 무난히 비슷한 서비스인 것 같네요.
실제 다른 서비스와 장단점을 상세 분석해보려면 다양한 케이스로 사용해봐야할 것 같습니다.

Raygun 🤔

(⚠ 언리얼 엔진에 설정하기 쉽지 않은 서비스)

https://raygun.com/

레이건 서비스는 따로 언리얼 엔진 플러그인이 있지는 않네요.
이 서비스를 사용한다면 C++ 항목으로 구성하고 minidump(breakpad)를 업로드하는 방식으로 시도해보았는데 잘 되지 않았습니다.

  1. 가이드 문서 확인 → sender.SendCrashReport(L"https://api.raygun.com/entries/breakpad?apikey=...", userCustomData, files, 0); 코드 확인 → URL로 덤프를 보낼 수 있도록 설정
  2. DefaultEngine.ini 에서 [CrashReportClient], DataRouterUrl 항목에 위 URL 입력
  3. 크래시 발생 후 크래시가 남는지 확인 → 확인할 수 없었음

다른 서비스에서 했던 것 처럼 크래시 업로드 URL에만 덤프를 올리면 가능할 것으로 기대했지만 잘되지 않네요.
Raygun은 웹서비스 설정이 더 편한 서비스라고 보여서 설정을 더 시도해보지는 않았습니다.

Countly ❓

(⚠ 언리얼 엔진에 설정하기 쉽지 않은 서비스)

https://countly.com/
https://countly.com/feature/crashes-errors

카운틀리는 자체 서버 구축과 클라우드 서비스를 사용할 수 있는 서비스 시스템으로 볼 수 있습니다.
자체 서버 구축: https://support.count.ly/hc/en-us/articles/360036862332-Installing-Countly-server
언리얼 엔진 크래시 분석 서비스로 사용하려면 자체 서버 구축과 클라이언트에 minidump로 업로드 설정하는 방법으로 가능하네요.

마무리

위와 같이 언리얼 엔진 게임으로 크래시 현황, 분석을 할 수 있는 5가지 정도의 서비스를 알아보았습니다.

핵심 기능은 비슷한 것 같았고 2가지 정도는 C++ 빌드로 만들어진 프로그램을 minidump를 업로드하고 그 것을 분석하는 방식을 가지고 있었네요.
대부분 앱과 웹 서비스에서 발생하는 비정상 종료, 크래시를 분석하는 데에 맞춰져있었습니다.

언리얼 엔진으로 접근성이 좋았던 것은 Sentry 정도였고 나머지는 프로젝트 설정에 따라 커스텀 설정을 해줘야하는 것들이 좀 있었습니다.

Countly의 경우에는 서버를 자체 구축할 수 있다는 점에서 크래시 덤프 파일 사이즈가 크더라도 사용할 수 있겠다 싶었습니다.
(덤프에 많은 정보를 담고자할 경우 덤프 파일이 100MB가 넘어가는 경우도 있긴하더라구요.)

Countly 설정은 클라, 크래시 분석 서비스 서버 설정까지 해야해서 나중에 한번 해보고 포스트 남겨보겠습니다. 👋

BugSplat - Uneal Engine 4.27 integration

BugSplat

홈페이지: https://www.bugsplat.com/
가이드 문서: https://docs.bugsplat.com/introduction/getting-started/integrations/game-development/unreal-engine

설치, 설정 방법

가이드 문서: https://docs.bugsplat.com/introduction/getting-started/integrations/game-development/unreal-engine

설정 방법은 간단합니다.

  1. 에디터에서 프로젝트 설정에 “크래시 리포터 포함” & “디버그 파일 포함” 설정해주기
  2. DefaultEngine.ini 에 크래시 덤프를 보낼 주소를 입력해주기
    1. DataRouterUrl=”https://{database}.bugsplat.com/post/ue4/{appName}/{appVersion}”
  3. 4.26 이후 버전에는 DefaultEngine.ini 파일을 아래 경로에 복사해줘야 함(폴더가 없으면 다 만들어서 넣어줘야 함)
    1. 패키지 빌드 폴더\Engine\Restricted\NoRedist\Programs\CrashReportClient\Config
  4. 패키지 빌드 폴더에서 심볼 파일 업로드(.pdb)
    1. sendpdbs 커맨드라인 프로그램을 이용해서 심볼 파일 업로드 (가이드 문서 참고)
    2. SendPdbs.exe /u {username} /p {password} /b {database} /a {appName} /v {appVersion} /s /f “.pdb;.dll;*.exe”
  5. 패키지 빌드에서 크래시 발생시키면 대시보드에서 바로 볼 수 있음

설정 상세

  • DefaultEngine.ini에 DataRouterUrl에는 {} 값을 실제 사용할 값으로 바꿔서 입력해야합니다
    • {database} 는 BugSplat에 설정에서 데이터베이스를 만들어서 사용할 수 있습니다
  • 언리얼엔진 4.27.2 버전은 가이드 문서에 있는 아래 내용을 참고하여 추가 설정해줘야합니다
    • “For capturing crashes in packaged games in Unreal Engine 4.26 and newer, copyDefaultEngine.ini to {output directory}\Engine\Restricted\NoRedist\Programs\CrashReportClient\Config making sure to create folders that don’t exist (where{output directory} is the location of your packaged build).”
    • 이 폴더에 DefaultEngine.ini 파일이 없는 경우 BugSplat에서 크래시를 확인할 수 없었습니다

크래시 업로드 확인

프로젝트 패키지로 만들어진 바이너리 실행 후 크래시를 발생시킵니다.
저는 크래시 발생시키는 명령어 이름을 crashMe로 지어두었고 콘솔 명령어로 실행하면 아래와 같이 크래시 리포터가 뜨게됩니다.

크래시 리포터

“Send and Close”로 크래시 정보를 보내면 센트리에서 크래시 정보를 볼 수 있게됩니다.

BugSplat-이슈 대시보드
BugSplat-이슈 상세

마무리

Sentry에 이어서 BugSplat이라는 서비스에서 크래시 업로드, 크래시 대시보드 확인을 한번 해보았습니다.
BugSplat은 Sentry에 비해서 투박한 느낌이 있습니다.
Overview / Other Threads / Registers / Modules 등 각 항목별로 나눠서 보여주고 있지만 Sentry를 보고 BugSplat을 보니 뭔가 필요한 정보는 알아서 찾아서 보세요의 느낌이 강했네요.
두 서비스 모두 크래시 분석을 위한 정보들을 잘 보여주고 있는 것 같았습니다.
(엔지니어분과 같이 이런 뷰 형태는 어떤지 확인은 해봐야겠지만요 😂)

다른 크래시 분석 서비스도 다음 포스트에서 다뤄보겠습니다.

참고: Sentry - Unreal

Sentry - Uneal Engine 4.27 integration

Sentry - Uneal Engine 4.27 integration

준비 사항

⚠️ 프로젝트가 C++ 클래스를 빌드할 수 있는 상태여야 합니다.

(가이드 문서 내용) Currently, this method is available only for C++ UE projects. Blueprint projects can be converted to a C++ one by adding an empty class using the editor.
→ 현재 이 메서드는 C++ UE 프로젝트에서만 사용할 수 있습니다. 블루프린트 프로젝트는 에디터를 사용하여 빈 클래스를 추가하여 C++ 프로젝트로 변환할 수 있습니다.

C++ 클래스 빌드를 위해서는 Visual Studio 설치가 필요합니다.
관련 구성요소를 설치해야하는데 설치해야하는 것은 다음과 같습니다.

  • .Net 데스크톱 개발, C++를 사용한 데스크톱 개발, 유니버설 Windows 플랫폼 개발

설치, 설정 방법

https://docs.sentry.io/platforms/unreal/
https://github.com/getsentry/sentry-unreal

설치 방법은 간단합니다.

  1. Github에서 Sentry-unreal 소스를 받는다.
    1. 4.27 버전 엔진의 경우 0.5.0 버전을 받아야함.
    2. 5.0 이상 엔진의 경우 최신 버전을 사용할 수 있음 (현재는 0.7.0)
  2. 받은 소스를 프로젝트 폴더/Plugins 폴더 하위에 옮긴다.
  3. 프로젝트를 실행한다.
    1. 프로젝트 실행시 플러그인을 빌드하겠냐는 팝업이 실행되면 빌드한다
  4. 이후 문서 가이드를 참고하여 설정한다
    1. https://docs.sentry.io/platforms/unreal/#configure

설정 상세

  • Project Settings > 프로젝트-패키징 > 패키징 > 크래시 리포터 포함에 체크해줍니다.
  • Project Settings > Plugins > Sentry 에서 DSN 값을 설정해줍니다.
    • 가이드 문서에서 Text 블록에 있는 텍스트를 클릭하면 현재 생성해둔 프로젝트들의 DSN 값을 골라서 볼 수 있습니다.
  • DSN 설정 후 하단에 있는 Crash Reporter Endpoint도 설정해줍니다.
    • 크래시 리포터를 통해 크래시 덤프 업로드하는 곳을 설정해주는 것입니다.

DSN, Crash Reporter Endpoint URL은 Sentry 웹페이지에서 프로젝트 > 프로젝트 설정 > SDK SETUP - Client Keys(DSN)에 있습니다

설정 후 크래시 테스트

저는 크래시 테스트를 위해 기본 프로젝트 생성 후 아래와 같이 진행했습니다.

  1. 기본 프로젝트 생성
  2. 파일 > 새로운 C++ 클래스 추가 > Game Mode Base 선택 > Game Mode 클래스(ex. MyGameModeBase class) 추가
  3. MyGameModeBase에 콘솔 명령어 함수 작성
  4. 에디터에서 월드 세팅 > Game Mode > 게임 모드 오버라이드에서 MyGameModeBase 설정
  5. 컴파일 후 프로젝트 패키지하여 프로그램 실행 테스트

코드

크래시 센트리 업로드 확인

프로젝트 패키지로 만들어진 바이너리 실행 후 크래시를 발생시킵니다.
저는 크래시 발생시키는 명령어 이름을 crashMe로 지어두었고 콘솔 명령어로 실행하면 아래와 같이 크래시 리포터가 뜨게됩니다.

크래시 리포터

“Send and Close”로 크래시 정보를 보내면 센트리에서 크래시 정보를 볼 수 있게됩니다.

Sentry-이슈 대시보드
Sentry-이슈 상세

마무리

이번 포스트에서는 간단히 센트리-언리얼 엔진 설정을 다뤄봤는데 글은 간단했지만..
실제로 크래시를 일으키기 위해 어떻게 해야할지 여러가지 난관이 있었네요.
(언리얼 엔진 에디터에서 처음 빌드해보고 Visual Studio로 연결하는 것도 처음이다보니 좀 걸렸습니다. 😅)
다음 포스트에는 다른 크래시 분석 툴을 설정해보고 포스트 남겨보겠습니다. 감사합니다. 🙏

설치중 에러 참고

ERROR: Could not find NetFxSDK install dir; this will prevent SwarmInterface from installing. Install a version of .NET Framework SDK at 4.6.0 or higher.

  • Visual Studio에서 빌드에 필요한 컴포넌트가 설치되어 있지 않아 발생하는 문제.
  • .Net 데스크톱 개발, C++를 사용한 데스크톱 개발, 유니버설 Windows 플랫폼 개발 설치

Plugin build fail

  • 플러그인이 소스코드만 포함되어있는 상태라면 Visual Studio 설치가 필요합니다.
  • Visual Studio를 설치해주세요.