์๋๋ก์ด๋์์ ์ฑ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ๋ญ๊ฐ ํ๋ฉด์ ๋ ๋๋ง ์๋๊ฐ ์๊ฐ๋ณด๋ค ๊ธธ๋ค๊ณ ๋๊ปด์ง ๋๊ฐ ์๋ค.
๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒ ๊ฐ์ง๋ ์๊ณ ๋ฌด์ธ๊ฐ ๋๋จํ ํ๋ฉด์ด ์๋๋ฐ, ์ ์ค๋ ๊ฑธ๋ฆด๊น? ์ถ์ ์๊ฐ์ด ๋ญ๋๋ค.
์ด๋ด ๋ Android Studio ๊ฐ๋ฐ ํด์์ ์์ธ์ด ๋ฌด์์ธ์ง ์ฐพ์๋ณผ ์๊ฐ ์๋๋ฐ์. ์ค๋์ ์์ธ์ ํ์ ํ๊ธฐ๊น์ง์ ๊ณผ์ ์ ๋ด์๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ผ๋จ ํ๋ฉด์ด ์ด๋ป๊ฒ ๊ทธ๋ ค์ง๋์ง์ ๋ํ ๊ตฌ์กฐ์ ์ดํด๊ฐ ํ์ํ ํ
๋ฐ์.
์ด ๋ถ๋ถ์ ์๋๋ก์ด๋ ๊ณต์๋ฌธ์์ ๊ทธ๋ํฝ ์นดํ
๊ณ ๋ฆฌ์์ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ํฝ | Android ์คํ์์ค ํ๋ก์ ํธ | Android Open Source Project
๊ทธ๋ํฝ ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฅํ์ธ์. Android ํ๋ ์์ํฌ๋ ๊ทธ๋ํฝ ๋๋ผ์ด๋ฒ์ ์ ์กฐ์ ์ฒด ๊ตฌํ๊ณผ ์ํธ์์ฉํ๋ ๋ค์ํ 2D ๋ฐ 3D์ฉ ๊ทธ๋ํฝ ๋ ๋
source.android.com
ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๊ตฌ์กฐ์ ์ธ ์ํคํ
์ฒ์ ํ๋ฉด์ด ๋ก๋๋๋๋ฐ ๊น์ง์ View, Manager ๊ทธ ์ธ ๊ธฐํ ๋ง์ ๋ด์ฉ์ ๋ฌธ์์์๋ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
์ด ๋ถ๋ถ๋ ๊ฝค๋ ์ฌ์คํ ๋ด์ฉ๋ค์ด ๋ง์์ ์ฐจ์ฐจ ํฌ์คํ
์ ์งํํ๊ธด ํ๊ฒ ์ง๋ง
์ค๋์ ๊ทธ๋ํฝ ์ํคํ
์ฒ์ ํ๋ฉด์ด ๋ก๋๋๋ ์ค์ ์ ์ธ ๊ณผ์ ์ ๋ค๋ฃจ์ด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋์คํ๋ ์ด๊ฐ ์ค์ ๋ก ๋ ๋๋ง ๋๋ ๊ณผ์
๋์คํ๋ ์ด๊ฐ ์ค์ ์ ์ผ๋ก ๊ทธ๋ ค์ง๋ ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ์ ์ผ๋ก BufferQueue์ ๋ํด์ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
BufferQueue๋ Android ๊ทธ๋ํฝ์ ๊ตฌ์ฑ์์๋ฅผ ์๋ก ์ฐ๊ฒฐ์ํค๋ ์ญํ ์ ํ๊ณ , Producer์ Consumer๋ก ์ด์ด์ง๋ Buffer์ ์ํ์ ์ค์ฌํ๋ Queue์ ๋๋ค. ์ด๋ SurfaceFlinger๋ก ๋ฒํผ๊ฐ ์ ๋ฌ๋๋ฉด ๋ชจ๋ ์์๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค.
์ด ๊ณผ์ ์ด CPU์ GPU ์ฌ์ด์ ํต์ ์ ๋๋ค.
- CPU
- ํ๋ฉด์ ๋ฐ์ดํฐ๋ก ๋ง๋ ๋ค.
- GPU
- ํ๋ฉด์ ํ๋์จ์ด์ ์ ๋ฌํ์ฌ ๊ทธ๋ฆฐ๋ค
์ด CPU์ GPU ์ฌ์ด์ ํต์ ์ด BufferQueue์ ์ํด ์ํ๋๋ ๊ฒ์ ๋๋ค.
- Producer -> BufferQueue : queue (์์ฐ์๊ฐ ์ ์ํ ํ๋ฉด์ ์ ์๋ฅผ BufferQueue์ ๋ด๋๋ค.)
- BufferQueue -> Consumer : acquire (์๋น์๊ฐ BufferQueue์ ๋ด๊ธด ๋ฐ์ดํฐ๋ค์ ํ๋ฉด์ ๊ทธ๋ฆฐ๋ค.)
- Consumer -> BufferQueue : release (ํ๋ฉด์ ๋ชจ๋ ๊ทธ๋ ค์ง๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์๋นํ ํ, ๋ฐํํ๋ค.)
- BufferQueue -> Producer : dequeue (์๋น์๋ก๋ถํฐ ์์ฐ์๋ก ์ ๋ฌ๋ BufferQueue๋ก ๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฒํผ ์์ฒญํ๋ค.)
์ด๋ฅผํ ๋ฉด, CPU (Producer), GPU (Consumer) ๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค์.
๊ทธ๋ฌ๋๊น UI๊ฐ ๋ฒ๋ฒ
๊ฑฐ๋ฆฐ๋ค๊ณ ๋๊ปด์ง๋ค๋ฉด, CPU, GPU ์ฌ์ด์ ํต์ ์๊ฐ์ด ๋ค์ ๊ธธ์ด์ก๋ค๋ ์๋ฏธ์ด๋ฉฐ,
์ด๊ฒ์ fps๋จ์๋ก ์์นํ ํ๋ค๋ฉด ๊ธฐ๋ณธ 30fps ์์ 33ms ์ด์, 60 fps์์ 16ms ์ด์ ๊ฑธ๋ฆฐ๋ค๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค.
Android Studio ์์ ๋๋ฒ๊น ํด๋ณด๊ธฐ
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ms ๋จ์๋ก ๋๋ ์ด ๋๋ ๊ฒ์ ์ฐพ์์ผ๊ฒ ์ฃ , ์ด ๋ถ๋ถ์ Systrace๋ฅผ ํตํด์ BufferQueue๋ฅผ ์ถ์ ํด ๋ณผ ๊ฒ์ ๋๋ค.
์ด ์ถ์ ๊ณผ ๊ด๋ จํ ๊ฐ์ด๋๋ ์๋๋ก์ด๋ ๊ณต์๋ฌธ์์๋ ์์ด์ ๊ฐ์ด ์ฒจ๋ถํ์์ต๋๋ค.
๋ฌผ๋ก ์ ๋ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ผ์ ์งํํด ๋ณด์์ต๋๋ค.
์ด๋ ๊ฒ CPU์์ ์ค๋ ๋ ๋จ์๋ก ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํฐ์ ์ + ์ฒ๋ฆฌ์๋๋ฅผ ํ์ธํด ๋ณผ ์ ์์ต๋๋ค.
์ด Systrace๋ ์๋๋ก์ด๋ ๋๋ฐ์ด์ค ์์ฒด์์ ํ์ฑํ์ํฌ ์๋ ์์ต๋๋ค.
ํด๋น ์ค์ ๋ด์ฉ์ ์ด๋ฏธ์ง๋ก ์ฒจ๋ถํ์์ต๋๋ค. ์ ํ ์คํธ ๋๋ฐ์ด์ค๋ ๊ฐค๋ญ์ S6 Lite๋ผ์ ์ผ์ฑ ๋๋ฐ์ด์ค๋ฅผ ํตํด ํ ์คํธํ์๋ ๋ถ๋ค์ ์ค์ ์ ์ด ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ฌ ํ์ฑํ์์ผ์ฃผ์๋ฉด ๋ฉ๋๋ค.
Logcat์์๋ Choreographer์์ ์ ๋ฌํด ์ฃผ๋ log ๋ํ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
Choreographer I Skipped 53 frames! The application may be doing too much work on its main thread.
๋๋ฌด ๋ช ํํ๊ฒ,,, ๋ฉ์ธ์ค๋ ๋๊ฐ ์ผ์ ๋๋ฌด ๋ง์ด ํ๊ณ ์๋ค๊ณ ๋งํด์ฃผ๋ค์, ๋ก๊ทธ๊ฐ ๊ท์ฝ๋ค ์ถ์ต๋๋ค.

ํ์ฌ ์ ๊ฐ ํ ์คํธ ํ ์ฑ ์ฝ๋์์๋ ๋ณ๋ ํต์ ์์ด UI๋ง ๊ทธ๋ ค๋๊ณ ํ ์คํธ๋ฅผ ํ๊ณ ์์ด์ ๋ด๋ถ ๋ฉ์ธ์ค๋ ๋ ์ฒ๋ฆฌ๋ก์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ์์ฑํ๊ณ ์ด๋ฅผ ๊ทธ๋ฆฌ๊ณ ์์ด์ ์ด๋ ๊ฒ ๋จ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ง ์ฑ๋ฅํ ์คํธ๋ฅผ ์ ๋๋ก ํด๋ณด๋ ค๋ฉด APIํต์ ์ด ๋ฌถ์ด๊ณ ์ฝ๋ฃจํด์ ํตํ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด์ ์ค์ผ์ค๋ง์ ๋ณ๋๋ก ์ฒ๋ฆฌํด ์ค ๋ค์ ๋ค์ ํด๋ณด์์ผ๊ฒ ์ต๋๋ค. ๊ทธ๋์๋ ์กฐ๊ธ ๋ ๋ช ํํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๊ฒ ๋ค์.
์๋ง ์ด ํผํฌ๋จผ์ค ํ
์คํธ๋ฅผ ์ฃผ์ ๋ก ๋ช ๋ฒ ๋ ํฌ์คํ
์ ํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฒ์ ์ฐพ์๋ณด๋ฉด์ ๋๋ ๋ถ๋ถ์ธ๋ฐ ์๊ฐ๋ณด๋ค ๋ฅํ ์์ญ์ธ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
