Unity 병목 (Bottleneck) - CPU vs GPU, 메모리, 최적화 및 프로파일링 팁

모든 사진 출처는 Unity Korea 여기에 있다

병목이라는 단어는 말 그대로 병의 목부분을 말한다

병의 내부는 공간이 넓지만 목 부분은 공간이 좁아서 병에서 나오는 양이 병의 목에 의해 지연된다

드로우콜이란 CPU가 GPU에게 장면을 렌더링 하라고 명령을 내리는 거다

CPU가 명령을 내릴 때 Command Buffer을 이용해서 명령을 내린다

GPU는 Command Buffer에 있는 Command를 받아서 명령을 처리한다

 

CPU와 GPU의 처리 작업은 직렬적이 아닌 병렬적이다

 

 

위 사진은 GPU가 CPU에게 받은 명령을 다 처리하고 놀고 있는 장면이다

CPU는 계속 일하고 있는 모습

Bound는 ~위주 라는 뜻을 가지고 이해하면 좋다

그렇다면 CPU가 일을 많이 하는게 좋으냐?

GPU가 일을 많이 하면 좋으냐?

누가 더 많이해서 좋은 건 아니고 바쁜 애들을 최적화 해야지 바쁘지 않은 애들을 건드려봤자

효과가 미미하다

 

 

PC환경에 비해 모바일 환경에서의 Memory관리는 매우 빡세다

PC 환경

CPU Memory(Ram)와 GPU Memory(Ram)는 각각 사용되는 역할이 다르다

CPU : Logic etc..

GPU : Texture, Shader, Vertex Data

 

CPU 메모리가 4GB라고 가정하고 6GB짜리 게임을 사용하면 어떻게 되냐?

이때는 Storage의 공간을 빌려 메모리로 활용한다(가상메모리)

그래서 메모리 걱정은 절대안해도 되지만 이때 병목현상이 발생하므로

게임이 느려지는거다(그래도 게임은 뻗지 않는 이유다!)

공간은 2^64 =>(Windon 64) 16E(엑사)만큼 이론적으로 빌릴 수 있다고 한다

 

빌려 쓰는 거를 Swap Page(병목발생함!!)라고 한다

 

GPU Memory도 CPU에게 빌려서 쓰기도 한다

 

Storage <=> CPU 는 OS에서 관리하고

CPU <=> GPU 는 GL에서 관리한다고 한다

 

모바일 환경은 위와 같은 환경이 아니다

전혀 다르다!!

백업하는 과정이 없다! ex) Storage <=> CPU

CPU Memory GPU Memory가 따로 나눠져 있지 않고 하나의 Memory가 나눈다!

물리적인 Memory가 4GB면 진짜 4GB밖에 못쓰고 이마저도 다 쓸 수 있는 것이 아니다!

 

대역폭 => 데이터라 흐르는 통로 Bus라고 함, 버스가 커버리면 데이터를 많이 보낼 수 있지만 발열 이슈가 발생함

 

음.. 동영상 전반적인 내용을 보면 따로 최적화 방법에 대해 설명하기 보다는 이론중심적인 수업이였던 것 같다

프로파일링할 때 주의점 정도 알게 된 거 같다

CPU가 일을 열심히 하는지 GPU가 일을 열심히 하는지 파악한 후

최적화를 그에 맞게 해주는? 이정도의 깨달음과

가상메모리가 대충 어떤건지 알게되었다? 정도