그래픽스

    [Unity] 그래픽스 퍼포먼스 최적화

    1. 그래픽스 퍼포먼스 최적화 훌륭한 퍼포먼스는 많은 게임의 성공을 결정짓는 중요한 요소이다. 게임의 렌더링 속도를 최대로 끌어올리는 간단한 가이드라인을 아래에 소개한다. 1.1 높은 그래픽스 효과 찾기 게임의 그래픽 부분은 컴퓨터의 GPU와 CPU 시스템에 주로 영향을 준다. 어떤 최적화든 GPU 최적화와 CPU 최적화는 전략이 매우 다르기 때문에 첫 번째로 어디에서 퍼포먼스 문제가 발생하는지 찾아야 한다. 아예 정반대라고도 할 수 있다. 예를 들어, CPU 최적화를 위해 GPU의 작업을 늘리거나 그 반대인 경우가 흔히 발생한다. 일반적인 병목현상과 이를 체크하는 방법: GPU가 종종 필레이트 또는 메모리 대역폭의 제한을 받는다. 디스플레이 해상도를 낮춘 다음 게임을 실행한다. 낮은 디스플레이 해상도가..

    병목 (Bottleneck)

    최적화 게임의 성능 최적화를 위해서는 다음의 작업들을 고려할 수 있다. 메시의 버텍스 줄이기 텍스처 크기 줄이기 가벼운 쉐이더 사용 드로우콜 줄이기 게임 로직 최적화 물리 연산 줄이기 기타 등등 그러나 위 작업들을 수행하기 전에 어디서 병목이 일어나는지를 알아야 한다. 왜냐면 병목이 일어나는 곳 외에서 최적화를 해봤자 전반적인 수행 속도는 크게 바뀌지 않기 때문이다. 목표 설정 게임의 최적화 목표를 설정할 때 60FPS냐 30FPS냐를 정하는 것을 목표로 삼을 수 있다. 그러나 먼저 기준이 되는 하드웨어 스펙을 정해야 한다. 예를 들어 만드는 게임이 퍼즐게임이라면 가능한 다양한 기기에서 이용 가능하도록 해야 할 것이다. 또한 더 좋은 디바이스라고 해서 병목이 덜 발생할 것이라고 생각할 수 있지만 사실은 ..

    곡선 (Curve) & 스플라인 (Spline)

    곡선을 표현하기에 앞서, 두 정점 (A, B) 사이에 있는 점 P를 다음과 같이 표현할 수 있다. 또한 곡선은 t에 대한 방정식(P(t))으로 표현할 수 있다. 베지에 곡선(Bézier Curves) n차 베지에 곡선은 n+1개의 점으로 얻을 수 있는 베지에 곡선이다. 1차(Linear) 베지에 곡선은 앞서 말한 점 A,B 사이에 있는 점 P의 집합으로 표현할 수 있다. 말이 곡선이지, 사실상 A-B를 잇는 선분이다. 2차(Quadratic) 베지에 곡선은 아래와 같다. 2차 베지에 곡선은 A와 B를 잇는 1차 베지에 곡선 위에 있는 한 점 AB(t)와 B와 C를 잇는 1차 베지에 곡선 위의 한 점 BC(t)사이에 있는 한 점 P(t)의 집합으로 볼 수 있다. 식으로 표현하면 다음과 같다 이때 두 선분 ..

    [Unity] 그래픽스 최적화 - 드로우콜과 배칭

    01. Draw Call 드로우콜은 수많은 병목 중 하나의 원인일 뿐,, 반드시 병목이 드로우콜에서 일어난다고 단정지어서는 안됨. 드로우콜이 강조되는 이유는 대부분 병목의 원인이 드로우콜에 있기 때문. 드로우 콜이란? CPU가 GPU에게 이거 그려! 하고 명령을 호출하는 것. 더 자세하게 ? 한 프레임의 렌더링은 매 오브젝트를 순차적으로 그려주면서 오브젝트를 다 그리면 화면에 보여지게 되는 것. 오브젝트를 화면에 렌더링하기 전에 우선 해당 오브젝트가 렌더링 대상에 포함되는지 체크한다. 현재 프레임 상에서 해당 오브젝트가 카메라의 시야 밖에 있다면 안 그려도 되는 것이므로 렌더링 대상에서 제외한다. 이런 검사 과정을 Culling이라고 한다. 컬링을 거친 오브젝트가 렌더링되려면 CPU로부터 GPU에게 정보..

    [Unity] 그래픽스 최적화 - 병목

    01. 병목의 이해 성능 최적화란? 적은 자원을 사용하더라도 연산 효율이 높아지도록 최적의 성능을 이끌어 내는 것. 최적화를 위해 할 수 있는 노력들은... Mesh의 Vertex 줄이기 텍스처 크기 줄이기 가벼운 Shader 사용 Draw Call 줄이기 게임 로직 최적화 물리 연산 줄이기 등등이 있는데 그 전에 선행되어야 할 것이 병목을 탐지하는 것. Bottleneck, 병목 전체 프로세스가 갑자기 느려지거나 막혀서 정지하는 원인이나 그 장소. 병목현상이 발생했다 ! == 전체 성능이나 용량이 어떤 하나의 구성요소 때문에 제한 받는 일이 생겼다 ! 특정 로직 수행이 오래걸리면 그 친구 때문에 전체 성능이 떨어지게 되는 것. 따라서 최적화를 하려면 병목 현상이 누구 때문에 일어나는지 찾아야 함. 프로..

    [Unity] 그래픽스 최적화 - 렌더링 파이프라인

    01. GPU의 의미 그래픽 처리를 위한 시스템은 GPU를 중심으로 구성된 칩셋에서 이뤄짐. CPU가 렌더링 명령을 내리면 GPU가 수행. GPU 메모리, VRAM Video Random Access Memory. CPU가 메모리에서 데이터를 읽어오듯 GPU도 그래픽 카드에 GPU 메모리가 있다! 그것이 VRAM. 텍스처, 메시 데이터 등 렌더링에 필요한 데이터들, 렌더링 결과를 저장하는 버퍼들이 포함됨. 렌더링할 때 여기에 저장된 데이터를 참고해서 그래픽 처리. 02. 게임 루프 유저가 게임을 실행하면 로딩(초기화, 리소스 생성) -> 게임 중(매 프레임 렌더링) -> 게임 종료(리소스 해제) 위와 같은 일련의 과정이 게임 루프. 만약 10프레임이라면, 1초동안 10개의 장면, 한 장면당 0.1초를 쓰..

    [DX11] 튜토리얼 2 - 삼각형 렌더링

    우선적으로 봐야할게 ID3D11DeviceContext*에 대한 포인터 변수다 / 디바이스 컨텍스트란? 디스플레이 또는 프린터와 같은 디바이스의 그리기 특성에 대한 정보를 포함하는 Windows 데이터 구조다. 모든 그리기 호출은 선, 도형 및 텍스트를 그리기 위해 Windows API를 캡슐화하는 디바이스 컨텍스트 개체를 통해 수행된다. ID3D11DeviceContext* g_pImmediateContext = NULL; 아래는 InitDevice 함수에 해당하는 내 / 렌더 타겟 뷰 개념 참조 // 하나 이상의 렌더링 대상을 원자성으로 바인딩하고 깊이 스텐실 버퍼를 // 출력-병합 단계에 바인딩합니다. g_pImmediateContext->OMSetRenderTargets( 1, &g_pRender..

    Vulkan 그래픽스 파이프라인

    그래픽스 렌더링 파이프라인(Graphics rendering pipeline)이라 부르는 과정은 3차원으로 만들어진 모델을 2차원에 투영하는 렌더링 과정의 프로세스를 자세하게 표현한 것이다. 컴퓨터에 데이터로 존재하는 3D 리소스가 모니터에 출력되는 과정이 렌더링 파이프라인을 따르게 된다. 위의 과정에 따라 화면에 도형을 표시할 수 있으며, 주황색 박스로 된 과정이 조작 가능한(Programmable) 단계이다. · Input Assembler Vertex Specfication라고도 불리는 Input Assembler 단계는 CPU로부터 렌더링을 수행할 도형의 정점 정보를 정점 버퍼에 담아 전달 받는다. 국내에서는 Input Assembler가 더 익숙한 표현이라 편의상 해당 명칭으로 부르겠다. GPU..

    그래픽스 파이프라인 (게임 엔진 관점)

    3D 그래픽을 사용하는 게임들이 포함하고 있는 모듈들. - 사용자 입력(User Input) - 자원 관리(Resource Management) - 그래픽 로딩과 렌더링(Loading and Rendering Graphics) - 스크립트 해석과 실행(Interpreting and Executing Scripts) - 음향 처리(Playing Sound Effects) - 인공 지능(Artificial Intelligence) 위의 소스 코드 모듈은 집합적으로 게임 엔진(Game Engine)을 구성한다. 게임 엔진의 구성 객체의 표현과 렌더링 렌더링(Rendering)이란 3D 게임 세계의 객체들을 컴퓨터의 화면(2D)으로 그리는 것, 또는 그리는 과정이다. 메시(Mesh)는 게임 공간 또는 게임 세계..

    셰이더란? (Shader)

    렌더링 파이프라인 그래픽 처리 장치(GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 조작할 수 있는 프로그래밍 언어이다. 렌더링 파이프라인은 크게 Fixed Pipeline과 Programmable Pipeline이 존재하는에 이중에 Shader가 반영화된 파이프라인이 Programmable Pipeline이다. 렌더링 파이프라인의 최종 목표는 컴퓨터 데이터를 모니터의 픽셀까지 뽑아내기 위한 것이다. 해당 파이프라인 안에서 데이터를 조작 할 수 있다. Shader는 크게 두 가지가 존재한다. Vertex Shader : 버텍스 파이프 라인에서 동작하는 쉐이더 Pixel Shader : 픽셀 파이프 라인에서 동작하는 쉐이더 셰이더 렌더링 파이프라인을 조종할 수 있는 프로그래밍 언어이다. 버텍스 쉐이더의 ..