10 min to read
Introduce Android View Processing & GPU Rendering Profiling ๐
์๋๋ก์ด๋ ๋ทฐ ๋ ๋๋ง ๊ณผ์ ์ ์ดํดํ๊ณ , ์ด ๊ณผ์ ์์ ์ฑ๋ฅ ํ๋กํ์ผ๋ง์ ์ด๋ป๊ฒ ํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
์ด ๊ธ์ ์์ฑํ๊ฒ ๋ ์ด์
์ผ๋ง์ ํ์ฌ์์ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํ๋ ๋์ค ๋๋ฃ๋ถ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ฌธ๋ ์ด๋ฐ์๊ฐ์ด ๋ค์์ต๋๋ค.
์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ค์ ๊ณผ์ฐ ํ์ฌ ๋ณธ์ธ์ด ๋ง๋๋ ์ฑ์ ์ต์ ํ์ ์ผ๋ง๋ ๋ง์ ๊ด์ฌ์ ๋๊ณ ์์๊น?
๊ทธ์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ง์คํ๋ค๋ณด๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ๋์น๋ ๊ฒฝ์ฐ๋ ์์ง ์์๊น?
์ด ์๊ฐ์ด ๋๋ ์๊ฐ ์ ๋ ํ์ฌ ๊ฐ๋ฐํ๊ณ ์๋ ์ฑ์ ์ฑ๋ฅ์ด ์ด๋์ ๋ ์์ค์ธ์ง ํ์ ํ๊ธฐ ์ํด ๋น์ฅ HWUI ํ๋กํ์ผ๋ง ํด์ ์ผ์ ํ์ธํด๋ณด๊ณ ์ ํ์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋์ค๊ฒ ๋ ๊ฒฐ๊ณผ๋ ์๊ฐ๋ณด๋ค ์ข์ง ์์์ต๋๋ค.
๋ฌด์์ด ๋ฌธ์ ์ธ๊ฐ์? ๐ค
์ฌ๋ฌ๋ถ๋ค์ด ์ค์ ๋ก ์ฑ์ ์คํ ํ์ ๋ ๋ช๋ช ์ฑ์ ๊ฒฝ์ฐ ๋๋ ๋๊ธฐ๋ ํ์์ ๊ฒฝํํ์ ์ ์ด ์์ผ์ค ๊ฒ๋๋ค.
์ด๋, ๊ฐ๋ฐ์๋ชจ๋๋ฅผ ํตํด HWUI ํ๋กํ์ผ๋ง์ด๋ผ๋ ๋๊ตฌ๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด, ์์๊ฐ์ ์๋ก๋ฌ๋กํ ๋ง๋๊ธฐ๋ค์ด ํ๋ฉด์ ๋ฐ์์ด ์์ ๋ ์๋์น๋ ๊ฒ์ ๋ณผ ์๊ฐ ์์๊ฒ๋๋ค. ๋ฐ๋ก, ์ด ๋ง๋๊ธฐ๊ฐ ๊ณง ์ฑ๋ฅ์ ๋ํ๋ด๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋์, ์ ๋ ์ฌ๋ฌ๋ถ๋ค๊ป ์๊ฐ๋ณด๋ค ๋ง์ ๊ฐ๋ฐ์ ๋ถ๋ค์ด ๊ถ๊ธํ์ง๋ง ์ ๋ชจ๋ฅผ๊ฑฐ ๊ฐ์ ๋ด์ฉ์ธ ๋ทฐ๋ฅผ ์ด๋ป๊ฒ ๊ทธ๋ฆฌ๋์ง ์ค๋ช ํ๊ณ ์ํฉ๋๋ค.
์ด ๊ฐ๋ ์ ์ดํดํ๊ธฐ ์ํด View Rendering Processing๊ณผ ๊ทธ ๊ณผ์ ์์ ์ฑ๋ฅ ์งํ๋ฅผ ํ์ธํ ์ ์๋ GPU Rendering Profiling์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๊ณ ์ ํฉ๋๋ค.
Android - GUI Spec History
๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ๊ธฐ์ , ์๋๋ก์ด๋๊ฐ ์ด๋ค ๊ทธ๋ํฝ ๊ธฐ์ ์ ์ฌ์ฉํด ์๋์ง ๊ฐ๋จํ ์๊ฐํ๊ณ ์กํฉ๋๋ค.
์๋๋ก์ด๋๋ ์ฝ 15๋ ์ , ๋ฆฌ๋ ์ค ์ปค๋์ ๊ธฐ๋ฐ์ผ๋ก ๋ ์์ ์ผ๋ก ๊ตฌ์ฑํ ์ด์์ฒด์ ์๋๋ก์ด๋์ Skia๋ผ๋ 2D ๊ทธ๋ํฝ ์์ง์ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค.
์ฌ๋ฌ๋ถ๋ค์ด ์๋๋ก์ด๋๋ฅผ ๊ณต๋ถํ์ จ์์๋ Skia๋ฅผ ๋ณ๋ก ๋ค์ด๋ณด์์ง ๋ชปํ ์ด์ ๋ ๊ตฌ๊ธ์ด ์ฃผ๋์ ์ผ๋ก ๊ฐ๋ฐํ ๊ทธ๋ํฝ ์์ง์ด ์๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค๋ง ์ฐพ์ ์ ์๋ ์๋ฃ๊ฐ ์ข ์๋๋ฐ, SKIA์์๋ ์๋์ ๊ฐ์ด ์๋๋ก์ด๋ ๋ ๋๋ง์ ์ค์ถ๊ฐ๋๋ ๊ธฐ์ ๋ค์ ์ ๊ณตํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
What is Skia
?
Skia๋ Text, ์ด๋ฏธ์ง, ๋ํ, ๋ ๋์๊ฐ WebView ๋ฑ ๋ค์ํ ๋ ๋๋ง ๊ธฐ๋ฒ์ ์ค์ถ๊ฐ ๋๋ ๊ธฐ์ ์ ๋๋ค.
SKIA๊ฐ ์ง์ํ๋ ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Skia is a complete 2D graphic library for drawing Text, Geometries, and Images.
- 3x3 matrices w/ perspective
- antialiasing, transparency, filters
- shaders, xfermodes, maskfilters, patheffects
- subpixel text
Device backends for Skia currently include:
- Raster
- OpenGL
- XPS
- Picture (for recording and then playing back into another Canvas)
์ข ๋ ์์ธํ ์ ๋ณด๋ ์ด๊ณณ์ ๊ฐ๋ฉด ๋ณผ ์ ์์ผ๋ ํ๋ฒ ๋๋ฌ๋ณด์๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
SKIA๋ฅผ ์ฌ์ฉํ๋ ์๋๋ก์ด๋์ ๊ทธ๋ํฝ ์๋ธ ์์คํ ์ ๋์ํ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋๋ก์ด๋์ ๊ฒฝ์ฐ Canvas๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ฐ, ์ด๋, Canvas๊ฐ HWUI์ Skia๋ฅผ ์ด์ฉํ์ฌ Surface๋ก ์์ฒญ์ ํ๋ ๊ตฌ์กฐ๋ฅผ ๋๊ณ ์์ต๋๋ค. Android 3.0 ์ ๊น์ง๋ Skia์ HWUI๋ฅผ ํจ๊ป ์ฌ์ฉํ์์ง๋ง, ์ฑ๋ฅ์ด์๋ก ์ธํด HWUI ๋ชจ๋๋ก ์ ์ ๋์ฒด๋๊ณ ์๋ ์ถ์ธ์ ๋๋ค.
Android HWUI(OpenGLRenderer - Above 3.0)
Android 3.0 Honeycomb์์ ๊ณต์์ ์ผ๋ก Tablet์ ์ํ OS๊ฐ ์ง์์ด ๋๊ธฐ ์์ํ ๋ ์ด์ ๊น์ง SKIA๋ก๋ง ์ฒ๋ฆฌ๋๋ ๋ ๋๋ง ๋ฐฉ์์ด ํ๋ฉด์ด ์ปค์ง๋ฉด์ Animation์ด ๋งค๋๋ฝ๊ฒ ๋์ํ์ง ์๊ฒ ๋์ HWUI๋ก ๋์ฒด๋๊ธฐ ์์ํ์ต๋๋ค.
์ฑ๋ฅ์ ์ธ ์ด์๊ฐ ์๊ธฐ๊ฒ ๋์๋ ์ด์ ๋ ์๋๋ก์ด๋ ์ด๊ธฐ ๋ ldpi(~ 120dpi) mdpi(~ 160dpi) ๋ฑ ์ ๋ฐ๋์ ํด์๋๋ฅผ ๊ฐ์ง ๋๋ฐ์ด์ค๋ง ์ถ์๋ ๋ฐ ๋ฐํด, ํ์ฌ๋ ์๋๋ก์ด๋ ํ๋ฉด์ด ์ ์ ๋ํํ ๋๋ฉด์ ์ฒ๋ฆฌํด์ผํ ํฝ์ ์ด ๊ธ๊ฒฉํ ๋ง์์ก๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, SKIA+GPU ํํ๋ก๋ Drawing ๋ช ๋ น์ ๋ํด์ ์ฆ๊ฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๋ก GPU์ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๊ฐ ๊ธ๊ฒฉํ๊ฒ ์ฆ๊ฐ๋์ด ํผํฌ๋จผ์ค๊ฐ ์คํ์ด ์ข์์ง ์๋ก ์คํ๋ ค ๋จ์ด์ก๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
์ด๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ์ ํ๊ธฐ ์ํด HWUI์์ ๋ค์ํ ๊ฐ์ ๋ฐฉ์์ผ๋ก GPU ์ฌ์ฉ์์ ์ต์ ํํ์ฌ ํ์ฌ ์ฃผ์ ๋ ๋๋ง ์์ง์ผ๋ก ์๋ฆฌ์ก๊ฒ ๋์์ต๋๋ค.
Android View Rendering Mechanism
์๊ธฐ์์๋ Android๊ฐ ์คํฌ๋ฆฐ์ ๋ ๋๋ง์ ํ๊ธฐ ์ํด ์ฌ์ฉํด์จ ๊ธฐ์ ์ ๋ํด ์๊ฐ๋ฅผ ํ๋ค๋ฉด, Android View๊ฐ ์ด๋ค์์ผ๋ก Processing๋์ด ๋ณด์ฌ์ง๋์ง ํ๋ฒ ๊ฐ์ด ์์๋ณด๊ฒ ์ต๋๋ค.
์๋ ์ค๋ช ์ Android - Graphic Architecture ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ค๋ช ํ์์ต๋๋ค.
Surface and SurfaceHolder
-
Surface๋ ํ๋ฉด์ ํ์ํ๋ ์ด๋ฏธ์ง๋ฅผ ์ฑ์ด ๋ ๋๋ง ํ ์ ์๋๋ก ํด์ค๋๋ค.
-
SurfaceHolder ์ธํฐํ์ด์ค๋ ์ฑ์ด ๋ ธ์ถ ์์ญ์ ์์ ํ๊ณ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค.
ํด๋์ค๋ ์๋๋ก์ด๋ 1.0๋ถํฐ ์๋๋ก์ด๋ API์ ํฌํจ๋์ด ์์์ผ๋ฉฐ, ์๋๋ก์ด๋ ์จ๋ผ์ธ ๋์๋ง ์ฌ์ดํธ์๋ Surface ํด๋์ค์ ๋ํด์ Screen Compositor๊ฐ ๊ด๋ฆฌํ๋ ํ๋์ Raw ๋ฒํผ๋ฅผ ๊ฐ๋ฆฌํค๋ ํธ๋ค์ด๋ผ๊ณ ์ค๋ช ํฉ๋๋ค.
์ค๋ช ์ด ๊ต์ฅํ ๋ณต์กํ๋ ์ฝ๊ฒ ํ์ด์ ์ค๋ช ํ์๋ฉด, BufferQueue๋ ๊ทธ๋ํฝ ๋ฐ์ดํฐ์ ๋ฒํผ๋ฅผ ์์ฑํ๋ ์์(์์ฐ์)๋ฅผ ํ์ ๋ฐ์ดํฐ ๋๋ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ฉํ๋ ์์(์๋น์)์ ์ฐ๊ฒฐํฉ๋๋ค.
Suface๋ ์์ฃผ ์ฌ์ฉ๋๋ BufferQueue๋ฅผ ์์ฑํ๊ณ (Producer), ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ SurfaceFlinger(Consumer)๋ก ์ ๋ฌํ์ฌ ์ถ๋ ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ฉด์ drawing์ ํ์ฌ Application๊ณผ ์ํธ์์ฉํฉ๋๋ค.
์๋๋ก์ด๋์์ ๋ชจ๋ ๊ทธ๋ ค์ง๋ UI ์์๋ ๋๋ถ๋ถ์ OpenGL ES ๋๋ Vulkan์ ์ฌ์ฉํ์ฌ View๋ฅผ ๋ ๋๋งํฉ๋๋ค.
ํ์ง๋ง, ์์ธ ์์๋ ์๊ธฐ ๋ง๋ จ์ ๋๋ค. ์๋ฅผ๋ค๋ฉด 2D๊ฒ์์ ๊ตฌํํ๋ค๋์ง, ์คํธ๋ฆฌ๋ฐ ์ปจํ ์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ ์ด์ด๋ผ๋์ง, ์นด๋ฉ๋ผ ๋ฑ์์๋ ์บ๋ฒ์ค API๋ฅผ ํตํด ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋ ์์ ์ด ์ด๋ค์ง๋๋ค. ์ด๋ฅผ Canvas Rendering์ด๋ผ ํฉ๋๋ค.
Canvas Rendering
์บ๋ฒ์ค ๊ตฌํ์ Skia ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํฉ๋๋ค. ์ง์ฌ๊ฐํ์ ๊ทธ๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ ์ ํ ๋ฒํผ์ ๋ฐ์ดํธ๋ฅผ ์ค์ ํ๋ ์บ๋ฒ์ค API๋ฅผ ํธ์ถํฉ๋๋ค.
์๋๋ก์ด๋์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํ๋ ์์ํฌ์ ๋งก๊ฒจ์ Rendering Process๋ฅผ ๊ฑฐ์น์ง๋ง(์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ onDraw()
ํจ์๋ฅผ ํตํด ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋งํฉ๋๋ค.), ์์์ ์ธ๊ธํ Canvas Rendering์ ๊ฒฝ์ฐ ์ฐ๋ ๋๋ฅผ ์ด์ฉํด ํ๋ฉด์ ๊ฐ์ ๋ก ๊ทธ๋ ค ์ํ๋ ์์ ์ ํ๋ฉด์ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
๊ทธ ๊ณผ์ ์์ ์ผ์ด๋๋ ๋งค์ปค๋์ฆ์ ๋งค์ฐ ๋ณต์กํ์ง๋ง, ๊ฒฐ๋ก ์ Surface๋ก ์ ๋ฌ ๋๋ ๊ฒ์ ๋๋ค.
Surface๊น์ง ๋๋ฌํ๊ธฐ ์ํด ์ด๋ค ํ๋ฆ์ ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
์๋ ๋ด์ฉ์ Android Drawing Process 1(App surface, SF Layer) ๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค.
์ ์ด๋ฏธ์ง๋ ์ฌ์ฉ์์ ์ธํฐ๋ ์ ์ ์ํด ํ๋ฉด์ด ๊ฐฑ์ ๋๋ Flow๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๋ํ๋ธ ๊ฒ์ ๋๋ค.
์ฑ์์ Android Framework Level์์ SurfaceFling API๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ด ๊ณผ์ ์์ VSync Processing, Screen Refreshing, Layer Management ๋ฃจํด์ ๊ตฌ์ฑํ์ฌ ํ๋ก์ธ์ฑํฉ๋๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ์ด ์ธ๊ฐ์ง๊ฐ ๋ฌด์์ธ์ง๋ ์๋ ์ค๋ช ์์ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ค์ด๊ฐ๊ธฐ์ , ์ฑ ๋ด View๊ฐ ๊ทธ๋ ค์ง๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ๊ฒ ๋ณด๋๋กํ๊ฒ ์ต๋๋ค.
Drawing Process(Application Side)
๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ViewController(Activity, Fragment)๋ฑ์ ์ฌ๋ฌ ๋ทฐ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ฐ View๋ DecorView๋ฅผ ์ต์ข ๋ฃจํธ๋ก ๊ฐ์ง๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
DecorView๋ ๊ทธ๋ฆด ๊ฒ์ด ์๋ ๊ฒฝ์ฐ, ํ ๋น๋ฐ์ Surface์ ๊ทธ๋ฆฌ๊ฒ ๋ฉ๋๋ค.. ๋ฐ๋ผ์ Surface๋ ๊ฐ Application๋ณ๋ก ์ต์ ํ๋๋ ๊ฐ์ง๊ณ ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์์์ ๋งํ Layer Managent์ ์๋ฏธ๋ ๋ฌด์์ผ๊น์? ๋ฐ๋ก Surface์ ๋๋ค. ๋ ๋จ์ด์ ์๋ฏธ๋ ๋์ผํ๋ค ๋ด๋ ๋ฌด๋ฐฉํฉ๋๋ค.
Surface์ SurfaceFlinger๋ ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ISurfaceComposer๋ฅผ ์ด์ฉํฉ๋๋ค.
์ฑ์์๋ SurfaceComposerClient๋ก ISurfaceComposer๋ฅผ ํตํด createSurface()
ํธ์ถํ ๊ฒ์ createLayer()
๋ก ๋ฐ๊ฟ์ค๋๋ค. SurfaceFliger์์๋ ํด๋น ์ฑ์ ๋ ์ด์ด๋ฅผ ์์ฑํ์ฌ ๊ด๋ฆฌํ๊ฒ๋ฉ๋๋ค.
Surface๊ฐ ์ฑ์์ ์์ ํ๋ ๊ฐ๋ ์ด๋ผ๋ฉด, ๊ทธ๊ฒ์ SurfaceFliger์์ Layer ํํ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
๋ค์์ VSync Processing์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๊ฒ ์ต๋๋ค.
VSync Processing
VSync ์๊ฐ
VSync๋ Vertical Synchronization(์์ง ๋๊ธฐํ)์ ์ฝ์์ ๋๋ค. Android 4.1 Project Butter์์ ์ฌ์ฉํ๊ฒ ๋ ๊ธฐ์ ์ ๋๋ค.
VSync๋ ์๋๋ก์ด๋ ๊ธฐ๋ฐ ๋๋ฐ์ด์ค์์ ํ๋ฉด์ ์ถ๋ ฅ๋๋ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ์ด ๋์์ ๋ ์ด๋ฅผ ๋๊ธฐํํ๊ณ , ์ง์์ ์ผ๋ก ๊ฐฑ์ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ฝ๊ฒ ๋ง์๋๋ฆฌ๋ฉด, GPU์ Rendering Rate, ์ฆ fps์ Device Presenting Rate, ์ฆ hz์ฌ์ด์ ๊ฐ๊ทน์ด ์์ ๋ ์ด๋ฅผ ์กฐ์ ํด์ค๋๋ค.
VSync๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ํธ๋ฅผ ๋ฐ์์์ผ ํ๋ฉด์ ๊ฐฑ์ ์ํค๋ ํจ์๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํธ์ถํด์ค๋๋ค.์ผ๋ฐ์ ์ผ๋ก ํ๋์จ์ด์ ๊ฒฝ์ฐ ์์ง๊น์ง๋ 60Hz์ด๊ณ , ์ต๊ทผ์ ๊ณ ์ฌ์ ๋๋ฐ์ด์ค์ ๊ฒฝ์ฐ 120Hz, ๋ ๋์๊ฐ์๋ LPTO ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ 1 ~ 120Hz๋ก ๋ฐ์์ฃผ๊ธฐ๋ฅผ ์กฐ์ ํ๊ธฐ๋ ํฉ๋๋ค.
์๋ฅผ๋ค์ด, GPU๋ 100fps(์ด ๋น 100๊ฐ์ ํ๋ ์์ ๊ทธ๋ฆผ), Device Screen์ 60hz(์ด ๋น 60๊ฐ์ ํ๋ฉด์ ๊ทธ๋ฆผ)๋ผ๋ฉด, GPU์์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๊ทธ๋๋ก Device Screen์ ๋ฟ๋ฆฌ๊ฒ ๋๋ฉด ๊ณ์ Delay๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
์ด ๋, VSync๊ฐ GPU ํ๋ ์๊ณผ Device ํ๋ฉด๊ฐ์ Time Gap์ ๊ณ์ฐํ์ฌ ํ์ํ Frame๋ง ๊ทธ๋ ค์ฃผ์ด ์ต์ ํ๋ฅผ ํด์ค๋๋ค. VSync์ ๋ํ Detailํ ์๋ฆฌ์ ๋ํด์ ์ ์๊ฐ๋ ์์์ Android Performance Patterns: Understanding VSYNC ์์์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
Choreographer
Choreographer์์๋ SurfaceFlinger์์ ์ก์ ๋๋ Vsync Event๋ฅผ ์์ฒญ/์์ ํ์ฌ ๋ค์ ์์ ๋ค์ ์ฒ๋ฆฌํฉ๋๋ค.
- Input Event Handling
- Self-Invalidation
- Animation
ViewRootImpl
ViewRootImpl์ DecorView์ Choreographer๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ผ์ข ์ ํธ๋ค๋ฌ ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ก์จ, DecorView์ Choreographer ์ฌ์ด์์ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ค๊ณํฉ๋๋ค.
Drawing Process(Framework Side)
๋ฐ๋ผ์, ์๋์ ๊ฐ์ Flow๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ค์ ๊ทธ๋ฆฌ๊ธฐ๋ ํ์ฌ foreground์ ํ์๋๊ณ ์๋ ์ดํ๋ฆฌ์ผ์ด์
์์ ๊ทธ๋ฆด ๊ฒ์ด ์๊น์ผ๋ก์จ ์์ํฉ๋๋ค. ๋ฌด์ธ๊ฐ ๊ทธ๋ฆด ๊ฒ์ด ์๊ธด๋ค๋ฉด, ViewRootImpl ๊ฐ์ฒด ๋ด์ ์๋ scheduleTraversal()
๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
scheduleTraversal()
๋ฉ์๋ ๋ด๋ถ์์๋ Choreographer ๊ฐ์ฒด์๊ฒ ๋ค์ vsync๋ฅผ ์์ฝํด๋ฌ๋ผ๋ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค. ์ด ์์
์ด ์ ๊ทธ๋ฆผ์์ Invalidate์ Vsync scheduling์ ํด๋นํฉ๋๋ค.
Vsync ์์ฝ ์์ฒญ์ ๋ฐ์ Choreographer๋ SurfaceFlinger๋ก ํ์ฌ๊ธ ๋ค์ Vsync ๋์ฐฉ ์ ์๋ ค๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
๋ค์ Vsync signal์ด ๋์ฐฉํ๋ฉด Choreographer๋ ViewRootImpl์ performTraversal()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. performTraversal ๋ฉ์๋ ๋ด๋ถ์์๋ ๋ค์ ๊ทธ๋ ค์ผ ๋ ๋ถ๋ถ์ measure()
ํ๊ณ , layout์ ์ฌ ๊ตฌ์ฑํ ๋ค์, performDraw()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์ํํฉ๋๋ค.
ViewRootImpl ๊ฐ์ฒด์์๋ performDraw ๋ฉ์๋์ ์ํด ํธ์ถ๋๋ draw ๋ฉ์๋๊ฐ ์ต์ข ์ ์ผ๋ก DecorView๋ก ํ์ฌ๊ธ ํ ๋น๋ฐ์ Surface์ ๊ทธ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์ด๋, Rendering ๋ฐฉ๋ฒ์์ HardwareRenderer๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ์ SoftwareReneder๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ ๋๊ฐ์ง๋ก ๋๋๊ฒ ๋ฉ๋๋ค.
SofrwareRenderer์ ๊ฒฝ์ฐ 3.0 ์ด์ ๋ฒ์ ์ ๊ฒฝ์ฐ CPU๋ฅผ ํตํด ๊ทธ๋ ค์ฃผ์ง๋ง, 3.0 ์ดํ ๋ฒ์ ๋ถํฐ๋ ํ๋์จ์ด ๊ฐ์์ ์ฌ์ฉํฉ๋๋ค.
GPU Rendering
ํ๋์จ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋ง ํ๋ ๊ฒ์ ์ค๋ช ํ๊ธฐ ์ , ์ํํธ์จ์ด๋ก ๋ ๋๋ง ๋๋ ๋ฐฉ์์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Software Rendering Model
Software Rendering Model์ ๋ค์ ๋ ๋จ๊ณ๋ก ๊ทธ๋ฆฝ๋๋ค.
- ๊ณ์ธต ๊ตฌ์กฐ ๋ฌดํจํ
- ๊ณ์ธต ๊ตฌ์กฐ ๊ทธ๋ฆฌ๊ธฐ
ํ๋์จ์ด ๊ฐ์
Android 3.0(API ๋ ๋ฒจ 11)๋ถํฐ Android 2D ๋ ๋๋ง ํ์ดํ๋ผ์ธ ํ๋์จ์ด์์๋ ๊ฐ์ํ๋ฅผ ์ง์ํ๋ฏ๋ก, View
์ ์บ๋ฒ์ค์์ ์คํ๋๋ ๋ชจ๋ ๊ทธ๋ฆฌ๊ธฐ ์์
์์ GPU๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๋์จ์ด ๊ฐ์์ ์ฌ์ฉํ๋ ค๋ฉด ํ์ํ ๋ฆฌ์์ค๊ฐ ๋์ด๋๋ฏ๋ก ์ฑ์์ ๋ ๋ง์ RAM์ ์ฌ์ฉํฉ๋๋ค.
Android ์์คํ
์์๋ ์ฌ์ ํ invalidate()
๋ฐ draw()
๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ์
๋ฐ์ดํธํ๊ณ ๋ณด๊ธฐ๋ฅผ ๋ ๋๋งํ์ง๋ง, ์ค์ ๊ทธ๋ฆฌ๊ธฐ๋ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
Android ์์คํ ์์๋ ์ฆ์ ๊ทธ๋ฆฌ๊ธฐ ๋ช ๋ น์ ์คํํ์ง ์๊ณ , ๋ณด๊ธฐ ๊ณ์ธต ๊ตฌ์กฐ์ ๊ทธ๋ฆฌ๊ธฐ ์ฝ๋ ์ถ๋ ฅ์ ํฌํจํ๋ ํ์ ๋ชฉ๋ก์ ๊ธฐ๋กํฉ๋๋ค.
๋ํ Android ์์คํ
์์ invalidate()
ํธ์ถ์ ํตํด ๋ํฐ๋ก ํ์๋ ๋ณด๊ธฐ์ ํ์ ๋ชฉ๋ก์ ๊ธฐ๋กํ๊ณ ์
๋ฐ์ดํธ๋ง ํ๋ฉด ๋๋๋ก ์ต์ ํ๋ฉ๋๋ค.
๋ฌดํจํ๋์ง ์์ ๋ณด๊ธฐ๋ ๋จ์ํ ์ด์ ์ ๊ธฐ๋ก๋ ํ์ ๋ชฉ๋ก์ ๋ค์ ์คํํ์ฌ ๋ค์ ๊ทธ๋ฆด ์ ์์ต๋๋ค. ์ ๊ทธ๋ฆฌ๊ธฐ ๋ชจ๋ธ์๋ ๋ค์ ์ธ ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค.
- ๊ณ์ธต ๊ตฌ์กฐ ๋ฌดํจํ
- ํ์ ๋ชฉ๋ก ๊ธฐ๋ก ๋ฐ ์ ๋ฐ์ดํธ
- ํ์ ๋ชฉ๋ก ๊ทธ๋ฆฌ๊ธฐ
์ง๊ธ๊น์ง๋ View๊ฐ ๋ ๋๋ง ๋ ๋ ๋๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ฐ๋ ์ค๋ช ๋ฐ ์๋ฆฌ ์ค๋ช ์ ๋๋ ธ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด, ํ๋์จ์ด ๊ฐ์์ ์ฌ์ฉํ๋ GPU ๋ ๋๋ง ์ฒด๊ณ์ ๊ฒฝ์ฐ ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ณ , ์ด๋ป๊ฒ ํ๋กํ์ผ๋ง ํ๋์ง ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Android GPU Rendering Profiling
Android - Overdraw๋?
์๊ฐ์ ์ผ๋ก UI๋ ๋์ผํ์ง๋ง, ์ค์ ๋ก ํ๋ฉด์ ๋ณด์ด๋ ์ปดํฌ๋ํธ์ ๊ตฌ์ฑ๋ฐฉ์์ ์ ๋ง ๋ค์ํ ํํ๋ก ๊ตฌ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด๋, ๊ฐ์ ํ๋ ์ ๋ด ๋๋ฒ์ด์ ๊ฐ์ ํฝ์ ์ ๊ทธ๋ฆด ๋ Overdraw๊ฐ ๋ฐ์ํฉ๋๋ค.
Overdraw ๋น๋ ์๊ฐ ๋์์ง๋ ๊ฒฝ์ฐ ์ถ๊ฐ GPU ์์ ์ผ๋ก์ธํด ์ฑ๋ฅ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด GPU ์ค๋ฒ๋๋ก ์๊ฐํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ๋ทฐ์์ Overdraw๊ฐ ๋ง์ด ๋ฐ์ํ๋์ง ์ ์ ์์ต๋๋ค.
์ฌ๋๋ฐฉ๋ฒ
- ๊ธฐ๊ธฐ์์ ์ค์ ์ผ๋ก ์ด๋ํ์ฌ ๊ฐ๋ฐ์ ์ต์ ์ ํญํฉ๋๋ค.
- ํ๋์จ์ด ๊ฐ์ ๋ ๋๋ง ์น์ ์ผ๋ก ์คํฌ๋กคํ์ฌ GPU ์ค๋ฒ๋๋ก ๋๋ฒ๊ทธ๋ฅผ ์ ํํฉ๋๋ค.
- GPU ์ค๋ฒ๋๋ก ๋๋ฒ๊ทธ ๋ํ์์์์ ์ค๋ฒ๋๋ก ์์ญ ํ์๋ฅผ ์ ํํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์์๊ฐ์ด ์์์ ๋ฐ๋ผ ์ค๋ฒ๋๋ก ๋น๋์๋ฅผ ์๊ฐ์ ์ผ๋ก ํํ ๊ฐ๋ฅํฉ๋๋ค.
How to avoid Overdraw
์ค๋ฒ๋๋ก๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ ์ด์์์์ ๋ถํ์ํ ๋ฐฐ๊ฒฝ์ญ์
- ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ ํ๋ฉดํ => ์ต๋ํ ๊ด๊ณ์ฑ ์ค์ ํ์ฌ ๋ทฐ ๊ณ์ธต์ ์ค์ด๊ธฐ(like ConstraintLayout)
- ํฌ๋ช ๋ ์กด์ฌ์ ๋ฌด์ ๋ฐ๋ผ Rendering Cost๊ฐ ์์น => Hidden Cost of Transparency ์ฐธ๊ณ
์ด๋ฅผ ์ธก์ ํ๊ธฐ ์ํด ๊ฐ๋ฐ์ ์ต์ ์์๋ HWUI ํ๋กํ์ผ๋ง ์ต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
GPU Rendering Speed Profiling
60fps(GPU ์ฐ์ฐ์ผ๋ก ์ด ๋น 60ํ๋ ์์ผ๋ก ํ๋ฉด์ ๋ฟ๋ฆฌ๋ ๊ฒ)์ผ ๋ ๋ ๋๋ง์ ์ผ๋ง๋ ์ฑ๋ฅ์ ์ก์๋จน๋์ง ํ์ธํ๊ธฐ ์ํด ๊ฐ๋ฐ์ ์ต์ ์ ํตํด ๋ค์ ๋๊ตฌ๋ฅผ ์ฌ์ฉ์ค์ ํ ์ ์์ต๋๋ค.
Android 3.0(Honeycomb) ๋ฒ์ ์ด์์ HWUI ํ๋กํ์ผ๋ง ์ต์ ์ ์ผ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฌ๋๋ฐฉ๋ฒ
- ๊ธฐ๊ธฐ์์ ์ค์ ์ผ๋ก ์ด๋ํ์ฌ ๊ฐ๋ฐ์ ์ต์ ์ ํญํฉ๋๋ค.
- ๋ชจ๋ํฐ๋ง ์น์ ์์ ํ๋กํ GPU ๋ ๋๋ง์ ์ ํํฉ๋๋ค.
- โํ๋กํ GPU ๋ ๋๋งโ ๋ํ์์์์ ํ๋ฉด์ ๋ง๋๋ก ํ์๋ฅผ ์ ํํ์ฌ ๊ธฐ๊ธฐ์ ํ๋ฉด์ ๊ทธ๋ํ๋ฅผ ์ค๋ฒ๋ ์ดํฉ๋๋ค.
- ํ๋กํ์ผ๋งํ๋ ค๋ ์ฑ์ ์ฝ๋๋ค.
๋น ๋ฅธ ์ ๊ทผ ๋ฐฉ๋ฒ
- ๊ธฐ๊ธฐ์์ ์ค์ ์ผ๋ก ์ด๋ํ์ฌ ๊ฐ๋ฐ์ ์ต์ ์ ํญํฉ๋๋ค.
- ๋น ๋ฅธ ์ค์ ๊ฐ๋ฐ์ ํ์ผ์ ์ฝ๋๋ค.
- ํ๋กํ HWUI ๋ ๋๋ง ์ต์ ์ On/Off ํฉ๋๋ค.
- Status Bar๋ฅผ ํต ์ค์ ํ์ผ์์ ๊ด๋ฆฌ ๊ฐ๋ฅํฉ๋๋ค.
์ค์ ์ ํ์ฑํ ํ๊ณ ํ์ธํด๋ณด๋ฉด, ์์ ๊ฐ์ด ํ์คํ ๊ทธ๋จ์ผ๋ก ํ์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์์์ด ๋ปํ๋ ์๋ฏธ๋ฅผ ๊ฐ์ ์ดํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์๋๋ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ดํด ๊ทธ๋ํ๊ฐ ํ์๋ฉ๋๋ค.
- ๊ฐ๋ก์ถ์ ๊ฐ ์ธ๋ก ๋ง๋๋ ํ๋ ์์ ๋ํ๋ด๋ฉฐ ๊ฐ ์ธ๋ก ๋ง๋์ ๋์ด๋ ํ๋ ์์ ๋ ๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ ๋ํ๋ ๋๋ค.
- ๋ น์ ๊ฐ๋ก์ ์ 16๋ฐ๋ฆฌ์ด๋ฅผ ๋ํ๋ ๋๋ค. 60fps๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ๊ฐ ํ๋ ์์ ์ธ๋ก ๋ง๋๊ฐ ์ด ์ ์๋์ ๋จธ๋ฌผ๋ฌ์ผ ํฉ๋๋ค. ๋ง๋๊ฐ ์ด ์ ์ ๋์ด์๋ฉด ์ ๋๋ฉ์ด์ ์ด ์ผ์์ค์ง๋ ์ ์์ต๋๋ค.
- 16๋ฐ๋ฆฌ์ด ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ํ๋ ์์ ๋ง๋๋ฅผ ๋ ๋๊ณ ๋ ํฌ๋ช ํ๊ฒ ๋ง๋ค์ด ๊ฐ์กฐํ์๋ฉ๋๋ค.
- ๊ฐ ๋ง๋์๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋จ๊ณ๋ก ๋งคํ๋๋ ์์์ผ๋ก ํ์๋ ๊ตฌ์ฑ์์๊ฐ ์์ต๋๋ค. ๊ตฌ์ฑ์์์ ์๋ ๊ธฐ๊ธฐ์ API ์์ค์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์ง๊ธ๊น์ง ์๋๋ก์ด๋ ๋ทฐ ๋ ๋๋ง ๊ณผ์ ์ ์ดํดํ๊ณ , ์ด ๊ณผ์ ์์ ์ฑ๋ฅ ํ๋กํ์ผ๋ง์ ์ด๋ป๊ฒ ํ ์ ์๋์ง ์์๋ณด์์ต๋๋ค.
๋ทฐ ๋ ๋๋ง ๊ณผ์ ์ ์ผ๋ฐ์ ์ธ ์ฑ ๊ฐ๋ฐ๊ณผ์ ์์ ๋ฅํ๊ฒ ์ฐ๊ตฌํ ํ์๋ ์์ง๋ง, ์์๋๋ฉด ๋ ์ฑ๋ฅ์ข์ ์ฑ์ ๋ง๋ค ์ ์๋๋ก ๋๋ ๋งค์ฐ ์ค์ํ ์ง์์ด๊ธฐ๋ํฉ๋๋ค. ์ฌ๋ฌ๋ถ๋ค์๊ฒ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋๊ธธ ๋ฐ๋ผ๋ฉด์ ๊ธ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
Comments