Flutter architectural overview | Flutter
Impeller rendering engine | Flutter
์ด๋ฒ ๊ธ์์๋ Flutter์ ๋ ๋๋ง ์๋ฆฌ์ ๊ณผ์ ๋ฑ ์์ฑํ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ํ๋ฉด์ ๊ทธ๋ ค์ง๋์ง์ ๋ํ ๋ด์ฉ์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
โ๏ธ์ด ๊ธ์ ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ผ๋ก, ์ผ๋ถ ์๋ชป๋ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค. ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฒํ ํ ์์ ํ๊ฒ ์ต๋๋ค !!
Flutter๋ ํฌ๋ก์ค ํ๋ซํผ ํ๋ ์์ํฌ๋ก, ํ๋์ ์ฝ๋๋ฒ ์ด์ค๋ก iOS์ Android ๋ชจ๋ฐ์ผ ํ๋ซํผ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๋ค(์ฌ๊ธฐ์๋ ๋ชจ๋ฐ์ผ ํ๋ซํผ์ ๊ธฐ์ค์ผ๋ก ์์ฑํจ).
Flutter๊ฐ ์ด๋ป๊ฒ ํ๋ฉด์ ๋ ๋๋งํ๋ฉฐ, ์ฌ๋ฌ ํ๋ซํผ์์ ์ผ๊ด๋๊ฒ ๋ ๋๋ง๋ ์ ์๋์ง์ ๋ํด ์๋ฆฌ์ ๊ณผ์ ์ ์ดํด๋ณด๋๋ก ํ์.
Flutter์ ๋ ๋๋ง์ ์์๋ณด๊ธฐ์ ์์ ๋ค์ดํฐ๋ธ ํ๋ซํผ(Android, iOS)์ ์ด๋ป๊ฒ ๋ ๋๋ง์ ํ๋์ง์ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ ํฌ๋ก์คํ๋ซํผ์ธ RN(ReactNative)์ ์ด๋ป๊ฒ ๋ ๋๋งํ๊ณ Flutter์์ ์ฐจ์ด๋ ๋ฌด์์ธ์ง์ ๋ํด ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
ํด๋น ๋ด์ฉ์ ์ด๋ก ์ ์ธ ์ค๋ช ๊ณผ ๊ณต์ ๋ฌธ์์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑ ํ์์ผ๋ ๊ฐ๋ณ๊ฒ ํ ๋ฒ ์ฝ์ด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
Android์ ๋ ๋๋ง์ ์ฃผ๋ก View ์์คํ ์ ํตํด UI๊ฐ ๊ตฌ์ฑ๋๊ณ , ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. Android ์ ํ๋ฆฌ์ผ์ด์ ์ UI์์๋ค์ ๋ค์ดํฐ๋ธ View ํด๋์ค ๊ณ์ธต์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ๊ฐ ์์๋ ํ๋ฉด์ ์ด๋ป๊ฒ ๊ทธ๋ฆด์ง ์ ์๋์ด ์๋ค. View ๊ณ์ธต์ ๋ถ๋ชจ-์์ ๊ด๊ณ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ ์ด๋ฅผ ํตํด Android๋ ํ๋ฉด์ ๊ฐ UI ์์๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ค.
์ดํ SurfaceFlinger๋ผ๋ Android ์์คํ ๊ตฌ์ฑ ์์๊ฐ OpenGL/ES ๋๋ Vulkan์ ์ฌ์ฉํด UI๋ฅผ GPU์ ์ ๋ฌํ๊ณ ๊ฐ View๋ฅผ ์ค์ ๋ก ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์์ ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค. SurfaceFlinger๋ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ทธ๋ ค์ง ์ฌ๋ฌ ๊ฐ์ UI๋ฅผ ๊ฒฐํฉํ์ฌ ์ต์ ์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง ๋จ์ผ ํ๋ฉด์ ์์ฑํ๋ค.
Hardware Composer๋ GPU๊ฐ ์ง์ ํ๋ฉด์ ๊ทธ๋ฆด ์ ์๋๋ก ๊ฐ UI ์์๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ Choreographer๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ผ์ ํ ํ๋ ์ ์๋(์ผ๋ฐ์ ์ผ๋ก 60fps)๋ก ๋ถ๋๋ฝ๊ฒ ์คํ๋๋๋ก ํ๋ ์์ ์กฐ์ ํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค. ์ด๋ฅผ ํตํด Android๋ ๊ฐ ํ๋ ์์์ UI๋ฅผ ์ต์ ํํ์ฌ ๋ ๋๋งํ๋ฉฐ ์ฌ์ฉ์์๊ฒ ๋ถ๋๋ฌ์ด ํ๋ฉด ์ ํ๊ณผ ์ํธ์์ฉ์ ์ ๊ณตํ๊ฒ ๋๋ค. ์ด ๊ณผ์ ์์ Android๋ UI ์์๋ฅผ ํจ์จ์ ์ผ๋ก ํ๋ฉด์ ๋ ๋๋งํ๊ธฐ ์ํด ๋ค์ดํฐ๋ธ UI ์์คํ ์ ์ฌ์ฉํ๊ณ , GPU์ ํ๋ ฅํ์ฌ ๋น ๋ฅธ ๋ ๋๋ง ์ฑ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ํ๋ค.
iOS์ ๋ ๋๋ง์ ์ฃผ๋ก UIKit๊ณผ Core Animation์ ํตํด UI๋ฅผ ๊ตฌ์ฑํ๊ณ ํ๋ฉด์ ํ์๋๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. iOS์์ UI ์์๋ค์ UIView ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๊ฐ ๋ทฐ๋ ํ๋ฉด์ ํน์ ์์ญ์ ์ฐจ์งํ๊ณ ํด๋น ์์ญ์ ๊ทธ๋ ค์ง ์ฝํ ์ธ ๋ฅผ ์ ์ํฉ๋๋ค. ์ด ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ๋ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ํ๋ฉด์ ๊ทธ๋ ค์ง ๋ชจ๋ ์์๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ค.
iOS๋ Core Animation ํ๋ ์์ํฌ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ UI๋ฅผ ์ต์ ํํ๊ณ ์ ๋๋ฉ์ด์ ์ ์ฒ๋ฆฌํ๋ค. Core Animation์ ํ๋ฉด์ UI ์์๋ค์ GPU์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ฐ ๋ ์ด์ด๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ณ ๋ฐฐ์นํ์ฌ ์ ๋๋ฉ์ด์ ์ฑ๋ฅ์ ์ต์ ํํ๋ค. ์ด ๊ณผ์ ์์ CALayer ๊ฐ์ฒด๊ฐ UI ์์์ ๋ฐฐ๊ฒฝ, ํ ๋๋ฆฌ, ๊ทธ๋ฆผ์ ๋ฑ์ ์๊ฐ์ ์์ฑ์ ๊ด๋ฆฌํ๋ฉฐ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ถ๊ฐํ๋ค.
iOS๋ Metal ๋๋ OpenGL๊ณผ ๊ฐ์ ๊ทธ๋ํฝ API๋ฅผ ์ฌ์ฉํ์ฌ GPU์ ์ง์ UI๋ฅผ ๋ ๋๋งํฉ๋๋ค. WindowServer๋ ์ฑ์ ๋ ๋๋ง๋ ๋ด์ฉ์ ์์งํด ์ต์ข ์ ์ผ๋ก ํ๋ฉด์ ํ์ํ๋ ์ญํ ์ ํ๋ฉฐ, ๊ฐ ํ๋ ์์ด ์ผ์ ํ ์๋๋ก ๋ ๋๋ง๋๋๋ก ๊ด๋ฆฌํ๋ค.
์ด๋ฅผ ํตํด iOS๋ ๋ถ๋๋ฌ์ด ํ๋ฉด ์ ํ๊ณผ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๊ณ ์ด ๋ชจ๋ ๊ณผ์ ์์ iOS๋ ๋ค์ดํฐ๋ธ ๋ทฐ ์์คํ ๊ณผ ๊ณ ์ฑ๋ฅ ๊ทธ๋ํฝ API๋ฅผ ์ฌ์ฉํด ๋งค์ฐ ์ต์ ํ๋ UI ๋ ๋๋ง์ ์ ๊ณตํ๊ฒ ๋๋ค.
React Native๋ JavaScript ์ฝ๋์ ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ ๊ฐ์ ์ํธ์์ฉ์ ํตํด ์ด๋ฃจ์ด์ง๋ค. ๋จผ์ JavaScript๋ก ์์ฑ๋ React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ UI์ ๋ก์ง์ ์ ์ํ๊ฒ ๋๋ค. ์ด JavaScript ์ฝ๋๋ ๋ธ๋ฆฟ์ง(Bridge)๋ฅผ ํตํด ๋ค์ดํฐ๋ธ API์ ์ํธ์์ฉํ๋ฉฐ, UI ์์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์ดํฐ๋ธ ์ฝ๋์ ์ ๋ฌํ๋ค.
RN์ Virtual DOM์ ์ฌ์ฉํ์ฌ UI ์ ๋ฐ์ดํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค. React๊ฐ ์ปดํฌ๋ํธ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ฉด, Virtual DOM์์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ๊ณ์ฐํ์ฌ ์ค์ ๋ค์ดํฐ๋ธ UI ์์์ ํ์ํ ์ต์ํ์ ๋ณ๊ฒฝ๋ง์ ์ ๋ฌํ๋ค. ์ด ๊ณผ์ ์์ JavaScript์ UI ๊ตฌ์ฑ ์์๋ ๋ธ๋ฆฟ์ง๋ฅผ ํตํด Android์ View๋ iOS์ UIView์ ๊ฐ์ ๋ค์ดํฐ๋ธ ์์๋ก ๋ณํ๋์ด ํ๋ฉด์ ๋ ๋๋ง๋๋ค.
๋ํ JavaScript์ ๋ค์ดํฐ๋ธ ์ฝ๋ ๊ฐ์ ์ํธ์์ฉ์ ๋ค์ดํฐ๋ธ ๋ชจ๋์ ํตํด ์ด๋ฃจ์ด ์ง๋๋ฐ, ์ด๋ฌํ ๋ชจ๋์ JavaScript์์ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ํธ์ถํ๊ฑฐ๋ ๋ค์ดํฐ๋ธ API์ ๊ฒฐ๊ณผ๋ฅผ JavaScript๋ก ๋ฐํํ๋ค. ์ต์ข ์ ์ผ๋ก ๋ค์ดํฐ๋ธ UI ์์๋ Android์ SurfaceFlinger์ด๋ iOS์ Core Animation์ ํตํด ํ๋ฉด์ ๊ทธ๋ ค์ ธ ์ฌ์ฉ์์๊ฒ ํ์๋๋ค.
JavaScriptCore(JSC)๋ฅผ ์ฌ์ฉํ์ฌ JavaScript ์ฝ๋๋ฅผ ์คํํ๋ฉฐ, ์ต๊ทผ์๋ Hermes๋ผ๋ ๋ค๋ฅธ JavaScript ์์ง๋ ์ง์ํฉ๋๋ค. ์๋ก์ด Fabric ์ํคํ ์ฒ๋ฅผ ๋์ ํ์ฌ ๋ธ๋ฆฌ์ง ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ํฌ๋ก์ค ํ๋ซํผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ํฅ์์ํค๊ณ ์๋ค๊ณ ํ๋ค.
๋ง์ง๋ง์ผ๋ก Flutter์ ๋ ๋๋ง์ ๋ํด์๋ ์ค๋ช ์ ๋ณด๋๋กํ์.
Flutter๋ UI๋ฅผ ์ง์ ๊ทธ๋ฆฌ๋ ํฌ๋ก์ค ํ๋ซํผ ํ๋ ์์ํฌ๋ก Dart ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค. Flutter์ ๋ ๋๋ง ๊ณผ์ ์ Widget, Element, RenderObject์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, Skia ๋๋ ์ต์ Impeller ๊ทธ๋ํฝ ์์ง์ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ์ต์ข ์ ์ผ๋ก UI๋ฅผ ๊ทธ๋ฆฌ๊ฒ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ UI๋ Widget์ผ๋ก ์ ์๋๋ฉฐ ๊ฐ ์์ ฏ์ Element๋ก ๋ณํํ๋ค. Element๋ ์์ ฏ์ ์ํ๋ฅผ ์ ์งํ๊ณ ์ค์ ํ๋ฉด์ ๊ทธ๋ ค์ง UI๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋ค. Element๋ ๋ค์ RenderObject๋ก ๋ณํ๋์ด ์์น์ ํฌ๊ธฐ, ๊ทธ๋ฆฌ๊ธฐ ๊ด๋ จ ๊ณ์ฐ์ ์ํํ๋ฉฐ ์ค์ ๋ก ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ์ญํ ์ ์ํํ๋ค.
Skia ์์ง์ ์ฌ์ฉํ์ฌ UI๋ฅผ ๊ทธ๋ฆฌ๋ฉฐ Skia๋ 2D ๊ทธ๋ํฝ์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๋ ๋๋ง ํ๋ค๊ณ ํ๋ค. ์ต์ ๋ฒ์ ์์๋ Impeller๋ผ๋ ์๋ก์ด ๊ทธ๋ํฝ ์์ง์ ๋์ ํ์ฌ ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํค๊ณ ์์ผ๋ฉฐ ์์ง์ ๋ ๋๋ง ๋ช ๋ น์ GPU์ ์ ๋ฌํ์ฌ ์ต์ข ์ ์ผ๋ก ํ๋ฉด์ UI๋ฅผ ํ์ํ๊ฒ ํ๋ค.
์ด ๊ณผ์ ์์ Flutter๋ ๋ค์ดํฐ๋ธ ํ๋ซํผ์ UI ์์์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฉฐ ๋์ ์์ค์ ์ปค์คํฐ๋ง์ด์ง๊ณผ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ฒ ๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์ ๋๋ถ์ Flutter๋ ๋ค์ํ ํ๋ซํผ์์ ๋ค์ดํฐ๋ธ ์ฑ๋ฅ์ ๊ฐ๊น์ด UI๋ฅผ ๊ตฌํํ ์ ์๋ค๊ณ ํ๋ค.
์๋ง๋ ๋ฌด์จ๋ง์ธ์ง ์ดํด๊ฐ ์ ์๋ ํ ๋ฐ, ์ผ๋จ์ "์! ์ด๋ฐ ๊ณผ์ ์ ํตํด UI๊ฐ ํ๋ฉด์ ๋ณด์ฌ์ง๋ ๊ตฌ๋" ์ ๋๋ก๋ง ์ฝ์์ผ๋ฉด ๋๋ค.
ํ๋ซํผ๋ณ ๋ ๋๋ง ์๋ฆฌ์ ๊ณผ์ ์ ๊ฐ๋จํ๊ฒ ์์ฝํ ๊ฒ์ด๋ฉฐ, ์ค์ ๋ก๋ ๋ ๋ณต์กํ๊ณ ์ธ๋ถํ๋ ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ค. ์์ธํ ๋ด์ฉ์ ๊ฐ ํ๋ซํผ๋ณ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋๋ค.
์ด์ ์์ฑํ ์ฝ๋๊ฐ ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง, Flutter์ ๋ ๋๋ง ์๋ฆฌ์ ๊ณผ์ ์ ์ข ๋ ์์ธํ ์์๋ณด๋๋ก ํ์.
๋ณธ๊ฒฉ์ ์ผ๋ก Flutter์ ๋ ๋๋ง ์๋ฆฌ์ ๊ณผ์ ์ ๋ํด์ ๋ํ ์ผํ๊ฒ ์์๋ณด๋๋ก ํ์.
Flutter์ ๋ ๋๋ง ์๋ฆฌ์ ๊ณผ์ ์ ์ดํดํ๋ฉฐ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ ์ค์ํ ๊น ?
์ฌ์ค, ์ด๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํด๋ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ณ ๊ตฌํํ๋ ๋ฐ๋ ํฐ ์ด๋ ค์์ด ์์ ์๋ ์๋ค. ํ์ง๋ง Flutter๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ธ์ด๋ ํ๋ ์์ํฌ๋ก ๊ฐ๋ฐํ ๋๋ ๋ ๋๋ง ์๋ฆฌ์ ๊ณผ์ ์ ๋ํ ์ดํด๋ ์ฑ๋ฅ ์ต์ ํ, ๋ณต์กํ UI ๊ตฌํ, ๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋๋ฒ๊น , ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋งค์ฐ ์ค์ํ ์์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฑ๋ฅ ์ต์ ํ
Flutter๋ ํ๋ ์ ๋จ์๋ก ํ๋ฉด์ ๊ฐฑ์ ํ๊ธฐ ๋๋ฌธ์, ํ๋ ์์ด 16ms ์ด๋ด(60fps)๋ก ์ฒ๋ฆฌ๋์ง ์์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ๋ ์ ๋๋กญ์ด ๋ฐ์ํ๊ฒ ๋๋ค. ๋ ๋๋ง ๊ณผ์ ์์ ๋ถํ์ํ ์์ ฏ์ ์ฌ๋น๋, ๋ ์ด์์, ํ์ธํ ์ด ๋ฐ์ํ๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ธ์ ์์ ฏ ํธ๋ฆฌ๊ฐ ์ฌ๊ตฌ์ฑ๋๊ณ , ๋ ์ด์์๊ณผ ํ์ธํธ ๋จ๊ณ๊ฐ ๋ฐ์ํ๋์ง ์ดํดํ๊ณ ์์ด์ผ ์ต์ ํ๋ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๋ค.
- ๋ณต์กํ UI
๋ณต์กํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋, ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๊ฐ ๋จ๊ณ(build, layout, paint, composition)๋ฅผ ์ดํดํ๋ฉด ์ด๋ป๊ฒ UI๊ฐ ๊ทธ๋ ค์ง๋์ง์ ๋ํ ๋ช ํํ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ๋ ๋ณต์กํ UI ์ค๊ณ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ์ ๋๋ฉ์ด์ ์ด ๋ง์ UI๋ ์ค์๊ฐ ๋ฐ์ดํฐ ์ ํ ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ, ํจ์จ์ ์ธ ๋ ๋๋ง ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
- ๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋๋ฒ๊น
๋ ๋๋ง ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ฌธ์ (ํ๋ ์ ๋๋กญ, UI ์ง์ฐ, ๋ ์ด์์ ์ด์ ๋ฑ)๋ฅผ ํด๊ฒฐํ ๋์๋ ํ์ดํ๋ผ์ธ์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค. Flutter์์๋ Performance Overlay๋ DevTools ๊ฐ์ ํด์ ํตํด ์ด๋ค ๋จ๊ณ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ถ์ํ ์ ์๋๋ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ๋์ํ๋์ง ์๊ณ ์์ด์ผ ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ์ GPU ๋ฆฌ์์ค ๊ด๋ฆฌ
๋ ๋๋ง์ UI ์ค๋ ๋์ GPU ์ค๋ ๋๊ฐ ์ํธ์์ฉํ์ฌ ์ด๋ฃจ์ด์ง๋, ์ด ๋ UI๊ฐ ๋ณต์กํ ์๋ก ๋ฉ๋ชจ๋ฆฌ์ GPU ๋ฆฌ์์ค์ ํจ์จ์ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค. ๊ณผ์ ์ด ๋นํจ์จ์ ์ด๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ GPU ์ค๋ฒ๋ก๋๊ฐ ๋ฐ์ํ ์ ์์ด, ํ๋ฉด์ด ๋๋ฆฌ๊ฒ ๊ทธ๋ ค์ง๊ฑฐ๋ ๋ถ์์ ํ ์ํ๊ฐ ๋ ์ ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋ ๋๋ง ๊ณผ์ ์ ์ดํดํจ์ผ๋ก์จ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋ณต์กํ UI๋ฅผ ๊ตฌํํ๋ฉฐ ๋ฌธ์ ๋ฐ์์ ์ ์ํ๊ฒ ํด๊ฒฐํ์ฌ ์ต์ ํ๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์ ๊ณตํ ์ ์๋ ๊ฒ์ด๋ค.
Flutter ๊ณต์ ๋ฌธ์์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ(Pipeline)์ ๋ํ ๋ถ๋ถ์ ๋ณด๋๋ก ํ์.
์์ ๊ทธ๋ฆผ์ ๊ณต์๋ฌธ์์์ ํํ๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ(Pipeline)์ 7๋จ๊ณ์ ๊ณผ์ ์ผ๋ก ํํํ ๊ฒ์ด๋ค.
User input, Animation, Build, Layout, Paint, Composition, Rasterize ์ด๋ ๊ฒ 7๋จ๊ณ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค.
์ด์ ๊ฐ ๋จ๊ณ๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ์ํํ๊ณ ์ด๋ค ์ญํ ์ ํ๋์ง ์์๋ณด๋๋ก ํ์.
1. User input
์ด ๋จ๊ณ๋ ์ฌ์ฉ์๊ฐ ํ๋ฉด๊ณผ ์ํธ์์ฉํ ๋ ๋ฐ์ํ๋ ๋ชจ๋ ์
๋ ฅ ์ด๋ฒคํธ(Input)๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ด๋ค.
Touch, gesture, click ๊ฐ์ ์ฌ์ฉ์ ์
๋ ฅ์ ๋ฐ์ ์ฑ์ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์
๋ ฅ์ ๋ง๋ ์ ์ ํ ๋ฐ์์ ์์ํ๊ฒ ๋๋ค. ์
๋ ฅ์ ๋ฐ๋ผ ์์ ฏ ํธ๋ฆฌ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋, ์ ๋๋ฉ์ด์
์ด ์คํ๋๋ ๋ฑ ํ๋ฉด์ ๋ณํ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
2. Animation
์
๋ ฅ์ ๋ฐ๋ฅธ ๋ณํ๋ ๋ด๋ถ ์ํ ๋ณํ๋ก ์ ๋๋ฉ์ด์
(Animation)์ด ๋ฐ์ํ ์ ์๋ค.
AnimationController์ ๊ฐ์ ์ ๋๋ฉ์ด์
ํด๋์ค๋ค์ด ํ๋ ์๋ง๋ค UI ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ฉฐ, ์ด ๋จ๊ณ์์ ์ ๋๋ฉ์ด์
์ ์ํ๊ฐ ์
๋ฐ์ดํธ๋๊ณ , ์๊ฐ์ ๋ฐ๋ผ UI์ ์๊ฐ์ ๋ณํ๋ฅผ ์ผ์ผํจ๋ค. ์ ๋๋ฉ์ด์
์ด ์๋ฃ๋๋ฉด ์๋ก์ด Build ๋จ๊ณ๊ฐ ํธ๋ฆฌ๊ฑฐ๋์ด UI๊ฐ ์
๋ฐ์ดํธ ๋๋ค.
3. Build
build() ๋ฉ์๋๋ฅผ ํตํด Flutter ์์ ฏ ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ ๋จ๊ณ์ด๋ค.
์์ ฏ(Widget)์ Flutter์์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ํ์ํ ๊ตฌ์กฐ์ ๋ ์ด์์์ ์ ์ํ๋ ๊ธฐ๋ณธ ๋จ์์ด๋ค. ์ ๋๋ฉ์ด์
์ํ ๋ณํ๋ ์ฌ์ฉ์ ์
๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก UI๊ฐ ๋ณ๊ฒฝ๋ ํ์๊ฐ ์์ ๊ฒฝ์ฐ ์ด ๋จ๊ณ์์ ์์ ฏ ํธ๋ฆฌ(Widget Tree)๊ฐ ๋ค์ ๋น๋๋๊ฒ ๋๋ค. Flutter๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง ์์ ฏ๋ค์ ๊ฒฐ์ ํ๊ณ , ๊ฐ ์์ ฏ์ ์์ฑ๊ณผ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ค.
4. Layout
๋น๋(Build)๋ ์์ ฏ ํธ๋ฆฌ(Widget Tree)๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ ์์ ฏ์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ๋จ๊ณ๋ก, ๋ถ๋ชจ ์์ ฏ์ ์์ ์์ ฏ์๊ฒ ๊ณต๊ฐ์ ํ ๋นํ๊ณ ์์ ์์ ฏ์ ๊ทธ ๊ณต๊ฐ์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋๋ค. ์ด ๊ณผ์ ์์ Flutter๋ ๊ฐ ์์ ฏ์ด ํ๋ฉด์์ ์ฐจ์งํ ์ ํํ ์ขํ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ์ฌ ๋ ์ด์์(Layout)์ ๊ฒฐ์ ํ๋ค.
5. Paint
์์ ฏ์ ๋ ์ด์์(Layout)์ด ๊ฒฐ์ ๋๋ฉด, ๋ณธ๊ฒฉ์ ์ผ๋ก ํ๋ฉด์ ๊ทธ๋ฆด ์ค๋น๋ฅผ ํ๋ ๋จ๊ณ์ด๋ค. ๊ฐ ์์ ฏ์ ์๊ฐ์ ์์์ ์ค์ ๋ก ์ด๋ป๊ฒ ๋ณด์ฌ์ง์ง๋ฅผ ๊ฒฐ์ ํ๊ณ Flutter๋ Canvas๋ฅผ ์ฌ์ฉํด ์์ ฏ์ ํ๋ฉด์ ๊ทธ๋ฆด ์ ์๋๋ก ๋ช
๋ น์ ์์ฑํ๋ค.
ํ
์คํธ, ๊ทธ๋ฆผ์, ์ , ์ด๋ฏธ์ง ๋ฑ์ ์์๊ฐ ํด๋น ๋จ๊ณ์์ ๊ทธ๋ ค์ง ์ ์๋๋ก ์ค๋น๋๋๋ฐ ์ค์ ๋ก ๊ทธ๋ ค์ง์ง๋ ์์ง๋ง ์ค๋น๋ฅผ ํ๋ ๋จ๊ณ๋ผ๊ณ ๋ณผ ์ ์๋ค.
6. Composition
Paint ๋จ๊ณ์์ ์ค๋น๋ ๊ฐ ์์๋ ์ฌ๋ฌ ๋ ์ด์ด(Layer)๋ก ๋ถํ ๋๊ณ , ๋ถํ ๋ Layer๋ค์ด ์ต์ข
์ ์ผ๋ก ์ด๋ป๊ฒ ๊ฒฐํฉ๋ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋จ๊ณ์ด๋ค.
Flutter๋ ๋ ์ด์ด ํธ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๋ ์ด์ด๋ค์ด ์ด๋ป๊ฒ ๊ฒฐํฉ๋ ์ง๋ฅผ ํจ์จ์ ์ผ๋ก ๊ณ์ฐํด ํ๋ฉด์ ํ์ํ ์ต์ข
์ฝํ
์ธ (๊ฒฐํฉ๋ ๋ ์ด์ด ๋๋ ๋ ๋๋ง ๊ฒฐ๊ณผ)๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. ์ด ๊ณผ์ ์์ ์ฌ๋ฌ ์์๋ค์ GPU๊ฐ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ต์ ํ๋ ๋ฐ์ดํฐ๋ก ๋ณํ์ํจ๋ค.
7. Rasterize
๋ง์ง๋ง 7๋ฒ ์งธ ๋จ๊ณ๋ก GPU๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์ ํ๋ฉด์ ํฝ์
๋ก ๋ณํํ๋ ๋จ๊ณ์ด๋ค.
์ปดํฌ์ง์
๋ ์์๋ค์ ์ค์ ํ๋ฉด์ ๊ทธ๋ ค์ง๊ธฐ ์ํด GPU๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ํฝ์
๋จ์๋ก ๋ณํ๋๋๋ฐ, ์ฃผ๋ก Skia, Impeller ์์ง์ด ์ด ์์
์ ์ํํ๊ฒ ๋๋ฉฐ ํฝ์
๋ฐ์ดํฐ๋ฅผ GPU์ ๋ณด๋ด ํ๋ฉด์ ์ถ๋ ฅ๋๋๋ก ํ๋ค.
์ฆ, Flutter์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ(Pipeline)์ ์ฌ์ฉ์ ์ ๋ ฅ(User input)์ ์ฒ๋ฆฌํ๊ณ ์ ๋๋ฉ์ด์ (Animation)์ ์ ๋ฐ์ดํธํ ํ, ์์ ฏ ํธ๋ฆฌ๋ฅผ ๋น๋(Build)ํ์ฌ ๋ ์ด์์(Layout)์ ๊ฒฐ์ ํ๊ณ , ์๊ฐ์ ์์๋ฅผ ๊ทธ๋ฆด ์ค๋น(Paint)๋ฅผ ํ๋ฉฐ, ๋ ์ด์ด๋ฅผ ๊ตฌ์ฑํ๊ณ (Composition) ์ต์ข ์ ์ผ๋ก GPU๋ฅผ ํตํด ํฝ์ ๋ก ๋ณํํ์ฌ ํ๋ฉด์ ํ์(Rasterize)ํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ๊ฑฐ์น๋ ๊ฒ์ด๋ค.
๊ณต์ ๋ฌธ์์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ(Pipeline)์ ๋ํด์ ๊ฐ ๋จ๊ณ๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ์ํํ๊ณ ์ด๋ค ์ญํ ์ ํ๋์ง์ ๋ํด์ ์ดํด๋ดค๋๋ฐ, ๊ณผ์ ์ด ๋จ์ํ๊ฒ ํํ๋์ด ์์ด ๊ตฌ์ฒด์ ์ด๊ณ ์์ธํ ๋ฉ์ปค๋์ฆ์ ๋ํด์ ์ข ๋ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
Flutter ๋ ๋๋ง ๊ณผ์ ์ ๋ํ ๊ธ์ ์ฐพ์๋ณด๋ฉด ๊ฑฐ์ ๋ชจ๋ ๊ธ์์ ์ฌ์ฉ๋์ด ์ง๊ณ ์๋ Flutter Rendering Pipeline์ ์์ธํ๊ฒ ํํํ ๋ชจํ์ด ์๋ค.
๊ณต์ ๋ฌธ์์์ ์ค๋ช ํ๋ ๋จ์ํ ํ๋ฆ์ ์์ธํ๊ฒ ํํํ๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
์์ Flutter Rendering Pipeline ๋ชจํ์ ํตํด ๋ ๋๋ง ๊ณผ์ ์ ์ข ๋ ์์ธํ ์ดํด๋ณด์.
๋ชจํ์ ๋ณด๋ฉด ์๋จ์ Tree ์์ฑ ๋จ๊ณ๊ฐ ์๊ณ , ๊ทธ ์๋๋ก Rendering Pipeline > Layer Tree > Graphics Pipeline > GPU๋ก ์ด์ด์ง๋ ์ํ์ ์ธ ํ๋ฆ์ด ๋ํ๋๋ค.
์ฌ๊ธฐ์ ์๋ฌธ์ ์ด ํ๋ ์๊ธฐ๋๋ฐ, Flutter๋ ์ 3๊ฐ์ Tree๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ฉฐ, ๊ฐ๊ฐ์ ์ญํ ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํด์ง๋ค.
Widget Tree
Widget Tree๋ Flutter์์ UI๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ค์ ๊ณ์ธต์ ์ผ๋ก ๋์ดํ ํธ๋ฆฌ๊ตฌ์กฐ๋ก, UI๋ฅผ ์ ์ธ์ ์ผ๋ก ์ ์ํ๋ฉฐ, ํ๋ฉด์ ์ด๋ค ์์ ฏ๋ค์ด ๋ํ๋์ผ ํ๋์ง๋ฅผ ํํํ๋ค. ๋ถ๋ณ(immutable)ํ ํน์ฑ์ ์ง๋๊ณ ์์ด, ์ํ๋ ๋ ๋๋ง์ ์ธ๋ถ ์ฌํญ์ ํฌํจ๋์ง ์๋๋ค. ๋์ UI์ ๋ ์ด์์, ์คํ์ผ, ๊ตฌ์กฐ ๋ฑ์ ์ถ์์ ์ผ๋ก ์ ์ํ๋ ์ญํ ์ ํ๋ฉฐ, build ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ์์ฑ๋๊ฑฐ๋ ์ ๋ฐ์ดํธ ๋๋ค.
ํ๋ฉด์ ๋ณํ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ด๋ฅผ ๋ฐ์ํ์ฌ ๋ค์ ๋น๋๋๊ฒ ๋๋ค.
Element Tree
Widget Tree์ ์์ ฏ ์ธ์คํด์ค์ ์ค์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํธ๋ฆฌ๋ก ์์ ฏ์ ์๋ช ์ฃผ๊ธฐ์ ์ํ๋ฅผ ์ ์งํ๋ฉฐ, ํ๋ฉด์ ๊ตฌ์ฒด์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๋ค.
์์ ฏ์ด ๋น๋๋ ๋ ๊ฐ ์์ ฏ์ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ, ์ํ๊ฐ ์๋ ์์ ฏ(Stateful)์ ๊ฒฝ์ฐ ๊ทธ ์ํ๋ ํจ๊ป ๊ด๋ฆฌ๋๋ค. ์ฆ, ์์ ฏ์ด ํ๋ฉด์ ์ด๋ป๊ฒ ์ ์ฉ๋๊ณ ์๋์ง๋ฅผ ์ถ์ ํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค๊ณ ๋ณผ ์ ์๋ค.
Widget Tree๊ฐ ๋น๋๋ ๋ ํจ๊ป ์์ฑ๋๋ฉฐ, ์ดํ ์ํ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ํด๋น ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํ๋ ์ญํ ์ ํ๋ค.
RenderObject Tree
์ค์ ๋ก ํ๋ฉด์ ์์ ฏ์ ๋ฐฐ์นํ๊ณ ๊ทธ๋ฆฌ๋ ์์ ์ ๋ด๋นํ๋ค.
์์ ฏ๋ค์ด ํ๋ฉด์์ ์ฐจ์งํ๋ ๊ณต๊ฐ์ ๊ณ์ฐํ๋ฉฐ, ๋ ์ด์์๊ณผ ํ์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ์ค์ ๋ก ๊ทธ๋ ค์ง ์์น์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋๋ฉฐ, ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ด ์ด ๋จ๊ณ์์ ์ ์ฉ๋๋ค.
Layout ๋จ๊ณ์์ ๊ตฌ์ฑ๋๋ฉฐ, ํ๋ฉด์ ๊ทธ๋ฆด ์ค๋น๋ฅผ ์๋ฃํ ํ Paint ๋จ๊ณ์์ ์ด ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ๋ ๋๋ง ์์ ์ด ์ด๋ฃจ์ด์ง๋ค.
Widget Tree๋ UI์ ๊ตฌ์กฐ์ ๋ ์ด์์์ ์ ์ธ์ ์ผ๋ก ์ ์ํ๋ ์ญํ ์ ์ํํ๊ณ , Element Tree๋ Widget Tree์ UI ์ํ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ค๋ฆฌ ์ญํ ๋ก, ์์ ฏ์ ์ธ์คํด์ค์ ์ํ ๊ด๋ฆฌ ๋ฐ ์์ ฏ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ถ์ ํ๋ค. RenderObject Tree๋ ํ๋ฉด์ ์ค์ ๋ก ๊ทธ๋ ค์ง๋ ๋ถ๋ถ์ ๋ด๋นํ์ฌ ์ด๋ ์์น์, ์ด๋ค ํฌ๊ธฐ๋ก ๋ ๋๋ง ๋์ด์ผ ํ๋์ง ๊ณ์ฐํ๋ ์ญํ ์ ๋ด๋นํ๊ธฐ์ ์ธ ๊ฐ์ง ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ UI๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ์ค์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
๋ค์ ๋ ๋๋ง ๋ชจํ์ ๋ณด๋ฉด, UI Thread์์ Animate > Build > Layout > Paint > Submit์ ์์๋ก ์์ ์ ์ฒ๋ฆฌํ๋ค. ์ด ๊ณผ์ ์์ ์์ ฏ ํธ๋ฆฌ๊ฐ ๋น๋๋๊ณ , ์์น์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋ ํ ํ๋ฉด์ ๊ทธ๋ฆด ์ค๋น๊ฐ ์ด๋ฃจ์ด์ง๊ฒ ๋๋ฉฐ ์ต์ข ์ ์ผ๋ก Layer Tree๋ฅผ ์์ฑํด GPU์ ์ ๋ฌํ๊ฒ ๋๋ค.
Layer Tree๋ ๋ ๋๋ง ์์คํ ์์ ์๊ฐ์ ์์๋ค์ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๊ตฌ์กฐ๋ก, ๊ฐ ๋ ์ด์ด๋ UI ์์์ ๋ ๋๋ง ์ ๋ณด๋ฅผ ํฌํจํ๋ฉฐ, ์ฌ๋ฌ ์์ ฏ์ ๋ ๋๋ง ์ ๋ณด๋ฅผ ํตํฉํ์ฌ GPU์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํ๋ ์ค์ํ ์ญํ ์ ํ๋ค.
GPU Thread๋ UI Thread์์ ์ ๋ฌ๋ฐ์ Layer Tree๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ด ๊ณผ์ ์์ Layer Tree์ ๊ฐ ๋ ์ด์ด๋ฅผ ํฉ์ฑ(Composition)ํ๊ณ ๋์คํฐํ(Rasterize)ํ์ฌ ํ๋ฉด์ ์ด๋ป๊ฒ ๊ทธ๋ฆด์ง๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋๋ค. ์ค์ ๋ก GPU์ ์ง์ ์ํธ์์ฉํ์ง ์์ผ๋ฉฐ, ๋ ๋๋ง ์์๋ฅผ ์ต์ ํ๋ ๋ฐ์ดํฐ๋ก ๋ณํํ์ฌ GL/Vulkan API์ ์ ๋ฌํ๋ค.
์ต์ข ์ ์ผ๋ก GPU๋ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ํฝ์ ์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
* ํฉ์ฑ(Composition) : ์ฌ๋ฌ ๊ฐ์ ๋ ์ด์ด๋ฅผ ํ ์ด๋ฏธ์ง๋ก ๊ฒฐํฉํ๋ ๊ณผ์ . ๊ฐ ๋ ์ด์ด๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ทธ๋ ค์ง๊ณ , ํฉ์ฑ ๋จ๊ณ์์ ์ด๋ค์ ์ฌ๋ฐ๋ฅธ ์์์ ๋ฐฉ์์ผ๋ก ์กฐํฉํ์ฌ ์ต์ข ์ด๋ฏธ์ง๋ฅผ ์์ฑ.
* ๋์คํฐํ(Rasterize) : ํฉ์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ์ค์ ํ๋ฉด์ ํ์ํ ์ ์๋ ํฝ์ ๋ก ๋ณํํ๋ ๊ณผ์ . ๋ฒกํฐ ๊ทธ๋ํฝ์ด๋ ๋์์ธ ์์๋ฅผ ํฝ์ ๋จ์๋ก ๋ฐ๊ฟ์ ํ๋ฉด์ ์ถ๋ ฅ.
* GL/Vulkan API : GL(OpenGL)๊ณผ Vulkan์ GPU์ ์ํธ์์ฉํ๋ ๊ทธ๋ํฝ API. GL(OpenGL)์ ๊ณ ์์ค API๋ก ์ฌ์ฉ์ด ๊ฐํธํ์ง๋ง ์ฑ๋ฅ ์ต์ ํ์ ์ ํ์ด ์๊ณ , Vulkan์ ์ ์์ค API๋ก ๋ ์ธ๋ฐํ ์ ์ด์ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ์ฌ ๋ณต์กํ ๊ทธ๋ํฝ ์์ ์์ ํจ์จ์ ์ผ๋ก CPU์ GPU๋ฅผ ํ์ฉ.
๋ชจํ์ ๋ณด๋ฉด VSync๋ผ๋ ์ด๋ฒคํธ ํ๋ฆ์ด ๋ณด์ด๋๋ฐ, VSync ๋ฌด์์ธ์ง๋ ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
VSync(Vertical Synchronization)๋ ๋์คํ๋ ์ด์ ์ฃผ์ฌ์จ๊ณผ ๊ทธ๋ํฝ ์นด๋์ ํ๋ ์ ๋ ๋๋ง ์๋๋ฅผ ๋๊ธฐํํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค. ์ด ๊ธฐ์ ์ ํ๋ฉด ๊น๋นก์์ด๋ ์คํฌ๋ฆฐ ํ ์ด๋ง(Screen Tearing) ๊ฐ์ ํ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋์ ๋์์ผ๋ฉฐ, Flutter๋ฅผ ํฌํจํ ๋ง์ ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ VSync ์ ํธ๋ ํ๋ ์ ๋ ๋๋ง์ ํ์ด๋ฐ์ ์ ์ดํ๋ ์ค์ํ ์ญํ ์ ํ๋ค.
Flutter์์๋ VSync๋ ํ๋ ์ ๋ ๋๋ง ์ฃผ๊ธฐ๋ฅผ ์ ์ดํ๋ ์ค์ํ ๋ฉ์ปค๋์ฆ์ผ๋ก, ์ ํ๋ ์์ ๊ทธ๋ฆด ํ์ด๋ฐ์ ๊ฒฐ์ ํ๋ฉฐ ์ด ๊ณผ์ ์์ UI ์ ๋ฐ์ดํธ์ ์ ๋๋ฉ์ด์ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
Flutter์ ๋ ๋๋ง ์์ง์ ๋ํด์๋ ๊ฐ๋ณ๊ฒ ์ดํด๋ณด๋๋ก ํ์.
Flutter์์ ์ฌ์ฉํ๋ ๋ ๋๋ง ์์ง์ Skia์ Impeller๊ฐ ์๋ค.
์ Skia๋ฅผ ์ ํํ ๊ฒ์ด๋ฉฐ, ๋ฌด์จ ์ด์๋ค๋ก ์ธํ์ฌ ์๋ก์ด ์์ง์ธ Impeller๋ฅผ ์ ์ฉํ๊ฒ ๋๋๊ฑธ๊น ?
Skia๋ ๊ตฌ๊ธ์์ ๊ฐ๋ฐํ ์คํ์์ค 2D ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ค์ํ ํ๋ซํผ์์ ๊ณ ์ฑ๋ฅ์ ๋ฒกํฐ ๊ทธ๋ํฝ๊ณผ ์ด๋ฏธ์ง ๋ ๋๋ง์ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฏธ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ์๋๋ก์ด๋ ์์คํ ์์ ์ฌ์ฉ๋๊ณ ์์ ๋งํผ ๊ฒ์ฆ๋ ๊ทธ๋ํฝ ์์ง์ผ๋ก ์ ๋ขฐ์ฑ๊ณผ ์ฑ๋ฅ์ด ์ ์ฆ๋ ์์ง์ผ๋ก, Flutter ํ๋ ์์ํฌ๋ ์ฌ๋ฌ ํ๋ซํผ(Android, iOS, Web, Windows, macOS, Linux)์์ ๋์ผํ ์ฝ๋๋ก ๋น๋ํ ์ ์์ด์ผ ํ๋ ํน์ง๊ณผ ์ ๋ถํฉํ์ฌ ์ ํ์ ๋ฐ๊ฒ ๋์๋ค.
์ฃผ๋ก ๋ฒกํฐ ๊ธฐ๋ฐ์ 2D ๊ทธ๋ํฝ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํนํ๋์ด ์์ผ๋ฉฐ, ๋ฒกํฐ ๊ทธ๋ํฝ, ๊ธ๊ผด ๋ ๋๋ง, ๋นํธ๋งต ์ด๋ฏธ์ง๋ฅผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ด ๋ณต์กํ UI ๊ตฌ์ฑ์ ๋์ ์ฑ๋ฅ์ผ๋ก ๋ ๋๋ง ํ ์ ์๋ค. ๋ํ CPU ๊ฐ์์ ์ง์ํ์ฌ ๋ณต์กํ ๊ทธ๋ํฝ ์์ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ฌ ์ค์๊ฐ ๋ ๋๋ง ์ฑ๋ฅ์ ๋์ด๋ ๋ฐ ํฐ ์ญํ ์ ํ๊ณ ์๋ค.
OpenGL๊ณผ Vulkan API์ ๊ฐ์ ๊ทธ๋ํฝ API๋ฅผ ํตํด GPU์ ์ํธ์์ฉํ๋ฉฐ, ๊ทธ๋ํฝ ์ฐ์ฐ์ GPU์ ๋งก๊น์ผ๋ก์จ CPU์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์๊ณ , ํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฐ์ ๋งค์ฐ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๋ค์ํ ํ๋ซํผ์์ ์ฝ๊ฒ ํตํฉํ์ฌ ์ํ๋ ์คํ์ผ์ UI๋ฅผ ๊พธ๋ฐ ์ ์๋ค๋ ํน์ง๋ ๊ฐ์ง๊ณ ์๋ค.
ํ์ง๋ง Skia๋ ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ด๋ ํน์ GPU ์ต์ ํ ์์ ์์ ์ผ๊ด๋ ์ฑ๋ฅ์ ์ ๊ณตํ์ง ๋ชปํด ์ ๋๋ฉ์ด์ ์ด ๋๊ธฐ๊ฑฐ๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ํ, ์ ฐ์ด๋(Shader)๋ฅผ ์ฌ์ฉํ ๋ ํน์ ํ๋ซํผ์์ ํ๋ฉด ์ง์ฐ(Jank)์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ค์ iOS ํ๋ซํผ์์ ์ฃผ๋ก ๋ฐ์ํ๊ฒ ๋๋ฉด์ ์ข์ง ๋ชปํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ๋ฐ์ ์์๋ค.
Impeller ์์ง์ Skia๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ์ต์ ๋ ๋๋ง ์์ง์ด๋ค.
Skia ์์ง์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด Flutter ํ์ด ์ง์ ๋ง์ถคํ์ผ๋ก Flutter์์ ์ต์ ํํ ์ ์๋๋ก ๊ฐ๋ฐํ์๋ค๊ณ ํ๋ค.
Flutter๊ฐ iOS ํ๋ซํผ์์ ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด iOS์ ์ฒ์ ๋์ ํ๊ฒ ๋์๊ณ , Flutter 3.10 ๋ฒ์ ๋ถํฐ ๊ธฐ๋ณธ ๋ ๋๋ง ์์ง์ผ๋ก ์ ์ฉํ๊ฒ ๋์๋ค.
Impeller ์์ง์ GPU ์์์ ๋ ํจ์จ์ ์ผ๋ก ํ์ฉํ๋๋ก ์ค๊ณํ์๊ณ , Metal(iOS)๋ฐ Vulkan(Andoird) ์ ์์ค ๊ทธ๋ํฝ API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถํ์ฌ ๋ ์ธ๋ฐํ ๊ทธ๋ํฝ ์์ ๊ณผ ์ต์ ํ๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋์๋ค.
ํนํ, Skia์ ๋ฌธ์ ๋ก ์๋ ค์ง ์ ฐ์ด๋(Shader) ์ด์๋ฅผ ์ฌ์ ์ ๋ฏธ๋ฆฌ ์ปดํ์ผํ์ฌ Jank ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์ค์๊ฐ ์ ฐ์ด๋ ์ปดํ์ผ ์ง์ฐ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ์๋ค. ๋ค๋ง, ์ ฐ์ด๋๋ฅผ ๋ฏธ๋ฆฌ ์ปดํ์ผํ๊ฒ ๋๋ฉด์ ์ด๊ธฐํ ์ ์ฑ๋ฅ ์ด์๋ ์ฑ ํฌ๊ธฐ ์ฆ๊ฐ ๋ฑ์ ์ฐ๋ ค๊ฐ ์์์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๊ฐ์ํ๋ ์ ฐ์ด๋ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํ ํ์๋ค๊ณ ํ๋ค.
์ด๊ธฐ์๋ iOS ํ๋ซํผ์์๋ง ์ฐ์ ์ ์ฉ๋์์ง๋ง, Android ํ๋ซํผ์์๋ Impeller ์์ง์ ์ฌ์ฉํ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก, ํฌ๋ก์คํ๋ซํผ ์ฑ ๊ฐ๋ฐ์ ์๋ ์ฐ๋งฅ์ธ Flutter์ React Native์ ๋ ๋๋ง ๋ฐฉ์์ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง ๊ฐ๋จํ ์ดํด๋ณด์.
Flutter๋ ์์ฒด ๋ ๋๋ง ์์ง(Skia, Impeller)์ ์ฌ์ฉํ์ฌ, ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ์ง ์๊ณ ์ค์ค๋ก UI๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ๋ซํผ์ ๊ตฌ์ ๋ฐ์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ ๋๋งํ๋ค. ๋ฐ๋ฉด, React Native๋ ๋ค์ดํฐ๋ธ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํด ๊ฐ ํ๋ซํผ์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๊ทธ๋ ๋ค๋ฉด React Native์๋ ์์ฒด ๋ ๋๋ง ์์ง์ด ์๋๊ฑธ๊น? ๊ทธ๋ ๋ค. ์์ฒด ๋ ๋๋ง ์์ง ์์ด ์ฑ์ UI๋ฅผ ๊ตฌ์ฑํ ๋, ๊ฐ ํ๋ซํผ(iOS, Android ๋ฑ)์ ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
React Native๊ฐ ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ JavaScript ์ฝ๋๋ฅผ ํตํด ํ๋ซํผ์ ๋ง๋ ๋ค์ดํฐ๋ธ ๋ทฐ๋ฅผ ํธ์ถํ๊ณ ๋ธ๋ฆฟ์ง(Bridge)๋ฅผ ํตํด JavaScript ์ฝ๋์ ๋ค์ดํฐ๋ธ ์ฝ๋ ์ฌ์ด์ ํต์ ์ ์ฒ๋ฆฌํ๋ค.
์ฌ๊ธฐ์ ๋ธ๋ฆฟ์ง(Bridge)๋ JavaScript์์ ๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๊ณ , ๋ค์ดํฐ๋ธ ์ฝ๋์์ ๊ทธ ์์ฒญ์ ์ฒ๋ฆฌํ ํ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ JavaScript๋ก ๋ค์ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค. ๊ทธ๋ฌ๋ ์ด ํต์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ, JavaScript์ ๋ค์ดํฐ๋ธ ๊ฐ์ ์ํธ์์ฉ์์ ์ฑ๋ฅ ์ ํ๋ ์ง์ฐ์ด ๋ฐ์ํ ์ ์๋ค๊ณ ํ๋ค.
๋ค์ดํฐ๋ธ UI ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด์ ํ๋ซํผ๋ง๋ค UI ์คํ์ผ์ด ๋ค๋ฅผ ์ ์์ด ๋์ผํ UI๋ฅผ ์ ์งํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๊ธฐ๋ ํ๋ค.
์ด์ฒ๋ผ Flutter์ React Native๋ ํฌ๋ก์คํ๋ซํผ ์ฑ ๊ฐ๋ฐ์ด๋ผ๋ ๋์ผํ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ ๋๋ง ๋ฐฉ์์ ํตํด ๊ทธ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์๋ ํฐ ์ฐจ์ด๊ฐ ์๋ค.
โ๏ธ์ฐธ๊ณ ๋ก ์ด ๊ธ์ ๋ ๋๋ง ๋ฐฉ์์ ๊ด์ ์์ ์์ฑ๋ ๊ฒ์ด๋ฉฐ, ํน์ ํ๋ ์์ํฌ๊ฐ ๋ฌด์กฐ๊ฑด ์ฐ์์ ์๋ค๋ ์๋ฏธ๋ ์๋๋ค. ๊ฐ ํ๋ ์์ํฌ๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฅ๋จ์ ์ด ์์ผ๋ฉฐ, ์ฌ์ฉ ๋ชฉ์ ์ ๋ฐ๋ผ ์ ํฉํ ์ ํ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
Flutter์ ๋ ๋๋ง ์๋ฆฌ์ ๊ณผ์ ์ ํตํด ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ํ๋ฉด์ ์ด๋ค ํ๋ฆ์ผ๋ก ๊ทธ๋ ค์ง๋์ง์ ๋ํด์ ๊ธ์ ์์ฑํด ๋ณด์๋ค.
์ธ๋ถ์ ์ผ๋ก๋ ๋ ์์ธํ ๊ณผ์ ๋ค์ด ์๊ณ ์ต๋ํ ๊ธ๋ก ์์ฑํ ์ ์๋ ๋ถ๋ถ๊น์ง๋ง ์์ฑํ์๊ธฐ์ ์ถ๊ฐ์ ์ผ๋ก ๊ณต์ ๋ฌธ์๋ฅผ ์ดํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
Skia, Impeller ๋ ๋๋ง ์์ง์ ๋ํด์๋ ์ถํ ์์ธํ ๋ด์ฉ์ ์์ฑํด ๋ณผ ์์ ์ด๋ค.
์๋ชป๋ ๋ด์ฉ์ด ์๊ฑฐ๋ ์ถ๊ฐ์ ์ผ๋ก ๊ถ๊ธํ์ ๋ถ๋ถ์ ํธํ๊ฒ ๋๊ธ ๋จ๊ฒจ์ฃผ์๋ฉด ํ์ธ ํ ๋ต๋ณ ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค !