๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

UIView์™€ CALayer

์ง„์งœ ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋ฐ›๋Š” ์งˆ๋ฌธ์ธ UIVIew์™€ layer์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”. ์™œ๋ƒํ•˜๋ฉด ์ €๋Ÿฐ ์งˆ๋ฌธ์„ ๋ฐ›์•˜์„ ๋•Œ ๋‹จ ํ•œ ๋ฒˆ๋„ ๋ช…์พŒํ•˜๊ฒŒ ๋‹ต๋ณ€์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ์š”.. 

 

๋ธ”๋กœ๊ทธ๋“ค์„ ๋‘˜๋Ÿฌ๋ณด๋ฉด UIView์•ˆ์— layer๊ฐ€ ์†ํ•ด์ ธ์žˆ๊ณ  ์ด๋Ÿฐ๊ฑด ์ž˜ ์„ค๋ช…๋˜์–ด์žˆ๋Š”๋ฐ, ๊ทผ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์™€๋‹ฟ๋Š” ๊ธ€์ด ์—†์–ด์„œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํŒŒ๋ฉด์„œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

view.layer

๋จผ์ € UIView๊ฐ€ ๊ฐ€์ง€๋Š” ํ”„๋กœํผํ‹ฐ์ธ layer์˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณผ๊ฒŒ์š”.

์˜ค๋Š˜๋„ ๋‹ด๋ฐฑํ•œ ๊ณต์‹๋ฌธ์„œ..ใ…Žใ…Ž ์ผ๋‹จ ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ์ธ Core Animation, Rendering ์„ ์ฒดํฌํ•ด๋‘๊ณ  ๋””ํ…Œ์ผํ•œ ์„ค๋ช…์„ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด์ฃ .

๋””ํ…Œ์ผ ํ•˜๋„ค์š”..ใ…Žใ…Ž ์ผ๋‹จ layer ํ”„๋กœํผํ‹ฐ๋Š” ์ ˆ๋Œ€ nil์ด ๋˜๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. layer ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋Š” layerClass ํ”„๋กœํผํ‹ฐ์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ณ  view๋Š” ์ด ๋ ˆ์ด์–ด์˜ delegate๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ ๋ชจ๋ฅด๋Š” ํ‚ค์›Œ๋“œ๋“ค์ด ๋˜ ๋‚˜์™”์–ด์š”.

 

๋จผ์ € 1) layerClass ํ”„๋กœํผํ‹ฐ๊ฐ€ ์–ด๋–ค ํ”„๋กœํผํ‹ฐ์ธ์ง€ ๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๊ณ , 2) view๊ฐ€ layer์˜ ๋Œ€๋ฆฌ์ž๋ผ๋Š” ๋ง์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™์•„์š”.

 

๊ฒฝ๊ณ ์—๋Š” ์ด๋ ‡๊ฒŒ ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. view๋Š” layer์˜ ๋Œ€๋ฆฌ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ทฐ๊ฐ€ ๋‹ค๋ฅธ CALayer ๊ฐ์ฒด์˜ ๋Œ€๋ฆฌ์ž๊ฐ€ ๋˜๋ฉด ์•ˆ๋˜๊ณ , layer์˜ delegate๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ์ง€ ๋ง๋ผ๊ณ  ํ•˜๋„ค์š”. ์ด๊ฒƒ๋„ ์•„์ง ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์ง€๋งŒ 2๋ฒˆ ๊ถ๊ธˆ์ฆ์— ๋Œ€ํ•œ ํ•ด๋‹ต์„ ์ฐพ์œผ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”?

 

layerClass

๋จผ์ € layer ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค๋Š” layerClass ํ”„๋กœํผํ‹ฐ๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

UIView ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ์ด๋ ‡๊ฒŒ UIView์˜ ํ”„๋กœํผํ‹ฐ ์ค‘์— layerClass๋ผ๋Š” ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์–ด์š”. ์„ค๋ช…์„ ์ฝ์–ด๋ณด๋ฉด ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ layer๋ฅผ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์ฝ”๋“œ๋กœ ์ฐ์–ด๋ณด๋ฉด CALayer๋ผ๋Š” ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋‹ˆ ๋ฌธ์„œ๋ฅผ ๋” ์ž์„ธํžˆ ์ฝ์–ด๋ด์•ผ๊ฒ ๋„ค์š”ใ… 

 

์ค„๋ฐ”๊ฟˆ ์•ˆ๋˜์–ด์žˆ๋Š”๊ฑฐ ๋ถˆํŽธ..

๋ฌธ์„œ๋Š” ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ์žˆ๋Š”๋ฐ์š”, ๋จผ์ € ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋ทฐ์˜ Core Animation layer๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  default๋กœ๋Š” CALayer ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜์ฃ . ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ฉด ๋‹ค๋ฅธ ๋ ˆ์ด์–ด ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํ˜„์žฌ ๋ทฐ๊ฐ€ ํฐ ์Šคํฌ๋กค ์˜์—ญ์— ๋Œ€ํ•ด ํƒ€์ผ๋ง์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ CATiledLayer๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

CATiledLayer์— ๋Œ€ํ•ด์„œ ์งง๊ฒŒ ์ฐพ์•„๋ดค๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ง€๋„ ์•ฑ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ „์ฒด ํ™”๋ฉด์„ ๋‹ค ๊ทธ๋ ค๋†“๊ณ  ์Šคํฌ๋กค ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ปจํ…์ธ ๋ฅผ ํ™”์žฅ์‹ค ํƒ€์ผ์ฒ˜๋Ÿผ ๋„ค๋ชจ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด๋‘๊ณ  ๊ฐ๊ฐ lazyํ•˜๊ฒŒ ๋กœ๋”ฉ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” layer๊ฐ€ CALayer์˜ ์„œ๋ธŒ ํด๋ž˜์Šค์ธ CATiledLayer๋ผ๊ณ  ํ•˜๋„ค์š”. ๊ฒฐ๊ตญ ์–ด๋–ค ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์˜ ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์œผ๋กœ ํ•ด๋‹น ๋ ˆ์ด์–ด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ฒŒ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค๋Š”๊ฑฐ์ฃ .

 

๊ทธ๋ฆฌ๊ณ  ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ทฐ๋ฅผ ์ฒ˜์Œ ๋งŒ๋“ค ๋•Œ ๋ทฐ์— ๋Œ€์‘๋˜๋Š” layer ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ ๋ถˆ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

์ •๋ฆฌ - layerClass

์˜ค์ผ€์ด ๊ทธ๋Ÿผ ์ง€๊ธˆ๊นŒ์ง€ ์•Œ์•„๋ณธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค. 

 

1) UIView๋Š” layer ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

2) layer๋Š” ๋ทฐ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๊ฐ™์ด ๋งŒ๋“ค์–ด์ง€๊ณ  layerClass ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ layer๋ฅผ ์ƒ์„ฑํ• ์ง€ ๊ฒฐ์ •๋œ๋‹ค. 

3) layerClass๋Š” ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ CALayer๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด ์›ํ•˜๋Š” layer๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

view๋Š” layer์˜ delegate

๊ทธ๋Ÿผ ์ด์ œ ๋‘๋ฒˆ์งธ ๊ถ๊ธˆ์ฆ์ด์—ˆ๋˜ view๋Š” layer์˜ delegate๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค!

 

๊ทผ๋ฐ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ผ๋‹จ layer๊ฐ€ ์–ด๋–ค ๋…€์„์ธ์ง€ ๋ถ€ํ„ฐ ์•Œ์•„์•ผํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. layer๋กœ ์ž ์‹œ ๋„˜์–ด๊ฐ”๋‹ค๊ฐ€ ์ด ๋ช…์ œ๋กœ ๋Œ์•„์˜ค๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

 

CALayer

์•„๊นŒ layer์˜ ํƒ€์ž…์ด CALayer์˜€์ฃ ? 

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์ฒ˜์Œ๋งŒ๋‚ฌ๋˜ ์šฉ์–ด์ธ Core Animation๊ณผ rendering๋„ ์ดํ•ดํ•ด๋ณด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ด๋ณด์ž๊ตฌ์š”. 

 

์ผ๋‹จ CALayer์˜ ์ •์˜๋กœ ๋„˜์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ NSObject๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ์œผ๋‹ˆ ์ตœ์ƒ์œ„ ํƒ€์ž…์ด๊ฒ ๋„ค์š”. ์„ค๋ช…์„ ์ฝ์–ด๋ณด๋ฉด CALayer๋Š” ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์˜ ์ปจํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ด๋‹น ์ปจํ…์ธ ๋“ค์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฐ์ฒด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์—ญ์‹œ ์ด๋ฒˆ์—๋„ ์ถ”์ƒ์ ์ด์—์š”..

๋””ํ…Œ์ผํ•œ ์„ค๋ช…์œผ๋กœ ๋„˜์–ด์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

๋จผ์ € ๋ ˆ์ด์–ด๋Š” ์ฃผ๋กœ ๋ทฐ์˜ backing store๋ฅผ ์ œ๊ณตํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ทฐ๊ฐ€ ์—†์ด๋„ ์ปจํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด์˜ ์ฃผ์š”ํ•œ ์ž„๋ฌด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์‹œ๊ฐ์ ์ธ ์ปจํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ๋™์‹œ์— ๋ ˆ์ด์–ด ์Šค์Šค๋กœ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‹œ๊ฐ์ ์ธ ์†์„ฑ๋“ค๋„ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฐฐ๊ฒฝ์ƒ‰์ด๋‚˜ ํ…Œ๋‘๋ฆฌ ๊ด€๋ จ ์†์„ฑ, ๊ทธ๋ฆผ์ž ์†์„ฑ ๊ฐ™์ด์š”.

 

๋ ˆ์ด์–ด์˜ ์ž„๋ฌด๊ฐ€ ์‹œ๊ฐ์ ์ธ ์ปจํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ์š”, ์ด๋ฅผ ์œ„ํ•ด์„œ ๋ ˆ์ด์–ด๋Š” ์ปจํ…์ธ ์˜ ์œ„์น˜, ์‚ฌ์ด์ฆˆ, ๋ณ€ํ˜• ์ •๋ณด๋“ค์„ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ ˆ์ด์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๋“ค์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ฃ . 

 

๋ ˆ์ด์–ด ๊ฐ์ฒด๋Š” ๋ ˆ์ด์–ด์˜ ์†๋„๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ •๋ณด๋ฅผ CAMediaTiming ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์บก์Šํ™”ํ•ด์š”. ์ด ํ”„๋กœํ† ์ฝœ์€ ๋ ˆ์ด์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ์‹œ๊ฐ„์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ฃ . 

 

๋ ˆ์ด์–ด ๊ฐ์ฒด๊ฐ€ ๋ทฐ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฉด, ๋ทฐ๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๋ ˆ์ด์–ด์˜ ๋Œ€๋ฆฌ์ž๋กœ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž๋Š” ์ด ๊ด€๊ณ„๋ฅผ ์ ˆ๋Œ€๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ๋ ˆ์ด์–ด๋ฅผ ๋ทฐ๋ฅผ ํ†ตํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด delegate์— ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•ด์„œ ์›ํ•˜๋Š”๋Œ€๋กœ ๋ ˆ์ด์–ด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ ˆ์ด์–ด๋Š” ๋ ˆ์ด์•„์›ƒ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ layoutManager ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๊ณ  ๋ ˆ์ด์–ด์˜ ํ•˜์œ„ ๋ทฐ๋“ค์„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ •๋ฆฌ - CALayer  

์ƒˆ๋กœ์šด ์ •๋ณด๋“ค์ด ๋ฐ€๋ ค๋“œ๋Š”๋ฐ์š”.. ์ •๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ํ•ด๋ด…์‹œ๋‹ค.

 

1) ๋ ˆ์ด์–ด์˜ ์šฉ๋„๋Š” ์ฃผ๋กœ backing store์ด์ง€๋งŒ ๋ทฐ ์—†์ด ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

2) ๋ ˆ์ด์–ด์˜ ์ฃผ์š”ํ•œ ์—ญํ• ์€ ์‹œ๊ฐ์ ์ธ ์ปจํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ž์ฒด์ ์œผ๋กœ ๋ฐฐ๊ฒฝ์ƒ‰์ด๋‚˜ ํ…Œ๋‘๋ฆฌ ๊ฐ™์€ ์‹œ๊ฐ์ ์ธ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋„ ํ•˜๋‹ค.

3) ๋ ˆ์ด์–ด๋Š” ์ปจํ…์ธ ์˜ ํฌ๊ธฐ, ์œ„์น˜, ๋ณ€ํ˜• ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค. ์ด ๊ฐ’๋“ค์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

4) ๋ทฐ๋Š” ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์ž๋™์œผ๋กœ ์ž๊ธฐ์ž์‹ ์„ ๋ ˆ์ด์–ด์˜ delegate๋กœ ํ• ๋‹นํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ด€๊ณ„๋Š” ์ ˆ๋Œ€๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋œ๋‹ค. 

 

layoutManager๋‚˜ CAMediaTiming ํ”„๋กœํ† ์ฝœ์€ ๋” ๊นŠ๊ฒŒ ๊ฐ€์ง€ ์•Š๊ณ  ์›๋ž˜ ์•Œ๊ณ ์ž ํ–ˆ๋˜ CALayer์™€ view๋Š” layer์˜ delegate์— ์ง‘์ค‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

Core Animation

๋ ˆ์ด์–ด๊ฐ€ backing store๋ผ๋Š” ๋ง๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ , ๋ทฐ์™€์˜ ๊ด€๊ณ„๋„ ํ™•์‹คํžˆ ๋ชจ๋ฅด๊ฒ ์–ด์„œ Core Animation ๋ฌธ์„œ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋„ค์š”. ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ CPU์— ๋ถ€๋‹ด์„ ์ฃผ๊ฑฐ๋‚˜ ์•ฑ์„ ๋Š๋ฆฌ๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ๋†’์€ ํ”„๋ ˆ์ž„๊ณผ ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ทธ๋ ค์ง€๋Š” ๊ฐ ํ”„๋ ˆ์ž„๋“ค์„ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ ๋‹ค ํ•ด์ค€๋‹ค๊ณ  ํ•˜๋„ค์š”.

 

๊ฐœ๋ฐœ์ž๊ฐ€ ํ•  ์ผ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์–ด๋Š ์ง€์ ์—์„œ ์‹œ์ž‘ํ•ด์„œ ์–ด๋Š ์ง€์ ์—์„œ ๋๋‚˜๋Š”์ง€์™€ ๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ ์™ธ์— ๋ชจ๋“  ์ผ๋“ค์€ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ ๋Œ€์‹  ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ Œ๋”๋ง์„ ๊ฐ€์†ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ทธ๋ž˜ํ”ฝ ํ•˜๋“œ์›จ์–ด(GPU๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด๊ฒ ์ฃ !)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

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

 

๊ฐ€์ด๋“œ ๋ฌธ์„œ์—์„œ ๋” ์ž์„ธํžˆ ํ™•์ธํ•˜๋ผ๊ณ  ํ•˜๋‹ˆ ๋“ค์–ด๊ฐ€๋ด…์‹œ๋‹ค.

์ฝ”์–ด์• ๋‹ˆ๋ฉ”์ด์…˜์— ๋Œ€ํ•ด์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ์žˆ๋„ค์š”! ๋ˆˆ์— ๋„๋Š” ๋ฌธ์žฅ์ด ์žˆ๋Š”๋ฐ, ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์•ฑ์˜ ๋ทฐ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋ทฐ๊ฐ€ ๊ฐ€์ง„ ์ปจํ…์ธ ์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋” ์ข‹์€ ์„ฑ๋Šฅ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ด๋ผ๊ณ  ํ•ด์š”. 

์™œ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋Š”์ง€๋„ ๋‚˜์™€์žˆ๋Š”๋ฐ์š”, ๋ ˆ์ด์–ด๋Š” ํšจ๊ณผ์ ์œผ๋กœ ๋ทฐ์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ณ  ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๊ฑฐ๋‚˜, ์ง์ ‘ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜, ๋ฆฌ์Šคํฐ๋” ์ฒด์ธ์— ์ฐธ์—ฌํ•˜๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•ด์š”. ๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ ‰์…˜์€ ํ•ญ์ƒ ๋ทฐ๋กœ ๋ฐ›์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ ์–ด๋„ ํ•œ ๊ฐœ ์ด์ƒ์˜ ๋ทฐ๊ฐ€ ํ•„์š”ํ•œ๊ฑฐ์ฃ .

 

๊ณ„์†ํ•ด๋ณด๋ฉด, ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋ทฐ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปจํ…์ธ ๋“ค์„ ๋น„ํŠธ๋งต์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์บ์‹ฑํ•˜๊ณ , ๋น„ํŠธ๋งต์ด๊ธฐ ๋•Œ๋ฌธ์— GPU์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. 

 

์•„ํ•˜! ์•„๊นŒ backing store๊ฐ€ ๋ง์ด ์ปจํ…์ธ ๋ฅผ ์บ์‹ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜€๊ตฐ์š”! ๊ทธ๋ฆฌ๊ณ  GPU๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปจํ…์ธ ๋ฅผ ๋น„ํŠธ๋งต์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ตฌ์š”. 

 

์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์ด ๋“ค๊ฒ ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ์ €ํฌ๊ฐ€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•  ๋ฟ์ด์ง€ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๋” ์ฝ์–ด๋ณผ๊ฒŒ์š”!

 

์šฐ๋ฆฌ๋Š” ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์•ฑ์˜ ๋ทฐ๋‚˜ ์‹œ๊ฐ์ ์ธ ๊ฐ์ฒด๋“ค์˜ ๋ณ€๊ฒฝ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์š”. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ณ€๊ฒฝ์€ ๋Œ€๋ถ€๋ถ„ ์‹œ๊ฐ์ ์ธ ์š”์†Œ๋“ค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋ทฐ์˜ ์œ„์น˜, ํฌ๊ธฐ, ํˆฌ๋ช…๋„๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•  ๋•Œ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ธฐ์กด ๊ฐ’๊ณผ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

๋งŒํ™” ์•ฑ์ฒ˜๋Ÿผ 1์ดˆ์— ์ปจํ…์ธ ๋ฅผ 60๋ฒˆ ๋ณ€๊ฒฝํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์ฝ”์–ด์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ํ•ฉํ•˜์ง€ ์•Š์•„์š”. ๋Œ€์‹  ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ทฐ๋ฅผ ํ™”๋ฉด ๋‚ด์—์„œ ์ด๋™์‹œํ‚ค๊ฑฐ๋‚˜ ํŽ˜์ด๋“œ ์•„์›ƒ/์ธ ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ . 

 

์ผ๋‹จ ๋ทฐ์˜ ์‹œ๊ฐ์ ์ธ ์š”์†Œ๋“ค์„ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ๋•Œ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ ์šฉํ• ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ ๋ ˆ์ด์–ด์—์„œ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด์—์š”. 

 

๋ ˆ์ด์–ด๋“ค์€ ๋Œ€๋ถ€๋ถ„ ์‹ค์ œ๋กœ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์ผ์„ ๋‹ด๋‹นํ•˜์ง€๋Š” ์•Š์•„์š”. ๋Œ€์‹  ์•„๊นŒ ์„ค๋ช…ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ์ปจํ…์ธ ๋“ค์„ ์บก์ณํ•˜๊ณ  ์ด๊ฑธ ๋น„ํŠธ๋งต์œผ๋กœ ๋งŒ๋“ค์–ด์„œ backing store์— ์บ์‹ฑํ•ด๋‘์ฃ . 

 

๋งŒ์•ฝ ๋ ˆ์ด์–ด๊ฐ€ ๊ฐ€์ง„ ํ”„๋กœํผํ‹ฐ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ๋ ˆ์ด์–ด ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ณ€๊ฒฝ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋˜๋ฉด ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ํ•ด๋‹น ๋ ˆ์ด์–ด์˜ ๋น„ํŠธ๋งต๊ณผ ์ƒํƒœ์ •๋ณด๋ฅผ GPU์— ๋ณด๋‚ด๊ณ , GPU๊ฐ€ ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ์ƒˆ๋กœ์šด ๋น„ํŠธ๋งต์„ ๊ทธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ๊ทธ๋ฆผ์ด ์ œ๊ณต๋˜์–ด ์žˆ๋Š”๋ฐ์š”, ์•ฑ์— ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง€๋ฉด ๋ ˆ์ด์–ด์˜ backing store์— ๋น„ํŠธ๋งต์œผ๋กœ ์บ์‹ฑ๋˜๊ณ , ๊ทธ๋ฆผ์„ ํšŒ์ „์‹œํ‚ค๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‹œ์ž‘๋˜๋ฉด ๋น„ํŠธ๋งต๊ณผ ์ƒํƒœ์ •๋ณด๊ฐ€ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ GPU๋กœ ๋„˜์–ด๊ฐ€ GPU๋Š” ์ƒˆ๋กญ๊ฒŒ ๋น„ํŠธ๋งต์„ ๊ทธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋น„ํŠธ๋งต์ด ๋‹ค์‹œ ๋ทฐ๊ฐ€ ๋˜์–ด์„œ ์•ฑ์— ๋ณด์—ฌ์ง€๊ฒŒ ๋˜๋Š”๊ฑฐ์ฃ .

๋น„ํŠธ๋งต์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์ €ํฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋ทฐ์—์„œ ์ปจํ…์ธ ๊ฐ€ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒ ์ฃ ?

 

๋ทฐ์—์„œ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆด ๋•Œ๋Š” draw(rect:) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”, ์ด๋•Œ ์ƒˆ๋กญ๊ฒŒ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋น„ํŠธ๋งต์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— GPU์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์ด ๋•Œ๋ฌธ์— ๋ทฐ์—์„œ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋น„์šฉ์ด ๋” ์ ๊ฒŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ •๋ฆฌ - Core Animation

์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์— ๋Œ€ํ•ด์„œ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์€ ์žกํžŒ ๊ฒƒ ๊ฐ™์•„์„œ ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ณผ๊ฒŒ์š”.

 

1) ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํ•˜๋Š” ์ผ์€ ์ปจํ…์ธ ์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ 

2) backing store์— ๋ทฐ์˜ ์ปจํ…์ธ ๋ฅผ ๋น„ํŠธ๋งต์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์บ์‹ฑํ•œ๋‹ค.

3) ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์บ์‹ฑํ•ด๋‘” ๋น„ํŠธ๋งต๊ณผ ์ƒํƒœ๋ฅผ GPU์— ์ „๋‹ฌํ•˜๊ณ  GPU๊ฐ€ ์ƒˆ๋กœ์šด ๋น„ํŠธ๋งต์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

4) view์—์„œ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๋ฉ”์ธ์Šค๋ ˆ๋“œ์—์„œ CPU๋กœ draw ๋ฉ”์„œ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์ด ํฌ์ง€๋งŒ layer๋Š” GPU๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์ด ํฌ์ง€ ์•Š๋‹ค. 

 

 

๊ทธ๋ž˜์„œ view๋ž‘ layer๋ž‘ ๋ฌด์Šจ ๊ด€๊ณ„๋ƒ๊ตฌ..

ํœด ์ด์ œ ์ง„์งœ ๋งˆ์ง€๋ง‰์œผ๋กœ view ๋ž‘ layer์˜ ๊ด€๊ณ„, delegate๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ ˆ์ด์–ด์— ์ปจํ…์ธ ๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•˜๊ฒŒ ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž๋ฃŒ๊ฐ€ ์žˆ์–ด์„œ ํ•œ๋ฒˆ ์ฝ์–ด๋ณผ๊ฒŒ์š”.

 

์–ด์จŒ๋“  ์‹ค์ œ๋กœ ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋Š”๊ฑด ์•ฑ์˜ ํ™”๋ฉด์ด๊ณ  ๋ ˆ์ด์–ด๋Š” ์ด ์ปจํ…์ธ ๋ฅผ ๋น„ํŠธ๋งต์œผ๋กœ ๊ฐ€์ ธ์•ผ ํ•˜์ฃ . ๋ ˆ์ด์–ด์— ๋น„ํŠธ๋งต์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

1) ๋ ˆ์ด์–ด ๊ฐ์ฒด์˜ contents ํ”„๋กœํผํ‹ฐ์— ์ด๋ฏธ์ง€ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค. ๋งŒ์•ฝ ๋ ˆ์ด์–ด๊ฐ€ ๊ฐ€์ง„ ์ปจํ…์ธ ๊ฐ€ ๋ฐ”๋€” ์ผ์ด ๋ณ„๋กœ ์—†์œผ๋ฉด ์ด ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ํ•˜๋„ค์š”.

2) ๋“œ๋””์–ด... ๋ ˆ์ด์–ด์— delegate ๊ฐ์ฒด๋ฅผ ์ฃผ์–ด์„œ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋ ˆ์ด์–ด์˜ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ ˆ์ด์–ด์˜ ์ปจํ…์ธ ๋“ค์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ”๋€Œ๊ณ  ๋ทฐ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๊ฐ์ฒด์—์„œ ์ปจํ…์ธ ๊ฐ€ ์ œ๊ณต๋  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

3) ๋ ˆ์ด์–ด์˜ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ ˆ์ด์–ด์˜ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๋ทฐ์— ๋ ˆ์ด์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฐ ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™์ ์œผ๋กœ ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋„ค์š”.

 

์ผ๋‹จ ์ €ํฌ๊ฐ€ ๊ถ๊ธˆํ•ดํ•˜๋Š”๊ฒŒ 2๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด๋‹ˆ๊นŒ ํ•ด๋‹น ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์„ ํ™•์ธํ•ด๋ณผ๊ฒŒ์š”.

 

