๐Ÿš€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”: 60fps ๋‹ฌ์„ฑํ•˜๊ธฐ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”: 60fps ๋‹ฌ์„ฑํ•˜๊ธฐ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ํŠนํžˆ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๋ฐ”๋กœ ๊ทธ ๊ฟˆ์˜ ์ˆซ์ž, 60fps(์ดˆ๋‹น 60ํ”„๋ ˆ์ž„)๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿ˜Ž

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ๊ฒฝํ—˜ ํ•ด๋ณด์‹  ์  ์žˆ๋‚˜์š”? ๊ทธ๋Ÿด ๋•Œ๋งˆ๋‹ค '์•„ ์งœ์ฆ๋‚˜...' ํ•˜๋ฉด์„œ ์•ฑ์„ ์ง€์›Œ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ์ถฉ๋™์ด ๋“œ์‹œ์ฃ ? ใ…‹ใ…‹ใ…‹ ๋„ค, ๋งž์•„์š”. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์—์„œ ์„ฑ๋Šฅ์€ ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

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

์ด ๊ธ€์„ ๋‹ค ์ฝ๊ณ  ๋‚˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๋‹ฌ์ธ์ด ๋  ๊ฑฐ์˜ˆ์š”! ์–ด์ฉŒ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋ ์ง€๋„ ๋ชจ๋ฅด์ฃ . ๊ทธ๋Ÿผ ๋‚˜์ค‘์— ์žฌ๋Šฅ๋„ท์—์„œ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€๋กœ ํ™œ๋™ํ•  ์ˆ˜ ์žˆ์„์ง€๋„...? ๐Ÿ˜‰

์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๋ฒจํŠธ ๋งค์„ธ์š”, ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๋ถ€ํ„ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋“ค ๊ฑฐ์˜ˆ์š”!

๐Ÿค” 60fps๊ฐ€ ๋ญ๊ธธ๋ž˜? ์™œ ์ค‘์š”ํ•œ ๊ฑธ๊นŒ?

๋จผ์ €, 60fps๊ฐ€ ๋ญ”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? FPS๋Š” 'Frames Per Second'์˜ ์•ฝ์ž๋กœ, ์ดˆ๋‹น ํ™”๋ฉด์ด ๋ช‡ ๋ฒˆ ๊ฐฑ์‹ ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹จ์œ„์˜ˆ์š”. 60fps๋ผ๋Š” ๊ฑด 1์ดˆ์— 60๋ฒˆ ํ™”๋ฉด์ด ๋ฐ”๋€๋‹ค๋Š” ๋œป์ด์ฃ .

์ธ๊ฐ„์˜ ๋ˆˆ์€ ๋Œ€๋žต ์ดˆ๋‹น 10-12 ํ”„๋ ˆ์ž„ ์ •๋„์˜ ๋ณ€ํ™”๋ฅผ ์—ฐ์†๋œ ๋™์ž‘์œผ๋กœ ์ธ์‹ํ•œ๋‹ค๊ณ  ํ•ด์š”. ๊ทธ๋Ÿฐ๋ฐ ์™œ 60fps๋ฅผ ๋ชฉํ‘œ๋กœ ํ• ๊นŒ์š”?

60fps์˜ ๋งˆ๋ฒ• โœจ

  • ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜: 60fps์—์„œ๋Š” ๋ชจ๋“  ๋™์ž‘์ด ๋ฌผ ํ๋ฅด๋“ฏ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์š”.
  • ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋” ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฐฐํ„ฐ๋ฆฌ ํšจ์œจ: ์ผ์ •ํ•œ ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ๋Š” ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ๋ฅผ ์ค„์—ฌ์ค˜์š”.
  • ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„ ์ƒ์Šน: ๋ถ€๋“œ๋Ÿฌ์šด ์•ฑ์€ ์‚ฌ์šฉ์ž๋ฅผ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์š”! ๐Ÿ˜Š

์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ์ข‹์•„ํ•˜๋Š” ๊ฒŒ์ž„์„ ํ”Œ๋ ˆ์ดํ•  ๋•Œ, ํ™”๋ฉด์ด ๋š๋š ๋Š๊ธฐ๋ฉด ์–ด๋–ค ๊ธฐ๋ถ„์ด ๋“ค๊นŒ์š”? '์•„ ์ง„์งœ X๋๋‹ค...'๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ๋„ค, ๋งž์•„์š”. ์•ฑ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”!

60fps๋Š” ๋‹จ์ˆœํžˆ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฒฝํ—˜์„ ์„ ์‚ฌํ•˜๋Š” ๋งˆ๋ฒ•์˜ ์ˆซ์ž์˜ˆ์š”. ์ด๊ฑธ ๋‹ฌ์„ฑํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์€ ๊ทธ์•ผ๋ง๋กœ '๊ฐ“๊ฒœ'์ด ๋˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿ‘‘

60fps vs 30fps ๋น„๊ต 60fps 30fps

์œ„์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ณด์„ธ์š”. ์™ผ์ชฝ์˜ ๋…น์ƒ‰ ์›์ด 60fps, ์˜ค๋ฅธ์ชฝ์˜ ์ฃผํ™ฉ์ƒ‰ ์›์ด 30fps๋ฅผ ๋‚˜ํƒ€๋‚ด์š”. ์ฐจ์ด๊ฐ€ ๋ณด์ด์‹œ๋‚˜์š”? 60fps๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์›€์ง์ด๋Š”์ง€ ๋Š๊ปด์ง€์‹œ์ฃ ? ๐Ÿ˜ฎ

์ž, ์ด์ œ 60fps์˜ ์ค‘์š”์„ฑ์„ ์•„์…จ์œผ๋‹ˆ, ์–ด๋–ป๊ฒŒ ์ด๊ฑธ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ๊ฐœ๋ฐœ๋œ ์•ฑ์—์„œ 60fps๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฑด ์‰ฝ์ง€ ์•Š์•„์š”. ํ•˜์ง€๋งŒ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฑด ์•„๋‹ˆ์ฃ ! ์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ๋…ธ๋ ฅํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๐Ÿ’ช

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿ” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ๋“ค

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ๋“ค์„ ์‚ดํŽด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด๊ฑธ ์ดํ•ดํ•ด์•ผ ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ ์˜ํ–ฅ ์š”์†Œ ๐ŸŽฏ

  1. JavaScript ์Šค๋ ˆ๋“œ
  2. ๋„ค์ดํ‹ฐ๋ธŒ UI ์Šค๋ ˆ๋“œ
  3. ๋ธŒ๋ฆฟ์ง€
  4. ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค
  5. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

1. JavaScript ์Šค๋ ˆ๋“œ ๐Ÿงต

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์—์„œ JavaScript๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋ผ์š”. ์ด ์Šค๋ ˆ๋“œ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์ƒํƒœ ๊ด€๋ฆฌ, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋“ฑ์ด ์ด๋ฃจ์–ด์ ธ์š”.

JavaScript ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ฐ”์˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋„ค, ๋งž์•„์š”. ์•ฑ์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•˜์ฃ . ๋งˆ์น˜ ๊ณผ์ œ ๋งˆ๊ฐ ์ง์ „์˜ ์—ฌ๋Ÿฌ๋ถ„์ฒ˜๋Ÿผ์š”! ใ…‹ใ…‹ใ…‹

JavaScript ์Šค๋ ˆ๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•:

  • ๋ณต์žกํ•œ ์—ฐ์‚ฐ์€ ์›น ์›Œ์ปค๋กœ ์˜ฎ๊ธฐ๊ธฐ
  • ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ค„์ด๊ธฐ
  • ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ (์˜ˆ: Redux)

2. ๋„ค์ดํ‹ฐ๋ธŒ UI ์Šค๋ ˆ๋“œ ๐Ÿ–ผ๏ธ

UI ๋ Œ๋”๋ง์€ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฃจ์–ด์ ธ์š”. ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ”์˜๋ฉด ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง€์—ฐ๋˜๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด ๋ฐœ์ƒํ•ด์š”.

ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด ๋ญ๋ƒ๊ณ ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ํ™”๋ฉด์ด ๋š๋š ๋Š๊ธฐ๋Š” ํ˜„์ƒ์ด์—์š”. ๋งˆ์น˜ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ์คŒ ์ˆ˜์—…์ฒ˜๋Ÿผ์š”! ๐Ÿ˜…

๋„ค์ดํ‹ฐ๋ธŒ UI ์Šค๋ ˆ๋“œ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•:

  • ๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ
  • ํ™”๋ฉด ๋ฐ– ์š”์†Œ ๋ Œ๋”๋ง ์ตœ์†Œํ™”ํ•˜๊ธฐ
  • ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ์‚ฌ์šฉํ•˜๊ธฐ

3. ๋ธŒ๋ฆฟ์ง€ ๐ŸŒ‰

๋ธŒ๋ฆฟ์ง€๋Š” JavaScript ์Šค๋ ˆ๋“œ์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•ด์š”. ์ด ํ†ต์‹ ์ด ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•˜๊ฑฐ๋‚˜ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉด ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์–ด์š”.

๋ธŒ๋ฆฟ์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ๋งˆ์น˜ ์„œ์šธ๊ณผ ๋ถ€์‚ฐ์„ ์˜ค๊ฐ€๋Š” KTX ๊ฐ™์€ ๊ฑฐ์˜ˆ์š”. ๋„ˆ๋ฌด ์ž์ฃผ, ๋„ˆ๋ฌด ๋งŽ์€ ์‚ฌ๋žŒ์ด ์˜ค๊ฐ€๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋„ค, ํ˜ผ์žกํ•ด์ง€๊ฒ ์ฃ !

๋ธŒ๋ฆฟ์ง€ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•:

  • ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋ฆฟ์ง€ ํ†ต์‹  ์ค„์ด๊ธฐ
  • ํฐ ๋ฐ์ดํ„ฐ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ
  • ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ํ™œ์šฉํ•˜๊ธฐ

4. ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค ๐ŸŽจ

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๋Š” ๋ณต์žกํ•ด์š”. Virtual DOM, ๋„ค์ดํ‹ฐ๋ธŒ ๋ทฐ ์ƒ์„ฑ, ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ ๋“ฑ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜์ฃ .

์ด ๊ณผ์ •์„ ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ๋งˆ์น˜ ๋ ˆ๊ณ ๋กœ ๊ฑฐ๋Œ€ํ•œ ์„ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ธ”๋ก ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜์ฃ !

๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค ์ตœ์ ํ™” ๋ฐฉ๋ฒ•:

  • ์ปดํฌ๋„ŒํŠธ ์ตœ์ ํ™” (React.memo, useCallback ๋“ฑ ํ™œ์šฉ)
  • ํ”Œ๋žซ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉํ•˜๊ธฐ
  • ๋ Œ๋”๋ง ๋กœ์ง ๊ฐ„์†Œํ™”ํ•˜๊ธฐ

5. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๐Ÿ’พ

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋„ ์ค‘์š”ํ•ด์š”. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•ฑ์ด ์ ์  ๋Š๋ ค์ง€๊ณ , ์ตœ์•…์˜ ๊ฒฝ์šฐ ํฌ๋ž˜์‹œ๊ฐ€ ๋‚  ์ˆ˜๋„ ์žˆ์–ด์š”.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ๋งˆ์น˜ ๋ฌผ์ด ์ƒˆ๋Š” ์–‘๋™์ด ๊ฐ™์•„์š”. ์กฐ๊ธˆ์”ฉ ์ƒˆ๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ์–‘๋™์ด๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฑฐ์ฃ !

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•:

  • ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ๋‚˜ ๋ณ€์ˆ˜ ์ œ๊ฑฐํ•˜๊ธฐ
  • ํฐ ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ ํ›„ ์ฆ‰์‹œ ํ•ด์ œํ•˜๊ธฐ
  • ์ด๋ฏธ์ง€ ์บ์‹ฑ ํ™œ์šฉํ•˜๊ธฐ

์™€์šฐ! ์ •๋ง ๋งŽ์€ ์š”์†Œ๊ฐ€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ตฐ์š”. ๐Ÿ˜ฎ ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์–ด๋””์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ฒŒ ๋˜์—ˆ์–ด์š”. ์ด๊ฑธ ๋ฐ”ํƒ•์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ์ตœ์ ํ™” ์ „๋žต์„ ์„ธ์šธ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

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

์ž, ์ด์ œ ์ง„์งœ ์‹ค์ „์ด์—์š”! ๋‹ค์Œ ์„น์…˜์—์„œ ๋งŒ๋‚˜์š”~ ๐Ÿš€

๐Ÿ› ๏ธ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์—ฌ๋Ÿฌ๋ถ„, ์ค€๋น„๋˜์…จ๋‚˜์š”? ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๋ถ€ํ„ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿง™โ€โ™‚๏ธโœจ

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต ๐ŸŽฏ

  1. ๋ Œ๋”๋ง ์ตœ์ ํ™”
  2. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
  3. ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™”
  4. ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ํ™œ์šฉ
  5. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™”
  6. ๋””๋ฒ„๊น… ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง

1. ๋ Œ๋”๋ง ์ตœ์ ํ™” ๐Ÿ–ผ๏ธ

๋ Œ๋”๋ง ์ตœ์ ํ™”๋Š” 60fps ๋‹ฌ์„ฑ์„ ์œ„ํ•œ ํ•ต์‹ฌ์ด์—์š”. ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ค„์ด๊ณ , ํšจ์œจ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”.

๋ Œ๋”๋ง์€ ๋งˆ์น˜ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋งค๋ฒˆ ์ „์ฒด ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค, ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ฒ ์ฃ ?

a. React.memo ์‚ฌ์šฉํ•˜๊ธฐ

React.memo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.


const MyComponent = React.memo(function MyComponent(props) {
  /* ๋ Œ๋”๋ง ๋กœ์ง */
});

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์ด์ „์— ๋ Œ๋”๋ง๋œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์š”. ๋งˆ์น˜ ๋ง›์žˆ๋Š” ์Œ์‹์„ ๋ƒ‰๋™์‹ค์— ๋ณด๊ด€ํ–ˆ๋‹ค๊ฐ€ ๋ฐ์›Œ ๋จน๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ใ…‹ใ…‹ใ…‹

b. useCallback๊ณผ useMemo ํ™œ์šฉํ•˜๊ธฐ

useCallback์€ ํ•จ์ˆ˜๋ฅผ, useMemo๋Š” ๊ฐ’์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•ด์š”. ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์žฌ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์ฃ .


const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

์ด๊ฑด ๋งˆ์น˜ ์ˆ˜ํ•™ ๊ณต์‹์„ ์™ธ์šฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋งค๋ฒˆ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์–ตํ•ด๋‘๋ฉด ํ›จ์”ฌ ๋น ๋ฅด์ฃ !

c. VirtualizedList ์‚ฌ์šฉํ•˜๊ธฐ

๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ๋Š” VirtualizedList๋‚˜ FlatList๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋“ค์€ ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•ด์„œ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผœ์š”.


import { FlatList } from 'react-native';

<FlatList
  data={items}
  renderItem={({ item }) => <Item title={item.title} />}
  keyExtractor={item => item.id}
/>

์ด๊ฑด ๋งˆ์น˜ ์ฑ…์„ ์ฝ์„ ๋•Œ ํ˜„์žฌ ํŽ˜์ด์ง€๋งŒ ํŽผ์น˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ํ•œ ๋ฒˆ์— ํŽผ์น  ํ•„์š”๋Š” ์—†์ž–์•„์š”? ๐Ÿ˜‰

2. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๐Ÿ’พ

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณ์š”. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.

a. ํฐ ๊ฐ์ฒด ํ•ด์ œํ•˜๊ธฐ

