본문 바로가기

Dev/Unity

[Unity] 개요 & 렌더링 파이프라인 - 유니티 그래픽스 최적화 스타트업 정리

반응형

 

 


개요 

 

FPS 

  • Frame per Second
  • 초당 몇 프레임을 렌더링 할 것인가?
  • 초당 프레임이 많을수록 더 부드러운 움직임을 보여줄 수 있음
  • 대부분은 60FPS로 제한된 성능에서 높은 FPS로 렌더링 해야하기 때문에 최적화가 필요하다.
    ( 게임은 보통 40 ~ 60 FPS를 목표치로 삼는다. )

 

 

 

쓰로틀링

  • 기기의 발열이 심해져서 온도가 일정 이상 높아지면 자동으로 기기 성능을 낮추는 기능
  • 모바일 기기가 쓰로틀링 상태에 진입하지 않도록 최적화 작업이 필요하다. ( 발열 문제 해결이 어렵다 )

 

 

Graphics API

  • Rendering은 GPU에서 처리하는데 기기마다 GPU는 제각각이다.
    이로인해서 Graphics API가 존재하는 것이다.
  • 다양한 GPU 드라이버를 이용하는 라이브러리를 만들고 API로 제공해서 OS나 GPU 상관없이 렌더링
  • 예시 
    • DirectX ( MS )
    • OpenGL ( MS, 매킨토시, 리눅스 )
    • OpenGL ES ( Android, web browser )
    • Metal ( iOS 차세대 API )
    • Vulkan ( Android 차세대 API )



Unity Graphics API 설정

  • Menu > Edit > Project Settings > Player 진입
  • Build Target :: Android > Other Settings > Auto Graphics API

 


렌더링 파이프라인

렌더링 파이프라인은 화면에 그려지는 과정 즉, Graphics API 워크플로우를 의미

 

GPU의 의미

  • 그래픽 처리를 위한 시스템은 GPU를 중심으로 구성된 칩셋에서 수행
  • CPU ----> Rendering 명령 ----> GPU 수행
  • GPU Memory, VRAM (Video Random Access Memory)
    • GPU도 메모리를 가지고 있으며 이것이 VRAM
    • Texture, Mesh 데이터 등 렌더링에 필요한 데이터들과 렌더링 결과를 저장하는 버퍼들이 포함
    • Rendering 시 이곳에 저장된 데이터를 참고해서 그래픽 처리



Game Loop



Rendering Loop

  • Object들의 Update가 완료된 후에야 Rendering이 이루어진다.
  • 모든 Object들을 렌더링한 후에야 비로소 화면에 출



렌더링 파이프라인

  • Object 하나를 렌더링 하기 위한 데이터와 처리 흐름 -> Object를 2D로 그리는 과정
  • Rendering 하기 위해서는 Mesh, Texture, Shader, Transform 등의 많은 정보가 필요하다.
  • 분류
    • Application
      • Application 상에서 처리되는 단계로 렌더링 이전에 데이터를 처리하는 단계
      • CPU에서 대부분의 연산을 수행하기 때문에 크게 보면 렌더링 파이프라인에 포함된다.
    • Geometry
      • Vertex와 Polygon을 처리
      • Vertex Transform
        • GPU는 GPU 메모리에서 Vertex 정보를 가져옴 ( local space )
        • 3D 공간으로 배치하기 위해 Transform 정보를 World로 변환 ( world space )
        • 카메라 공간으로 변환 ( view space )
        • 3D가 아닌 2D에 렌더링을 하기위해 매칭이 필요하다 ( projection, 투영 )
          • ex : 원근 투영, 직교 투영
      • Vertex Shader
        • Transform의 변환은 Vertex Shader에서 이루어진다.
        • world - view - projection transform은 vertex shader에서 행렬 연산을 통해 수행
          • mesh의 vertext에 이 행렬을 곱해줘서 vertex를 알맞은 위치에 배치시켜주는 일을 vertex shader가 수행하는 것 
        • Normal, vertex color도 vertex shader에서 결정
      • Vertex Shader를 거치고 나면 Geometry가 자동으로 생성
        • vertex들이 서로 연결되어 형태를 이루고 있다. 이 Mesh의 형태를 Geometry라고 함
      • Vertex 수가 많아지면 Geometry 단계에서 병목이 발생할 수 있음
        • 보여지지 않는 Object들은 최대한 Culling해서 렌더링 파이프라인을 거치지 않도록 해줘야 한다.
    • Rasterizer 
      • Mesh가 화면에 매칭되는 Pixel을 결정하고 최종적으로 색을 입히는 과정.
        • Mesh의 Polygon에 속한 영역을 픽셀로 매칭 시키는 과정을 Rasterization이라고 함
      • Z Buffer ( = Depth Buffer )
        • Pixel은 크게 두가지의 버퍼에 정보를 저장
          • Color Buffer 
            • Pixel의 최종 색상 정보 저장
          • Z Buffer
            • 카메라로부터의 거리인 깊이 값이 저장된
      • Z test
        • Pixel을 렌더링 할 때 Z Buffer를 활용하여 깊이 판정을 수행
        • Z Buffer에 저장되어 있는 Pixel의 깊이 값보다 출력하고자 하는 Pixel 값이 더 앞에 (깊이가 더 작으면) 있다면 출력하고, 뒤에 있다면 출력하지 않는 것
          • 뒤에있으면 가려져서 보이지 않기 때문에 굳이 렌더링할 필요가 없다.
        • 최근 그래픽 칩셋들은 Fragment Shader 이전에 Z Test를 수행해서 미리 가려지는 Pixel들을 걸러내어 비용을 절약한다.
      • Fragment Shader ( = Pixel Shader )
        • Pixel들의 최종 색을 계산
        • Texture로 부터 색상을 읽고 그림자를 적용
      • Blending
        • 투명도가 있는 Object에 대해 Alpha Blending을 거친다.
        • Alpha 값을 활용해 최종 색상을 결정한다.



정리

  • 모든 Object들은 위의 과정들을 거쳐 Buffer에 차곡차곡 쌓여 그려진다.
  • Double Buffering
    • Buffer를 두개 교차 사용하여 다음 프레임을 렌더링할 시간을 버는 것
    • 현재 출력되고 있는 Buffer를 Front Buffer, 뒤에서 렌더링 중인 Buffer가 Back Buffer 

 


 

 

cpdm

 

choppadontbiteme.tistory.com

 

반응형