본문 바로가기
Unity

[Unity] 텍스처 (그래픽스 최적화 스타트업)

by 소리쿤 2022. 8. 27.
특정 해상도에 대한 픽셀들에 대응하는 값들을 가지는 리소스, 주로 픽셀 쉐이더 단계에서 사용됨

 

텍스처 사용 시 고려할 부분

 

1. 텍스처 사이즈

 

CPU(GPU)가 1회에 메모리로부터 가지고 올 수 있는 데이터의 크기(대역폭)는 한정되어있기 때문에 주의해야 함

또한 모바일의 경우 앱 당 가용 메모리가 작기 때문에 더욱 주의해야 함

 

대역폭이 커지면 CPU의 일이 많아지며, 발열이 커진다.

특히 모바일은 전력 소모가 크고, 쿨러가 없기 때문에 쓰로틀링 기능으로 성능이 제어되므로

CPU의 일 양이 곧 성능에 영향을 미치게 된다.

(또한, 이는 디바이스마다 환경이 다르다, 타겟 디바이스를 정해 테스트를 잘 수행하는 것이 중요하겠다.)

 

기본적으로 텍스처 데이터를 가져올 때 주의해야 하며,

전체적인 텍스처 퀄리티를 줄이기 위해선 다음 세팅을 만지면 된다. 

 

2. 텍스처 압축

 

BPP(Bit Per Pixel) 줄이기

 

1) 텍스처의 한 픽셀은 RGB 각 8 비트씩 총 24비트를 사용하며, 알파가 존재하는 경우 32비트를 사용한다.

> 2048px 사이즈 텍스처의 경우 32 x 2048 x 2048 = 16MB의 사이즈가 된다...

 

: 채널 당 8비트의 경우 256 * 256 * 256 개의 색을 표현할 수 있고, 4비트의 경우 16 * 16 * 16의 색을 표현할 수 있게 된다.

> 트레이트 오프가 가능하다면 적용, 시각적 품질 저하 발생

 

압축 방식 설정

- PNG, JPG... 이런 압축 관련 확장자와 관련없이 유니티는 자체 압축 방식으로 임포트한다.

인스펙터에서 포맷 설정이 가능
플랫폼 별로 압축방식도 설정할 수 있다.

텍스처 압축 조건

1. 인코딩이 돼있는 상태로 메모리에 존재할 것

2. 디코딩 속도가 빠를 것

3. 랜덤 액세스가 가능할 것

 

 

인코딩이 돼있는 상태로 메모리에 존재할 것

텍스처 압축 시엔 다음 3가지 조건을 만족해야 하는데, 이는 메모리에 텍스처를 올릴 때 압축이 해제된 상태로 올리면 너무 크기 때문이다.

 

그래서 디코딩이 클라이언트 하드웨어에 구현이 돼있는가 지원 여부에 의존적이다.

 

랜덤 액세스가 가능할 것(고정 비율 인코딩일 것)

렌더링 시엔 도형 표면의 UV 좌표(텍셀 좌표)가 필요하고, GPU가 UV 좌표에 텍스처를 매핑할 때,

필터링(Point, Linear 등) 모드에 맞게 샘플링한 후 적용해야 한다.

 

이 과정에서 특정 위치의 텍셀에 바로 접근해야 하기 때문에 반드시 랜덤 액세스가 필요하게 된다.

 

이 때, PNG 이미지 압축에 사용되는 가변 비율 순차 방식 인코딩을 사용할 수 없다.

> ex. AAAABBBCCC to 4A3B3C 

 

가변 비율이라서 특정 좌표의 데이터를 읽기 위해선 앞에서부터 읽어야 하기 때문임

 

유니티는 기본적으로 손실 압축을 사용하며, 이는 압축 효율이 높으며 디코딩이 복잡하지 않은 알고리즘을 채택했기 때문이다.