๋งŒ์•ฝ ๋ ˆ์ด์–ด์˜ ์ปจํ…์ธ ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€๋‹ค๋ฉด ์ปจํ…์ธ ๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ delegate๋กœ ๋งŒ๋“ค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์— display๋˜๋Š” ์‹œ์ ์— ๋ ˆ์ด์–ด๋Š” ์ƒˆ๋กœ์šด ์ปจํ…์ธ ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ํ•ด์š”.

 

1) ๋งŒ์•ฝ delegate์˜ display(layer:) ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉด, ์ด ๊ตฌํ˜„์€ ๋น„ํŠธ๋งต์„ ์ƒ์„ฑํ•ด์„œ ๋ ˆ์ด์–ด์˜ contents ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

2) ๋งŒ์•ฝ delegate์˜ draw(layer: inContext:) ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉด ์ฝ”์–ด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋น„ํŠธ๋งต์„ ์ƒ์„ฑํ•˜๊ณ  ๋น„ํŠธ๋งต์— ๊ทธ๋ฆด ๋‚ด์šฉ(graphics context)๋“ค์„ ์ƒ์„ฑํ•œ ๋’ค์— ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋น„ํŠธ๋งต์„ ์ฑ„์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ์—์„œ ๊ตฌํ˜„ํ•ด์•ผํ•  ๋‚ด์šฉ์€ ์ „๋‹ฌ๋ฐ›์€ graphics context์— ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด์ฃ .

Delegate ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ ๋‘ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ด์š”. ๋งŒ์•ฝ ๋‘˜ ๋‹ค ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค๋ฉด display(layer:)๋ฉ”์„œ๋“œ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ด delegate๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋Š”๋ฐ์š”, 

 

์•ฑ์ด ๋ ˆ์ด์–ด์™€ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค๊ณ  ์„ค๋ช…ํ•˜๊ณ  ์žˆ๊ณ ,

 

์—ฌ๊ธฐ์„œ๋„ ๋˜‘๊ฐ™์ด ๋ ˆ์ด์–ด์˜ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ, ํ•˜์œ„ ๋ ˆ์ด์–ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๊ทธ๋ฆฌ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๊ณ  ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ๋ ˆ์ด์–ด ๊ฐ์ฒด์˜ delegate์— ํ• ๋‹น์ด ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ, UIView๊ฐ€ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

 

์—ญ์‹œ๋‚˜! ์ฑ„ํƒํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ ์•„์‰ฝ๊ฒŒ๋„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์—†๋„ค์š”ใ… 

 

 

์•„๋‹ˆ ๊ทธ๋ž˜์„œ ํ™”๋ฉด์€ ๋ˆ„๊ฐ€ ๊ทธ๋ฆฌ๋ƒ๊ณ ..

์ž ๊ทธ๋Ÿผ ์ด์ฏค์—์„œ ๋“œ๋Š” ์˜๋ฌธ.. ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Core Animation์ด ๋น„ํŠธ๋งต์œผ๋กœ ํ•˜๋Š”๊ฑฐ ์•Œ๊ฒ ๋Š”๋ฐ ๊ทธ๋ƒฅ ํ™”๋ฉด์€ ๋ˆ„๊ฐ€ ๊ทธ๋ฆฌ๋Š”๊ฑด๋ฐ??

์ด๋ฒˆ์—” View Programming Guide๋ฅผ ์—ด์–ด๋ดค์–ด์š”. ์•ˆ์— ์ด๋Ÿฐ ๋‚ด์šฉ์ด ์žˆ๋”๋ผ๊ตฌ์š”. ์ผ๋‹จ ๊ฐ ๋ทฐ๋“ค์€ ์ž์‹ ๊ณผ ๋Œ€์‘๋˜๋Š” ๋ ˆ์ด์–ด๋“ค์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ ˆ์ด์–ด๋“ค์€ layer ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ฃ . ๊ทธ๋ฆฌ๊ณ  ์ด ๋ ˆ์ด์–ด์—์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๋น„ํŠธ๋“ค์ด ์‹ค์ œ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋ž˜์„œ view์—์„œ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์ฝ”๋“œ๋Š” ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ํ˜ธ์ถœ๋˜์–ด์š”. ์™œ๋ƒํ•˜๋ฉด Core Animation์—์„œ ์บ์‹ฑํ•ด๋‘” ๋น„ํŠธ๋งต์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๋ฉด ๋˜๋‹ˆ๊นŒ์š”. 

 

์ด์ œ ํผ์ฆ์ด ๋งž์ถฐ์ง€๋„ค์š”! 

 

