Introduce Android View Processing & GPU Rendering Profiling ๐Ÿ”

์•ˆ๋“œ๋กœ์ด๋“œ ๋ทฐ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•˜๊ณ , ์ด ๊ณผ์ •์—์„œ ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง์„ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Imagem de capa

์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ์ด์œ 

์–ผ๋งˆ์ „ ํšŒ์‚ฌ์—์„œ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋˜ ๋„์ค‘ ๋™๋ฃŒ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋ฌธ๋“ ์ด๋Ÿฐ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ณผ์—ฐ ํ˜„์žฌ ๋ณธ์ธ์ด ๋งŒ๋“œ๋Š” ์•ฑ์˜ ์ตœ์ ํ™”์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ด€์‹ฌ์„ ๋‘๊ณ  ์žˆ์„๊นŒ?

๊ทธ์ € ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ง‘์ค‘ํ•˜๋‹ค๋ณด๋‹ˆ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์„ ๋†“์น˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€ ์•Š์„๊นŒ?

์ด ์ƒ๊ฐ์ด ๋“œ๋Š” ์ˆœ๊ฐ„ ์ €๋Š” ํ˜„์žฌ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ์•ฑ์˜ ์„ฑ๋Šฅ์ด ์–ด๋Š์ •๋„ ์ˆ˜์ค€์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์žฅ HWUI ํ”„๋กœํŒŒ์ผ๋ง ํˆด์„ ์ผœ์„œ ํ™•์ธํ•ด๋ณด๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜ค๊ฒŒ ๋œ ๊ฒฐ๊ณผ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์ข‹์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

GPU ๋ Œ๋”๋ง ํ”„๋กœํŒŒ์ผ ๊ทธ๋ž˜ํ”„

๋ฌด์—‡์ด ๋ฌธ์ œ์ธ๊ฐ€์š”? ๐Ÿค”

์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์‹ค์ œ๋กœ ์•ฑ์„ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ ๋ช‡๋ช‡ ์•ฑ์˜ ๊ฒฝ์šฐ ๋š๋š ๋Š๊ธฐ๋Š” ํ˜„์ƒ์„ ๊ฒฝํ—˜ํ•˜์‹ ์ ์ด ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค.

์ด๋•Œ, ๊ฐœ๋ฐœ์ž๋ชจ๋“œ๋ฅผ ํ†ตํ•ด 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.

Device backends for Skia currently include:

์ข€ ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” ์ด๊ณณ์— ๊ฐ€๋ฉด ๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ•œ๋ฒˆ ๋‘˜๋Ÿฌ๋ณด์‹œ๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SKIA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๊ทธ๋ž˜ํ”ฝ ์„œ๋ธŒ ์‹œ์Šคํ…œ์„ ๋„์‹ํ™” ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Android GDI Components

์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๊ฒฝ์šฐ 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

ํด๋ž˜์Šค๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ 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) ๊ธ€์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Android Drawing Process Flow

์œ„ ์ด๋ฏธ์ง€๋Š” ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ ‰์…˜์— ์˜ํ•ด ํ™”๋ฉด์ด ๊ฐฑ์‹ ๋˜๋Š” Flow๋ฅผ ๊ณ„์ธต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ฑ์—์„œ Android Framework Level์—์„œ SurfaceFling API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ VSync Processing, Screen Refreshing, Layer Management ๋ฃจํ‹ด์„ ๊ตฌ์„ฑํ•˜์—ฌ ํ”„๋กœ์„ธ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

Surface Flinger Management

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ด ์„ธ๊ฐ€์ง€๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ์•„๋ž˜ ์„ค๋ช…์—์„œ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋“ค์–ด๊ฐ€๊ธฐ์ „, ์•ฑ ๋‚ด View๊ฐ€ ๊ทธ๋ ค์ง€๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณด๋„๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Drawing Process(Application Side)

Android Drawing Process

๊ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ๋Ÿฌ ViewController(Activity, Fragment)๋“ฑ์— ์—ฌ๋Ÿฌ ๋ทฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ View๋Š” DecorView๋ฅผ ์ตœ์ข… ๋ฃจํŠธ๋กœ ๊ฐ€์ง€๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

DecorView๋Š” ๊ทธ๋ฆด ๊ฒƒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ• ๋‹น๋ฐ›์€ Surface์— ๊ทธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.. ๋”ฐ๋ผ์„œ Surface๋Š” ๊ฐ Application๋ณ„๋กœ ์ตœ์†Œ ํ•˜๋‚˜๋Š” ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์œ„์—์„œ ๋งํ•œ Layer Managent์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ๋ฐ”๋กœ Surface์ž…๋‹ˆ๋‹ค. ๋‘ ๋‹จ์–ด์˜ ์˜๋ฏธ๋Š” ๋™์ผํ•˜๋‹ค ๋ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

Surface์™€ SurfaceFlinger๋Š” ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด ISurfaceComposer๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

์•ฑ์—์„œ๋Š” SurfaceComposerClient๋กœ ISurfaceComposer๋ฅผ ํ†ตํ•ด createSurface() ํ˜ธ์ถœํ•œ ๊ฒƒ์„ createLayer()๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค. SurfaceFliger์—์„œ๋Š” ํ•ด๋‹น ์•ฑ์˜ ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

Surface๊ฐ€ ์•ฑ์—์„œ ์†Œ์œ ํ•˜๋Š” ๊ฐœ๋…์ด๋ผ๋ฉด, ๊ทธ๊ฒƒ์„ SurfaceFliger์—์„œ Layer ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Surface & Layer Flow

๋‹ค์Œ์€ VSync Processing์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

VSync Processing

VSync ์†Œ๊ฐœ

VSync๋Š” Vertical Synchronization(์ˆ˜์ง ๋™๊ธฐํ™”)์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. Android 4.1 Project Butter์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

Dwawing with VSync

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๋ฅผ ์š”์ฒญ/์ˆ˜์‹ ํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ViewRootImpl

ViewRootImpl์€ DecorView์™€ Choreographer๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ํ•ธ๋“ค๋Ÿฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด๋กœ์จ, DecorView์™€ Choreographer ์‚ฌ์ด์—์„œ ๋‘˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ค‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

Drawing Process(Framework Side)

๋”ฐ๋ผ์„œ, ์•„๋ž˜์™€ ๊ฐ™์€ Flow๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Drawing Process

์‹ค์ œ ๊ทธ๋ฆฌ๊ธฐ๋Š” ํ˜„์žฌ 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์€ ๋‹ค์Œ ๋‘ ๋‹จ๊ณ„๋กœ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.

  1. ๊ณ„์ธต ๊ตฌ์กฐ ๋ฌดํšจํ™”
  2. ๊ณ„์ธต ๊ตฌ์กฐ ๊ทธ๋ฆฌ๊ธฐ

ํ•˜๋“œ์›จ์–ด ๊ฐ€์†

Android 3.0(API ๋ ˆ๋ฒจ 11)๋ถ€ํ„ฐ Android 2D ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ๊ฐ€์†ํ™”๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ, View์˜ ์บ”๋ฒ„์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ๊ทธ๋ฆฌ๊ธฐ ์ž‘์—…์—์„œ GPU๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋Š˜์–ด๋‚˜๋ฏ€๋กœ ์•ฑ์—์„œ ๋” ๋งŽ์€ RAM์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Android ์‹œ์Šคํ…œ์—์„œ๋Š” ์—ฌ์ „ํžˆ invalidate() ๋ฐ draw()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ณด๊ธฐ๋ฅผ ๋ Œ๋”๋งํ•˜์ง€๋งŒ, ์‹ค์ œ ๊ทธ๋ฆฌ๊ธฐ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Android ์‹œ์Šคํ…œ์—์„œ๋Š” ์ฆ‰์‹œ ๊ทธ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ๋ณด๊ธฐ ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๊ทธ๋ฆฌ๊ธฐ ์ฝ”๋“œ ์ถœ๋ ฅ์„ ํฌํ•จํ•˜๋Š” ํ‘œ์‹œ ๋ชฉ๋ก์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Android ์‹œ์Šคํ…œ์—์„œ invalidate() ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋”ํ‹ฐ๋กœ ํ‘œ์‹œ๋œ ๋ณด๊ธฐ์˜ ํ‘œ์‹œ ๋ชฉ๋ก์„ ๊ธฐ๋กํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋งŒ ํ•˜๋ฉด ๋˜๋„๋ก ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.

๋ฌดํšจํ™”๋˜์ง€ ์•Š์€ ๋ณด๊ธฐ๋Š” ๋‹จ์ˆœํžˆ ์ด์ „์— ๊ธฐ๋ก๋œ ํ‘œ์‹œ ๋ชฉ๋ก์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๊ทธ๋ฆฌ๊ธฐ ๋ชจ๋ธ์—๋Š” ๋‹ค์Œ ์„ธ ๋‹จ๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  1. ๊ณ„์ธต ๊ตฌ์กฐ ๋ฌดํšจํ™”
  2. ํ‘œ์‹œ ๋ชฉ๋ก ๊ธฐ๋ก ๋ฐ ์—…๋ฐ์ดํŠธ
  3. ํ‘œ์‹œ ๋ชฉ๋ก ๊ทธ๋ฆฌ๊ธฐ

์ง€๊ธˆ๊นŒ์ง€๋Š” View๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฐœ๋… ์„ค๋ช… ๋ฐ ์›๋ฆฌ ์„ค๋ช…์„ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด, ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์„ ์‚ฌ์šฉํ•˜๋Š” GPU ๋ Œ๋”๋ง ์ฒด๊ณ„์˜ ๊ฒฝ์šฐ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ”„๋กœํŒŒ์ผ๋ง ํ•˜๋Š”์ง€ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Android GPU Rendering Profiling

Android - Overdraw๋ž€?

์‹œ๊ฐ์ ์œผ๋กœ UI๋Š” ๋™์ผํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ํ™”๋ฉด์˜ ๋ณด์ด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์„ฑ๋ฐฉ์‹์€ ์ •๋ง ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ, ๊ฐ™์€ ํ”„๋ ˆ์ž„ ๋‚ด ๋‘๋ฒˆ์ด์ƒ ๊ฐ™์€ ํ”ฝ์…€์„ ๊ทธ๋ฆด ๋•Œ Overdraw๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Overdraw ๋นˆ๋„ ์ˆ˜๊ฐ€ ๋†’์•„์ง€๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ GPU ์ž‘์—…์œผ๋กœ์ธํ•ด ์„ฑ๋Šฅ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด GPU ์˜ค๋ฒ„๋“œ๋กœ ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ๋ทฐ์—์„œ Overdraw๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Š”๋ฐฉ๋ฒ•

  1. ๊ธฐ๊ธฐ์—์„œ ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ์˜ต์…˜์„ ํƒญํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ๋ Œ๋”๋ง ์„น์…˜์œผ๋กœ ์Šคํฌ๋กคํ•˜์—ฌ GPU ์˜ค๋ฒ„๋“œ๋กœ ๋””๋ฒ„๊ทธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. GPU ์˜ค๋ฒ„๋“œ๋กœ ๋””๋ฒ„๊ทธ ๋Œ€ํ™”์ƒ์ž์—์„œ ์˜ค๋ฒ„๋“œ๋กœ ์˜์—ญ ํ‘œ์‹œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Android Overdraw

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์™€๊ฐ™์ด ์ƒ‰์ƒ์— ๋”ฐ๋ผ ์˜ค๋ฒ„๋“œ๋กœ ๋นˆ๋„์ˆ˜๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

How to avoid Overdraw

์˜ค๋ฒ„๋“œ๋กœ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž ์˜ต์…˜์—์„œ๋Š” HWUI ํ”„๋กœํŒŒ์ผ๋ง ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GPU Rendering Speed Profiling

60fps(GPU ์—ฐ์‚ฐ์œผ๋กœ ์ดˆ ๋‹น 60ํ”„๋ ˆ์ž„์œผ๋กœ ํ™”๋ฉด์„ ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ)์ผ ๋•Œ ๋ Œ๋”๋ง์— ์–ผ๋งˆ๋‚˜ ์„ฑ๋Šฅ์„ ์žก์•„๋จน๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž ์˜ต์…˜์„ ํ†ตํ•ด ๋‹ค์Œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Android 3.0(Honeycomb) ๋ฒ„์ „ ์ด์ƒ์€ HWUI ํ”„๋กœํŒŒ์ผ๋ง ์˜ต์…˜์„ ์ผœ์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Š”๋ฐฉ๋ฒ•

  1. ๊ธฐ๊ธฐ์—์„œ ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ์˜ต์…˜์„ ํƒญํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋‹ˆํ„ฐ๋ง ์„น์…˜์—์„œ ํ”„๋กœํ•„ GPU ๋ Œ๋”๋ง์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. โ€˜ํ”„๋กœํ•„ GPU ๋ Œ๋”๋งโ€™ ๋Œ€ํ™”์ƒ์ž์—์„œ ํ™”๋ฉด์— ๋ง‰๋Œ€๋กœ ํ‘œ์‹œ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ธฐ๊ธฐ์˜ ํ™”๋ฉด์— ๊ทธ๋ž˜ํ”„๋ฅผ ์˜ค๋ฒ„๋ ˆ์ดํ•ฉ๋‹ˆ๋‹ค.
  4. ํ”„๋กœํŒŒ์ผ๋งํ•˜๋ ค๋Š” ์•ฑ์„ ์—ฝ๋‹ˆ๋‹ค.

๋น ๋ฅธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

  1. ๊ธฐ๊ธฐ์—์„œ ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ์˜ต์…˜์„ ํƒญํ•ฉ๋‹ˆ๋‹ค.
  2. ๋น ๋ฅธ ์„ค์ • ๊ฐœ๋ฐœ์ž ํƒ€์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  3. ํ”„๋กœํ•„ HWUI ๋ Œ๋”๋ง ์˜ต์…˜์„ On/Off ํ•ฉ๋‹ˆ๋‹ค.
  4. Status Bar๋ฅผ ํ€ต ์„ค์ • ํƒ€์ผ์—์„œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •์„ ํ™œ์„ฑํ™” ํ•˜๊ณ  ํ™•์ธํ•ด๋ณด๋ฉด, ์œ„์™€ ๊ฐ™์ด ํžˆ์Šคํ† ๊ทธ๋žจ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ƒ‰์ƒ์ด ๋œปํ•˜๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ์ž ์‚ดํŽด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

HWUI Profiling

Android HWUI Profinling Spec

์ง€๊ธˆ๊นŒ์ง€ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ทฐ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•˜๊ณ , ์ด ๊ณผ์ •์—์„œ ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง์„ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ทฐ ๋ Œ๋”๋ง ๊ณผ์ •์€ ์ผ๋ฐ˜์ ์ธ ์•ฑ ๊ฐœ๋ฐœ๊ณผ์ •์—์„œ ๋”ฅํ•˜๊ฒŒ ์—ฐ๊ตฌํ• ํ•„์š”๋Š” ์—†์ง€๋งŒ, ์•Œ์•„๋‘๋ฉด ๋” ์„ฑ๋Šฅ์ข‹์€ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ์ง€์‹์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค์—๊ฒŒ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ผ๋ฉด์„œ ๊ธ€ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.