ํฐ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ์ฆ‰์‹œ ํ•ด์ œํ•ด์ฃผ์„ธ์š”. ํŠนํžˆ ์ด๋ฏธ์ง€๋‚˜ ๋น„๋””์˜ค ๊ฐ™์€ ๋ฏธ๋””์–ด ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ด์š”.


componentWillUnmount() {
  // ํฐ ๊ฐ์ฒด ํ•ด์ œ
  this.largeObject = null;
}

์ด๊ฑด ๋งˆ์น˜ ์‚ฌ์šฉํ•œ ๊ทธ๋ฆ‡์„ ๋ฐ”๋กœ ์„ค๊ฑฐ์ง€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋‚˜์ค‘์— ํ•œ๊บผ๋ฒˆ์— ํ•˜๋ฉด ํž˜๋“ค์ž–์•„์š”? ใ…‹ใ…‹ใ…‹

b. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ๋ชจ๋“  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”.


componentDidMount() {
  this.listener = EventEmitter.addListener('myEvent', this.handleEvent);
}

componentWillUnmount() {
  this.listener.remove();
}

์ด๊ฑด ๋งˆ์น˜ ํŒŒํ‹ฐ๊ฐ€ ๋๋‚˜๊ณ  ์ฒญ์†Œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ชจ๋“  ๊ฑธ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์•ผ ๋‹ค์Œ ํŒŒํ‹ฐ๋„ ์ฆ๊ฒ๊ฒŒ ์—ด ์ˆ˜ ์žˆ์ฃ ! ๐ŸŽ‰

3. ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” ๐ŸŒ

๋„คํŠธ์›Œํฌ ํ†ต์‹ ์€ ์•ฑ์˜ ๋ฐ˜์‘์„ฑ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณ์š”. ํšจ์œจ์ ์ธ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ์€ ์•ฑ์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

a. ๋ฐ์ดํ„ฐ ์บ์‹ฑ

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋กœ์ปฌ์— ์บ์‹ฑํ•ด๋‘์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”.


import AsyncStorage from '@react-native-async-storage/async-storage';

// ๋ฐ์ดํ„ฐ ์ €์žฅ
const storeData = async (key, value) => {
  try {
    await AsyncStorage.setItem(key, JSON.stringify(value));
  } catch (e) {
    console.error('Error saving data', e);
  }
};

// ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
const getData = async (key) => {
  try {
    const value = await AsyncStorage.getItem(key);
    return value != null ? JSON.parse(value) : null;
  } catch (e) {
    console.error('Error reading data', e);
  }
};

์ด๊ฑด ๋งˆ์น˜ ์ž์ฃผ ๊ฐ€๋Š” ์นดํŽ˜์˜ ๋ฉ”๋‰ด๋ฅผ ์™ธ์›Œ๋‘๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋งค๋ฒˆ ๋ฉ”๋‰ดํŒ์„ ๋ณผ ํ•„์š”๊ฐ€ ์—†์ž–์•„์š”? โ˜•

b. ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€๋Š” ์ ์ ˆํ•œ ํฌ๊ธฐ์™€ ํฌ๋งท์œผ๋กœ ์ตœ์ ํ™”ํ•ด์ฃผ์„ธ์š”. ํฐ ์ด๋ฏธ์ง€๋Š” ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ๋Š˜๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์š”.


import FastImage from 'react-native-fast-image';

<FastImage
  style={{ width: 200, height: 200 }}
  source={{
    uri: 'https://unsplash.it/400/400?image=1',
    priority: FastImage.priority.normal,
  }}
  resizeMode={FastImage.resizeMode.contain}
/>

์ด๊ฑด ๋งˆ์น˜ ์—ฌํ–‰ ๊ฐ€๋ฐฉ์„ ์‹ธ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ํšจ์œจ์ ์œผ๋กœ ๋„ฃ์–ด์•ผ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ๋‹ค๋‹ ์ˆ˜ ์žˆ์ฃ ! ๐Ÿงณ

4. ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ํ™œ์šฉ ๐Ÿ”ง

๋ณต์žกํ•œ ์—ฐ์‚ฐ์ด๋‚˜ ๋ฌด๊ฑฐ์šด ์ž‘์—…์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

a. ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ๋งŒ๋“ค๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ณต์žกํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋‚˜ ์•”ํ˜ธํ™” ๊ฐ™์€ ์ž‘์—…์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์š”.


// iOS (Objective-C)
@implementation RCTImageProcessor

RCT_EXPORT_MODULE()

RCT_EXPORT_METHOD(processImage:(NSString *)imagePath
                  resolver:(RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject)
{
  // ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋กœ์ง
  // ...
  resolve(@"์ฒ˜๋ฆฌ๋œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ");
}

@end

// JavaScript
import { NativeModules } from 'react-native';
const { ImageProcessor } = NativeModules;

ImageProcessor.processImage(imagePath)
  .then(processedImagePath => console.log(processedImagePath))
  .catch(error => console.error(error));

์ด๊ฑด ๋งˆ์น˜ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์ผ์„ ๋งก๊ธฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ณต์žกํ•œ ์ผ์€ ์ „๋ฌธ๊ฐ€๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด์ฃ ! ๐Ÿ‘จโ€๐Ÿ”ง

5. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™” ๐ŸŽญ

๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ 60fps ๋‹ฌ์„ฑ์˜ ํ•ต์‹ฌ์ด์—์š”. ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ๋Š” Animated API๋ฅผ ์‚ฌ์šฉํ•ด ํšจ์œจ์ ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

a. useNativeDriver ์‚ฌ์šฉํ•˜๊ธฐ

useNativeDriver๋ฅผ true๋กœ ์„ค์ •ํ•˜๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋„ค์ดํ‹ฐ๋ธŒ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋ผ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JavaScript ์Šค๋ ˆ๋“œ์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์ฃ .


import { Animated } from 'react-native';

const animation = new Animated.Value(0);

Animated.timing(animation, {
  toValue: 1,
  duration: 1000,
  useNativeDriver: true, // ์—ฌ๊ธฐ๊ฐ€ ์ค‘์š”!
}).start();

// ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ
<Animated.View style={{ opacity: animation }}>
  {/* ๋‚ด์šฉ */}
</Animated.View>

์ด๊ฑด ๋งˆ์น˜ ๋กค๋Ÿฌ์ฝ”์Šคํ„ฐ๋ฅผ ํƒ€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์›€์ง์—ฌ์•ผ ์ฆ๊ฑฐ์šด ๊ฑฐ์ฃ ? ๋œ์ปน๊ฑฐ๋ฆฌ๋ฉด ์žฌ๋ฏธ์—†์ž–์•„์š”! ๐ŸŽข

b. ๋ ˆ์ด์•„์›ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜

LayoutAnimation์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ ์‹œ ์ž๋™์œผ๋กœ ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.


import { LayoutAnimation, UIManager } from 'react-native';

// Android์—์„œ ํ™œ์„ฑํ™”
if (Platform.OS === 'android') {
  if (UIManager.setLayoutAnimationEnabledExperimental) {
    UIManager.setLayoutAnimationEnabledExperimental(true);
  }
}

// ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ ์ „์— ํ˜ธ์ถœ
LayoutAnimation.configureNext(LayoutAnimation.Presets.spring);

// ์ดํ›„ ์ƒํƒœ ๋ณ€๊ฒฝ
this.setState({ expanded: true });

์ด๊ฑด ๋งˆ์น˜ ๋งˆ์ˆ ์‚ฌ์˜ ์†๋†€๋ฆผ ๊ฐ™์•„์š”. ๊ด€๊ฐ๋“ค์€ ๋ณ€ํ™”์˜ ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์—†์ง€๋งŒ, ๊ฒฐ๊ณผ๋Š” ๋†€๋ž์ฃ ! ๐ŸŽฉโœจ

6. ๋””๋ฒ„๊น… ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง ๐Ÿ”

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

a. React DevTools ์‚ฌ์šฉํ•˜๊ธฐ

React DevTools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ , ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์š”.


# ์„ค์น˜
npm install -g react-devtools

# ์‹คํ–‰
react-devtools

์ด๊ฑด ๋งˆ์น˜ ์˜์‚ฌ๊ฐ€ ์ฒญ์ง„๊ธฐ๋กœ ํ™˜์ž๋ฅผ ์ง„์ฐฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ฌธ์ œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ์น˜๋ฃŒํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ‘จโ€โš•๏ธ

b. Systrace ํ™œ์šฉํ•˜๊ธฐ

Systrace๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์•ฑ์˜ ์„ฑ๋Šฅ์„ ์ž์„ธํžˆ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์˜ˆ์š”.


# ์•ˆ๋“œ๋กœ์ด๋“œ ๋””๋ฒ„๊ทธ ๋ธŒ๋ฆฟ์ง€(adb) ์‚ฌ์šฉ
adb shell systrace --time=10 -o trace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res

์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์˜ ์–ด๋Š ๋ถ€๋ถ„์—์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๊ฑด ๋งˆ์น˜ ๋ ˆ์ด์‹ฑ ์นด์˜ ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์–ด๋Š ๊ตฌ๊ฐ„์—์„œ ์†๋„๊ฐ€ ๋–จ์–ด์ง€๋Š”์ง€, ์–ด๋””์„œ ์—ฐ๋ฃŒ๋ฅผ ๋” ์†Œ๋ชจํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์ฃ ! ๐ŸŽ๏ธ

c. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํ™•์ธํ•˜๊ธฐ

Xcode์˜ Instruments(iOS)๋‚˜ Android Studio์˜ Memory Profiler๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

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

์ด๊ฑด ๋งˆ์น˜ ์ง‘์˜ ์ˆ˜๋„ ๊ณ„๋Ÿ‰๊ธฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋ฌผ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ‘์ž๊ธฐ ๋Š˜์–ด๋‚ฌ๋‹ค๋ฉด ์–ด๋”˜๊ฐ€์—์„œ ๋ฌผ์ด ์ƒˆ๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ๊ฒ ์ฃ ? ๐Ÿ’ง

๋งˆ๋ฌด๋ฆฌ: 60fps๋ฅผ ํ–ฅํ•œ ์—ฌ์ • ๐Ÿš€

์™€์šฐ! ์ •๋ง ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค˜๋„ค์š”. ์—ฌ๋Ÿฌ๋ถ„, ์ด์ œ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋“ค์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ํ•˜๋ฃป๋ฐค์— ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ๊พธ์ค€ํ•œ ๋…ธ๋ ฅ๊ณผ ๊ด€์‹ฌ์ด ํ•„์š”ํ•˜์ฃ .

60fps ๋‹ฌ์„ฑ์€ ๋งˆ์น˜ ๋งˆ๋ผํ†ค๊ณผ ๊ฐ™์•„์š”. ๊พธ์ค€ํžˆ ๋‹ฌ๋ฆฌ๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ๋ชฉํ‘œ์— ๋„๋‹ฌํ•ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ค‘๊ฐ„์ค‘๊ฐ„ ํž˜๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํฌ๊ธฐํ•˜์ง€ ๋งˆ์„ธ์š”! ๐Ÿ’ช

์ด ๊ธ€์—์„œ ๋‹ค๋ฃฌ ๊ธฐ์ˆ ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ ์šฉํ•ด๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ•˜์„ธ์š”. ๊ธฐ์ˆ ์ ์œผ๋กœ ์™„๋ฒฝํ•œ ์•ฑ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ๊ฒ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•ฑ์ด ๋” ์ค‘์š”ํ•˜๋‹ˆ๊นŒ์š”.

์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด 60fps์˜ ๋ถ€๋“œ๋Ÿฌ์›€์„ ์ž๋ž‘ํ•˜๋Š” ๊ทธ๋‚ ๊นŒ์ง€, ํ™”์ดํŒ…! ๐ŸŽ‰

๐ŸŒŸ ์ถ”๊ฐ€ ํŒ

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

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

๋‹ค์Œ์— ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ๋งŒ๋‚˜์š”. ์•ˆ๋…•ํžˆ ๊ณ„์„ธ์š”! ๐Ÿ‘‹