Unity 개발일지

[Unity] 최적화 실습하기 본문

Unity 개발

[Unity] 최적화 실습하기

아머르 2024. 7. 17. 20:50

[확인문제]

 

1. 메모리 최적화 방법에 대해 알고 있는 것이 있나요?

 - a. POT(Power of Two) 텍스쳐에 대해 설명해주세요.

 - b. 아틀라스에 대해 설명해주세요.

 - c. 오브젝트 풀에 대해 설명해주세요.

더보기

 

POT(Power of Two) 텍스쳐

POT 텍스처는 가로와 세로의 길이가 2의 제곱수(예: 128x128, 256x256)로 이루어진 텍스처를 의미한다.

이러한 텍스처는 GPU에서 메모리를 효율적으로 사용하고 빠르게 처리할 수 있다.

또한 Mipmap을 생성할 때도 유리합니다.

 

* Mipmap : 3차원 그래픽스의 텍스처 매핑 분야에서, 밉맵(mipmap)은 렌더링 속도를 향상시키기 위한 목적으로 기본 텍스처와 이를 연속적으로 미리 축소시킨 텍스처들로 이루어진 비트맵 이미지의 집합이다.

 

아틀라스

텍스처 아틀라스는 여러 개의 작은 텍스처를 하나의 큰 텍스처에 모아서 사용하는 기법이다.

이를 통해 드로우 콜을 줄이고, 메모리 사용을 최적화할 수 있다. 주로 스프라이트, UI 요소 등에 사용된다.

 

오브젝트 풀

오브젝트 풀링은 재사용 가능한 오브젝트들을 미리 생성해두고 필요할 때 가져와 사용하는 기법이다.

오브젝트를 생성하고 파괴하는 오버헤드를 줄여 성능을 향상시킬 수 있다.

 

 

2. Unity 내에서 드로우콜을 확인할 수 있나요? 어떤 방법을 통해 확인할 수 있을까요?

 - a. 배치는 무엇이고 Set Pass Call은 무엇인가요?

더보기

Unity Editor에서 게임 뷰의 우측 상단에 있는 'Stats' 버튼을 눌러 통계 창을 열면 현재 씬의 드로우 콜 수를 확인할 수 있다.

 

배치(Batch)

배치는 동일한 머티리얼과 메쉬를 공유하는 여러 개의 오브젝트를 한 번에 그리는 것을 의미한다.

 

Set Pass Call

Set Pass Call은 머티리얼의 셰이더 패스를 설정하는 과정으로, 드로우 콜을 증가시키는 주요 원인 중 하나이다.

 

3. Unity 프로파일러란 무엇이며 어떻게 사용하나요?

더보기

Unity 프로파일러는 애플리케이션의 성능을 분석하고 최적화하는 도구이다. CPU, GPU, 메모리 사용량, 드로우 콜 등을 실시간으로 모니터링할 수 있다. Unity Editor에서 'Window' -> 'Analysis' -> 'Profiler'를 선택하여 프로파일러 창을 열고 사용할 수 있다.

 

 

 

[설명문제]

 

1. 유니티 최적화 기법은 어떤 것들이 있나요?

 - a. 최적화를 해본 적이 있나요? 없다면 어떤 최적화가 있는지 설명해주세요.

 - b. 최적화에서 가장 중요한 부분은 무엇인가요?

 - c. 최적화를 위해서 적용해본 텍스쳐 포맷이 있나요?

더보기

최적화를 해본 적이 있나요? 없다면 어떤 최적화가 있는지 설명해주세요.

네트워크 최적화, 메모리 최적화, 그래픽 최적화 등이 있다.

예를 들면, 텍스처 압축, Level of Detail(LOD) 사용, 오브젝트 풀링, 드로우 콜 감소 등이 있다.

 

* Level of Detail : Level Of Detail(LOD)란 3차원 컴퓨터 그래픽스 관련 기술로, 3D 모델 표현의 복잡도를 거리에 따라 차등을 두어 부하를 줄이는 최적화 기술이다. 일반적으로 지오메트리 디테일만을 일컫는 개념이나, 엔진에 따라서는 밉맵과 같은 텍스쳐 필터링, 셰이더의 변경 역시 LOD에 포함시킨다.

 

최적화에서 가장 중요한 부분은 무엇인가요?

최적화에서 가장 중요한 부분은 성능을 향상시키면서도 게임의 품질을 유지하는 것이다.

CPU, GPU, 메모리, 네트워크 등의 자원 사용을 균형 있게 조절해야 한다.

 

최적화를 위해서 적용해본 텍스쳐 포맷이 있나요?

최적화를 위해 PNG, JPG와 같은 압축 형식을 사용하거나 Sprite Atlas를 사용해본 적이 있다.

 

2. 드로우콜에 대해서 설명하고, 최적화하는 방식에 대해 알고 있는 것이 있으면 설명하세요.

더보기

드로우 콜은 GPU가 화면에 오브젝트를 그리는 명령이다. 드로우 콜이 많아지면 성능이 저하될 수 있다.

이를 최적화하는 방법으로는 텍스처 아틀라스 사용, 스태틱 배칭, 다이나믹 배칭, 셰이더 최적화, 오클루전 컬링 등이 있다.

 

3. Find 함수 사용을 자제해야 하는 이유에 대해 설명해주세요.

더보기

Find 함수는 오브젝트를 이름으로 찾기 때문에 성능이 저하될 수 있다.

씬의 모든 오브젝트를 순회하며 찾기 때문에 비용이 많이 든다.

 

4. Update에서 GetComponent와 그 계열의 캐싱을 지양해야하는 이유를 설명하세요.

더보기

Update에서 GetComponent를 매 프레임 호출하면 성능이 저하될 수 있다.

이는 매번 컴포넌트를 검색하는 오버헤드가 발생하기 때문이다.

오브젝트 초기화 시 사용하거나, GetComponent를 사용하여 찾은 컴포넌트를 변수에 캐싱하여 사용해야 한다.

 

 

 

[실습문제]

 

GrassPackage.unitypackage
0.04MB

 

다음과 같은 GrassScene이 있다.

 

현재 이 상태로는 Grass 오브젝트가 너무 많아 성능 저하가 발생하고 있다.

(참고 : 다음의 Statistic 창은 Unity 에디터 내 게임 뷰 우측 상단 [Stats] 버튼을 눌러 확인 가능

 

1. Grass 오브젝트가 움직이지 않고 있다는 점을 이용하여 Batches를 줄여 프레임을 개선해보세요.

더보기

Grass 오브젝트를 Static으로 설정하여 Static Batching을 사용할 수 있다.

오브젝트를 Static으로 설정하면 동일한 머티리얼을 공유하는 오브젝트들이 한 번에 렌더링된다.

 

 

2. 모든 Grass가 같은 머테리얼과 메쉬를 공유하고 있다는 점을 이용하여 Batches를 줄여 프레임을 개선해보세요.

더보기

Mesh Combine을 사용하여 여러 Grass 오브젝트를 하나의 메쉬로 합칠 수 있다.

이렇게 하면 드로우 콜 수를 줄일 수 있다.

 

3. 1번 방법과 2번 방법의 성능 차이와 어떤 상황에 사용하면 좋을 지를 생각하여 서술해주세요.

(Hint : 씬의 GrassSpawner가 아닌 RotatingGrassSpawner를 활성화 시켜 실습해 봅시다.

아래와 같이 모든 Grass 오브젝트가 빙글빙글 돌아갈 때는 1번과 2번 방법 중 어느 것을 사용해야 할까요?

더보기

 

1번 방법은 오브젝트가 움직이지 않을 때 사용하기 좋다. Static Batching은 오브젝트가 정적일 때 효과적이다.

2번 방법은 오브젝트가 움직이는 경우에 사용하면 좋다. Mesh Combine은 한 번에 많은 오브젝트를 렌더링해야 할 때 유리하다. RotatingGrassSpawner와 같이 오브젝트가 회전할 때는 Mesh Combine을 사용하는 것이 좋다.

 

반응형