์•„๊นŒ delegate์—์„œ ๊ตฌํ˜„ํ•ด์•ผํ•  ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์ด ๋ ˆ์ด์–ด์— ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ์š”, ํ™”๋ฉด์— ๋ณ€๊ฒฝ์ด ์žˆ๊ฑฐ๋‚˜ ์ฒ˜์Œ ๊ทธ๋ ค์งˆ ๋•Œ view์—์„œ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ณ , delegate ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ CALayer์— ์ปจํ…์ธ ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ CALayer๋Š” ์ด ์ปจํ…์ธ ๋ฅผ ์บ์‹ฑํ•ด๋‘๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ฃ . ๊ทธ๋ž˜์„œ ๋งค๋ฒˆ ๋ทฐ์˜ ์ปจํ…์ธ ๋“ค์„ ์ƒˆ๋กœ ๊ทธ๋ ค์ค„ ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด ์ •๋ฆฌ 

1) UIView๋Š” layer ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

2) layer ํ”„๋กœํผํ‹ฐ๋Š” layerClass ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์— ์˜ํ•ด ์–ด๋–ค ๋ ˆ์ด์–ด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ์ง€ ๊ฒฐ์ •๋œ๋‹ค.

3) UIView๋Š” CALayerDelegate๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค.

4) ์ฑ„ํƒํ•œ Delegate์˜ display๋‚˜ draw ๋ฉ”์„œ๋“œ๊ฐ€ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ์‹œ์ ์— ํ˜ธ์ถœ๋œ๋‹ค.

5) ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ปจํ…์ธ ๋ฅผ layer์— ์ œ๊ณตํ•œ๋‹ค.

6) ๋ ˆ์ด์–ด๋Š” ์ด ์ปจํ…์ธ ๋ฅผ ๋น„ํŠธ๋งต์œผ๋กœ ์บ์‹ฑํ•ด์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋‹ค.

7) ๋ทฐ๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์ง€๊ฑฐ๋‚˜, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด GPU๋ฅผ ํ†ตํ•ด ์บ์‹ฑ๋œ ๋น„ํŠธ๋งต์„ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ๋น„ํŠธ๋งต์„๋งŒ๋“ ๋‹ค.

 

๋งˆ๋ฌด๋ฆฌ

์‚ฌ์‹ค ์™„๋ฒฝํ•œ ์ •๋ณด์ธ์ง€ ํ™•์‹ ์ด ์—†๊ธดํ•ด์š”..! ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๋กœ ํฌ์ŠคํŒ…์„ ํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ์กฐ๊ธˆ ๊ฑฑ์ •์€ ๋ฉ๋‹ˆ๋‹คใ… . ๋งŽ์€ ๋ธ”๋กœ๊ทธ์—์„œ ์‹ค์ œ๋กœ UIView์—์„œ๋Š” ํ™”๋ฉด์„ ๊ทธ๋ฆฌ์ง€ ์•Š๊ณ  CALayer์—์„œ ๋ชจ๋“ ๊ฑธ ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•˜๊ณค ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿผ "CPU๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™”๋ฉด์„ ๊ทธ๋ฆฐ๋‹ค"๋ผ๋Š” ๋ง์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์•„์„œ์š”.. ๊ทธ๋ฆฌ๊ณ  ์บ์‹ฑ๋œ ๋น„ํŠธ๋งต์„ ์–ด๋–ป๊ฒŒ ์ด์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ถ€๋ถ„..! CALayer์— ๋Œ€ํ•ด์„œ ์ž˜ ์ •๋ฆฌ๋œ ์ž๋ฃŒ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ดํ•ดํ•˜๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด ๋„์™€์ฃผ์„ธ์š”!

 

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํƒ€๊ณ ํƒ€๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋ผ์„œ ๋ˆ„๋ฝ๋œ ์ •๋ณด๋“ค์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์–ด์š”. ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ €๋„ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์„œ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~!

 

๋ž˜ํผ๋Ÿฐ์Šค

https://developer.apple.com/documentation/uikit/uiview/1622436-layer

https://developer.apple.com/documentation/uikit/uiview/1622626-layerclass

https://developer.apple.com/documentation/uikit/uiview

https://developer.apple.com/documentation/quartzcore/calayer

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimationBasics/CoreAnimationBasics.html#//apple_ref/doc/uid/TP40004514-CH2-SW3

https://developer.apple.com/documentation/quartzcore/calayerdelegate

https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW9