Optimize

[Unity Optimize] 병목 (BottleNeck)

구찬애 2023. 7. 24. 17:58
반응형

"최적화란 현재를 최적의 상황으로 만들어서 적합하게 만든다는 것을 의미 한다." 고 한다.

말이 참 두리뭉실 아리송하다.

 

우리가 운전을 하다보면 막히는 순간이 종종 있다. 

그때 마다 생각이 든다. 왜 막하는 거야?? 신호도 없는 고속도로에서.. 된장..

 

그렇게 세월아 내월아 조금씩 조금씩 굼뱅이 마냥 가다 서다를 반복하다 보면

사고가 났던지 / 공사를 하고 있던지 / 차가 퍼졌던지 

한다.. 

 

이걸 최적화 측면에서 적용해 보면 4차선을 사용하는 프로세스에서 사고나 공사로 흐름의 속도가 느려지게 만들지 않는 것..이라고 할수 있지 않을까?

 

그렇듯..

 

사고를 내서 흐름에 이상을 주는 것 = 병목 (BottleNeck)

 

을 만들지 않는 것이 최적화다..

 

파레토 법칙 (Pareto principle)

: 병목을 설명하면서 흔히 파레토 법칙에 대해 이야기 하는데 이는 80 대 20 법칙이라고도 하며

전체결과의 80%가 전체 원인의 20%에서 일어나는 현상을 말한다.

원래는 경제학이나 경영학에서 쓰이는 용어라는데 소프트웨어의 병목에도 적용되고 있다.

즉 " 80%의 문제를 일이키는 20%의 원인" 이 병목이다.

 

이런 병목 지점을 찾는 과정을 프로파일링(Profiling)이라고 하며 이를 통해 문제원인을 찾아서 제일 먼저 최적화 해야 한다.

 

프로파일링(Profiling)

  • 구간측정 : 차량의 평균속도를 측정하는 것이 아닌 차가 달리는 동안의 도로 상황 파악해야 한다.
  • 선형적인 측정 : 코드나 씬 구성 변화에 따른 성능변화를 측정할때 FPS 수치를 기준으로 삼는다면 비선형적인 수치로 인해 혼동을 초래할수 있다. 따라서 프레임 타임으로 측정해야 변화량을 제대로 측정할수 있다.
  • 측정시나리오 : 데이터를 측정할때는 한번 측정하고 끝내는 것이 아니라 여러번 측정한 후 평균값을 데이터로 한다.
  • Target Frame Rate : 타겟 프레임 지정 
    • Application.targetFramRate = 40;
    • WaitForTargetFPS 항목 : 일부러 쉬고있다는 의미
  • VSync(수직동기화) : 티어링 현상을 방지하기 위한 것

 

 

 필레이트(Fillrate)

: 그래픽 카드가 1초에 스크린에 랜더링할 수 있는 픽셀의 수.

  그래픽 카드에서 디스플레이 성늘을 나타내는 단위.

필레이트 =  화면의 픽셀수 X 프래그먼트 쉐이더 복잡도 X 오버드로우

병목이 필레이트 바운드인지의 여부는 간단하게 확인하는 방법은?

디스플레이 해상도를 변경해 보면 된다.

해상도를 살짝 줄였는데 게임성능이 대폭 향상되었다면 필레이트 병목일 확률이 높다. 

 

오버드로우(OverDraw)

 

불투명오브젝트 앞에서 뒤로 정렬하여 그린다.

즉 카메라에 가까이 있는 오브젝트 부터 랜더링 되는 셈이다.

이때 겹치는 부분을 그리지 않지만..(Z Buffer가 방지 해줌)

 

투명한 오브젝트는 뒤에서부터 그린다.

그래서 모든픽셀에서 오버드로우가 발생한다.

또 투명 오브젝트는 프레임버퍼를 읽어오는 과정에서 병목이 발생한다. 이것이 블랜딩연산 이다.

 

 

그래서 블랜딩연산을 통해 나오는 최종픽셀의 컬러는

최종픽셀 컬러 =  현재픽셀 컬러 X 알파 + 프레임버퍼의 픽셀컬러 X (1-알파)

이렇게 프레임버퍼에 컬러를 지록하기 전에 프레임 버퍼의 색을 읽어와서 블렌딩 연산을 거친후 프레임 버퍼에 컬러를 기록하게 된다.그래서 블랜딩 연산을 많이 하게 되면 프레임버퍼를 읽어오는 과정에서 병목이 발생할수 있다. 

 

파티클은 오버드로우가 과도하게 발생하기 쉬워.. 그 수와 밀도를 줄이는 것이 좋다 → 오버드로우를 줄이는 것

 

포스트프로세싱(Post Processing)

: 포스트 프로세싱은 픽셀 단위로 처리하기 때문에 플래그먼트 쉐이더의 비용이 비싼편인데 그 종류별로 성능비용이 다르다.

ColorGrading : 모바일에서 사용하기에 큰 부담이 없다.

Bloom : 최근 디바이스의 성능이 좋아졌기 때문에 빈번하게 사용되고 있다.

DOF : 성능부담이 커서 인게임 보다는 컷씬이나 로비 등에서 사용하는 것이 좋다. 또 드로우콜이 늘어나는 요인이 되기도 한다.

 

업스케일링 샘플링(Upscale Sampling)

게임의 그래픽이 전체적인 룩 앤 필(Look & Feel)을 고품질로 유지하고 싶으면 해상도를 줄이는 것이 가장 간단한 해결방법중 하나이다. 다만 해상도를 줄이면 게임유저가 저해상도 임을 알아채기 쉽다. 이를 보완하기 위해 UI는 원래 해상도로 랜더링하고 3D 씬만 낮은 해상도로 랜더링 하는 트릭을 사용하는데 이를 업스케일링 샘플링이라고 부른다.

 

저해상도 랜더 텍스쳐를 생성
3D 씬을 랜더 텍스쳐로 랜더링
랜더 텍스쳐를 업스케일링해서 현재의 백 버퍼에 랜더링
오버레이 UI 랜더링

이 구현과정에서 키포인트는 전체해상도를 줄이지 않는다 이다.

저해상도의 랜더 타깃으로 랜더 텍스쳐를 생성하여 랜더링 하는 것이다.

그렇게 되면 3D씬은 저해상도로 랜더링하 되지만 UI는 원래 해상도로 랜더링되기 때문에 시각적인 퀄리티 저하는 줄어드는 셈이다.

업스케일링

폴리곤(Polygon)

버텍스가 병목이 되는 지는 씬에 랜더링이 되는 버텍스 수를 중여보면 쉽게 알수 있다. 

씬에 랜더링 되는 오브젝트의 수를 불여서 성능이 두드러지게 향상된다면 버텍스가 병목을 확율이 높다.

 

Levelof Detail : LOD

 

텍스쳐(Texture)

만일 메모리 대역폭이 병목이라면 게임에서 사용되고 있는 텍스쳐 메모리의 부담을 줄여야 한다.

Quality / Rendering 섹션에서 전체 텍스쳐의 해상도를 줄을수 있는데 만일 낮은 해상도로 설정후 게임 성능이 많이 향상되다면 텍스쳐로 인한 메모리 대역폭의 병목일 가능성이 크다.

 

반응형