[WWDC18] iOS Memory Deep Dive
- Why reduce memory :: μ λ©λͺ¨λ¦¬λ₯Ό μ€μ¬μΌ νλμ§?
- Memory footprint :: λ©λͺ¨λ¦¬ μ¬μ©λμ λν μ΄λ‘ μ μΈ μ΄μΌκΈ°
- Tools for profiling footprint :: λ©λͺ¨λ¦¬ μ¬μ©λμ νμΈν μ μλ ν΄ μκ°
- Images :: λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ μ¬μ©νλ μ΄λ―Έμ§μ λνμ¬
- Optimizing when in background :: λ°±κ·ΈλΌμ΄λμμμ μ΄λ―Έμ§ λ©λͺ¨λ¦¬ μ΅μ
- Demo
π§ Why reduce memory
λ©λͺ¨λ¦¬λ₯Ό μ€μ΄λ μ΄μ λ 무μμΌκΉ?
- μ μ κ° λ λμ κ²½νμ ν μ μκΈ° λλ¬Έμ΄λ€! (μ΄κ²μ΄ κ³ κ° μ€μ¬..?π₯Ή)
- μ± μ€ν μλκ° λΉ¨λΌμ§κ³ , μμ€ν μ΄ μ μνλκ³ , μ±μ΄ λ©λͺ¨λ¦¬μ λ μ€λ μ μ§λ μ μλ λ± λ€μν κ΄μ μμ μ₯μ μ΄ μλ€.
λ©λͺ¨λ¦¬λ₯Ό μ€μ΄λ κ²μ λν΄ μ΄μΌκΈ°νμ§λ§ μ€μ λ‘λ memory footprint μ λν μ΄μΌκΈ°μ΄λ€.
π‘ footprint : νΉμ νλμ¨μ΄λ μννΈμ¨μ΄κ° μ°¨μ§νκ³ μλ 곡κ°μ ν¬κΈ°
νλμ¨μ΄μ κ²½μ°μλ 물리μ μΈ κ³΅κ°, μννΈμ¨μ΄μμλ λ©λͺ¨λ¦¬ 곡κ°μ μλ―Έ
memory footprint : μννΈμ¨μ΄κ° μ°¨μ§νλ λ©λͺ¨λ¦¬μ ν¬κΈ° μ¦ λ©λͺ¨λ¦¬ μ¬μ©λ μ μλ―Ένλ€.
πΎ Memory Footprint
λͺ¨λ λ©λͺ¨λ¦¬κ° λμΌνκ² μμ±λλ κ²μ μλλ€.
- νμ΄μ§μ λν΄ μ΄μΌκΈ° ν΄μΌνλ€.
μλ° νμ΄μ§κ° μλλΌ, λ©λͺ¨λ¦¬μ νμ΄μ§ λ¨μμ λν΄ μμμΌ νλ€.
- λ©λͺ¨λ¦¬ νμ΄μ§λ μμ€ν μ μν΄ μ 곡λκ³ , νμ μ¬λ¬ κ°μ²΄λ₯Ό μ μ₯ν μ μλ€.
- κ·Έλ¦Όμ Data μ²λΌ μ¬λ¬ νμ΄μ§μ κ±Έμ³ μμ μλ μλ€.
- Page λ¨μμ ν¬κΈ°λ μΌλ°μ μΌλ‘ 16KB μ΄λ€.
- Page type clean, dirty ?? π€ λ μλμμ λ μ΄ν΄λ΄ λλ€!
- μ±μ λ©λͺ¨λ¦¬ μ¬μ©λμ νμ΄μ§μ * νμ΄μ§ ν¬κΈ°λ‘ κ³μ°ν μ μλ€.
π Clean and dirty pages μμ
20,000κ°μ μ μ λ°°μ΄μ ν λΉνλ μμ
- μμ€ν μ 6κ°μ νμ΄μ§λ₯Ό μ€λ€.
- μ²μ ν λΉν λμ νμ΄μ§λ€μ clean μνμ΄λ€.
- λ°μ΄ν° λ²νΌμ κ°μ μ°κ² λλ©΄, ν΄λΉ κ°μ΄ μλ νμ΄μ§λ dirty μνκ° λλ€.
- 첫λ²μ§Έμ λ§μ§λ§ νμ΄μ§ μ¬μ΄μ μλ νμ΄μ§λ€μ clean μνμ΄λ€.
- clean page λΌλ 건 μμ€ν μΌλ‘λΆν° νμ΄μ§λ₯Ό ν λΉλ°μ§λ§ κ°μ΄ μ°μ¬μ§μ§ μμ μν, dirty page λ νΉμ κ°μ μ¨ μ΅μ΄μ ν λΉλ μνκ° μλ κ±Έ μλ―Ένλλ― νλ€!
π Memory mapped files
- λ νλ μμμΌ ν κ²μ λ©λͺ¨λ¦¬ 맀ν νμΌ,
- λ©λͺ¨λ¦¬ 맀ν νμΌμ λμ€ν¬μ μμ§λ§ λ©λͺ¨λ¦¬μ λ‘λλ νμΌμ μλ―Ένλ€.
- μ½κΈ° μ μ© νμΌμ νμ clean page μ΄λ€.
- 컀λμ νμΌμ΄ Disk μμ RAM μΌλ‘ λ€μ΄μ€κ³ λκ°λ μκ°μ κ΄λ¦¬νλ€.
πΌ JPEG μ΄λ―Έμ§ νμΌμ ν΅ν΄ μμλ₯Ό λ€μ΄λ³Όκ²μ
- 50KB ν¬κΈ°μ JPEG μ΄λ―Έμ§μ κ²½μ°, λ©λͺ¨λ¦¬ 맀νμ 4νμ΄μ§μ λ©λͺ¨λ¦¬μ 맀νλλ€.
- 1νμ΄μ§λΉ 16KB, 4νμ΄μ§ 64KB λ‘, 14KB μ μ¬μ λ©λͺ¨λ¦¬κ° μλ€.
- λ€λ²μ§Έ νμ΄μ§λ μμ ν μ±μμ§μ§ μμ λ€λ₯Έ μ©λλ‘ μ¬μ©ν μ μλ€.
- μμ ν μ±μμ§ μΈκ°μ νμ΄μ§λ νμ μμ€ν μμ μ κ±°ν μ μμ§λ§, λ€λ²μ§Έ νμ΄μ§λ λ€λ₯Έ μ©λλ‘ μ¬μ©λ κ²½μ° λ°λ‘ μ κ±°ν μ μλκ±ΈκΉμ? π€
Typical app memory profile
μΌλ°μ μ μ±μμ λ©λͺ¨λ¦¬ ννλ¦°νΈμ νλ‘νμΌμ λ©λͺ¨λ¦¬ μΈκ·Έλ¨ΌνΈλ dirty, compressed, clean λ‘ λλμ΄μ§λ€.
clean memory
clean memory λ νμ΄μ§ μμν μ μλ λ°μ΄ν°λ₯Ό μλ―Ένλ€. (λ©λͺ¨λ¦¬ ν λΉ ν΄μ κ° κ°λ₯ν?)
- Memory mapped file μ μλ―Ένλ€.
- μ΄λ―Έμ§, λ°μ΄ν° λΈλ(Blob, Binary Large Object), νμ΅ λͺ¨λΈ
- Blob,, μ΄λ―Έμ§, λΉλμ€, μ¬μ΄λ λ±κ³Ό κ°μ λ©ν°λ―Έλμ΄ κ°μ²΄λ₯Ό μ μ₯νκΈ° μν μλ£ν, Large Objectμ μμΉ ν¬μΈν°λ₯Ό μ μ₯νλ€.
- νλ μμν¬κ° λ μλ μλ€.
- λͺ¨λ νλ μμν¬μλ DATA CONST μΉμ μ΄ μκ³ , μΌλ°μ μΌλ‘λ clean memory μ μνμ§λ§ swizzling μ ν΅νλ©΄ dirty memory κ° λ μλ μλ€.
Dirty memory
Dirty memory λ μ±μμ κ°μ μ΄ λ©λͺ¨λ¦¬λ₯Ό μλ―Ένλ€.
- λ¬Έμμ΄, λ°°μ΄ λ± λμ μΌλ‘ ν λΉλ λͺ¨λ κ°μ²΄
- μ΄λ―Έμ§ λ²νΌλ₯Ό λμ½λ© νλ κ²½μ°
- νλ μμν¬ μ€ λ°μ΄ν° μΉμ κ³Ό λ°μ΄ν° λν° μΉμ μ΄ μ΄μ μνλ€.
π Frameworks
- νλ μμν¬μλ clean memory μ μνλ μμκ³Ό dirty memory μ μνλ μμμ΄ λ λ€ μ‘΄μ¬νλ€.
- νλ μμν¬λ₯Ό μ체μ μΌλ‘ μ μ§νκ³ κ΄λ¦¬νλ€λ©΄, μ±κΈν€κ³Ό μ μ μμ±μλ dirty memory λ₯Ό μ€μ΄λλ° μ’μ λ°©λ²μ΄ λ κ²μ΄λ€.
- μ±κΈν€μ μμ±λ μ΄ν νμ λ©λͺ¨λ¦¬μ μ΄μ μκ³ ,
- μμ±μ λν νλ μμν¬λ₯Ό λ§νΉνκ±°λ ν΄λμ€κ° λ‘λλ λλ§λ€ μ€νλ κ²μ΄λ€.
π³ Compressed memory (μμΆ λ©λͺ¨λ¦¬)
iOS μλ μ ν΅μ μΈ λμ€ν¬ μ€μ μμ€ν μ΄ μλ λμ , λ©λͺ¨λ¦¬ μμΆκΈ° (Memory compressor) λ₯Ό μ¬μ©νλ€. iOS 7 μμ λμ λμλ€.
- memory compressor λ μμΆ, μμΆ ν΄μ λ₯Ό μννλ€.
- μ κ·Όλμ§ μμ νμ΄μ§λ₯Ό κ°μ Έμ μμΆν΄μ, λ λ§μ 곡κ°μ λ§λ λ€.
- λ€μ μ κ·Όν κ²½μ° λ©λͺ¨λ¦¬λ₯Ό μ½μ μ μλλ‘ μμΆμ ν΄μ νλ€.
μΊμ±μ μ¬μ©λλ dictionary λ₯Ό μμλ‘ λ€μ΄λ΄ λλ€ π
- μΈ κ° νμ΄μ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νκ³ μμ§λ§, νλμ μ¬μ©νμ§ μκ³ μμ€ν μ λ©λͺ¨λ¦¬ 곡κ°μ΄ νμνλ€λ©΄ ν νμ΄μ§λ‘ μμΆλ μ μλ€.
- νμ¬ μμΆμ΄ λμ΄ ν νμ΄μ§λ‘ λ©λͺ¨λ¦¬ μ μ½μ νκ³ μμ§λ§, μ€μ λ‘ μ κ·Όν μμ μλ λ€μ μΈ νμ΄μ§λ₯Ό μ¬μ©νκ² λ κ²μ΄λ€.
β Memory warnings
μ±μ΄ νμ λ©λͺ¨λ¦¬ κ²½κ³ μ μμΈμ μλλ€.
- λ©λͺ¨λ¦¬κ° λΆμ‘±ν λλ°μ΄μ€λ₯Ό μ¬μ©μ€μ μ νλ₯Ό λ°μΌλ©΄ λ©λͺ¨λ¦¬ κ²½κ³ κ° λ°μν μ μκ³ , κ·Έλ μ±μ΄ μ’ λ£λ μ μλ€.
- λ©λͺ¨λ¦¬ μμΆκΈ°λ₯Ό ν΅ν΄ μμΆλ κ²½μ°, μ€μ λ‘λ λ©λͺ¨λ¦¬λ₯Ό λ μΈ μ μκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ ν΄μ λ₯Ό λ 볡μ‘νκ² λ§λ λ€.
- λ©λͺ¨λ¦¬ κ²½κ³ κ° λ°μν λ μΊμ±μ νμ§ μκ±°λ λ°±κ·ΈλΌμ΄λ μμ μ μ‘°μ νλ λ±μ μ μ± λ³κ²½μ κΆμ₯νλ€.
λ©λͺ¨λ¦¬ κ²½κ³ μ μ±μμ μνν μ μλ λμμΌλ‘, μΊμμμ λͺ¨λ κ°μ²΄λ₯Ό μ κ±°νκΈ°λ‘ κ²°μ νλ€κ³ ν©μλ€ π€
μκΉ μμΆνλ μΊμ±μ μν λμ λ리μ μ‘μΈμ€νκΈ° λλ¬Έμ λ λ§μ νμ΄μ§λ₯Ό μ¬μ©νκ² λλ€.
- λ©λͺ¨λ¦¬κ° μ νλμ΄ μλ νκ²½μμλ μ μ νμ§ μλ€ π€
- μΊμ±λ κ°μ²΄λ€μ μ κ±°ν΄ ννμ΄μ§λ‘ λ리기 μν΄, μ΄λ―Έ μμΆλμ΄ ννμ΄μ§λ‘ μ μ§λμ΄ μλ μνλ₯Ό νμ΄ ν¬λ¨ΈμΉ μμ μ νκ² λλ€.
λ©λͺ¨λ¦¬ κ΄μ μμ μΊμ±μ λν΄ μ€μν κ²λ€μ΄ μλ€.
- βοΈ CPU μ λ©λͺ¨λ¦¬ μ¬μ©μ νΈλ μ΄λ μ€νλ₯Ό μκ°νμ.
- μΊμ±μ ν λ CPU κ° λ°λ³΅μ μΈ μμ μ νμ§ μκ² λ Έλ ₯νμ§λ§, μΊμ±μ λ무 λ§μ΄ νκ²λλ©΄ λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ μ¬μ©ν΄ μμ€ν μ λ¬Έμ κ° λ°μν μ μλ€.
- λ©λͺ¨λ¦¬ μμΆκΈ°μ μΊμκ° μλκ±Έ κΈ°μ΅νκ³ , λμ
λ리 λμ μ NSCache λ₯Ό μ¬μ©νλκ² μμ νλ€.
- NSCache λ λ©λͺ¨λ¦¬κ° λΆμ‘±ν λ μλμΌλ‘ μΊμ±λ κ²μ μΌλΆλ₯Ό ν΄μ νλλ‘ λμνλ€.
π Typical app memory profile
μΌλ°μ μΌλ‘ μ±μμ λ©λͺ¨λ¦¬ μ¬μ©λ (footprint) μ λν΄ μ΄μΌκΈ° ν λμλ dirty, compressed μΈκ·Έλ¨ΌνΈλ₯Ό μλ―Ένλ€. clean memory μμμ ν¬κ² μ€μνμ§ μλ€.
- λͺ¨λ μ±μλ μ¬μ© κ°λ₯ν λ©λͺ¨λ¦¬ μ νμ΄ μλ€.
- λ©λͺ¨λ¦¬ μ νμ λλ°μ΄μ€λ§λ€ λ¬λΌμ§ μ μλ€.
- μ±λ§λ€ μ νλλ λ©λͺ¨λ¦¬λ μκ°λ³΄λ€ λ§μ΄ ν λΉλλ€.
- λ©λͺ¨λ¦¬ 곡κ°μ νμ₯ν μ μμ§λ§, μ΄ κ³΅κ°μ μ κΈ° λλ¬Έμ μ£Όμν΄μΌ νλ€.
- μ±μ ν λΉλ λ©λͺ¨λ¦¬ 곡κ°μ μ΄κ³Όνλ©΄ exception μ΄ λ°μνλ€.
Tools for Profiling Footprint
- μ±μ footprint λ₯Ό νλ‘νμΌλ§ ν μ μλ λꡬλ₯Ό μκ°ν©λλ€.
- Xcode memory gauge λ λλ²κΉ μ μ±μ λ©λͺ¨λ¦¬ 곡κ°μ λΉ λ₯΄κ² λ³Ό μ μλ€.
Instruments λ μ±μ λ©λͺ¨λ¦¬ 곡κ°μ νμΈνκΈ° μν μ¬λ¬κ°μ§ λ°©λ²μ μ 곡νλ€.
- Allocations : μ±μμ μμ±ν ν ν λΉμ νλ‘νμΌλ§
- Leaks : μκ°μ΄ μ§λ¨μ λ°λ₯Έ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ λμλ₯Ό νμΈ
- VM Tracker : dirty, compressed memory λ₯Ό νλ‘νμΌλ§ νλ λ°©λ²μ μ 곡
- μμΆ λ©λͺ¨λ¦¬μΈ dirty size, swapped size, resident size λ₯Ό μλ €μ€λ€.
- Virtual memory trace : μ±κ³Ό κ΄λ ¨λ κ°μ λ©λͺ¨λ¦¬ μμ€ν
μ μ±λ₯μ μ μ μλ€
- By Operation νμμ VM νλ‘νμΌμ μ κ³΅ν΄ page cache hits, page zero fills λ₯Ό λ³Ό μ μλ€.
memory resource exceptions
- Xcode 10 λΆν°λ ν΄λΉ EXC exception μ μΊμΉν΄μ μ±μ μΌμ μ€μ§νλ€.
- ν΄λΉ μμ λΆν° λ©λͺ¨λ¦¬ λλ²κ±°λ₯Ό λΆμ¬ νμΈν μ μλ€.
Xcode λ©λͺ¨λ¦¬ λλ²κ±°λ Xcode 8λΆν° μ 곡λμ΄, κ°μ²΄κ° λνλμ, μ¬μ΄ν΄, λμ(leak)λ₯Ό μΆμ ν μ μλ€.
- κ·Έλν ννλ‘ λνλ건 Xcode 10 λΆν°λΌκ³ ν©λλ€ π
- Xcode λ΄λΆμ μΌλ‘ Memgraph νμΌ νμμ μ¬μ©ν΄ λ©λͺ¨λ¦¬ μ 보λ₯Ό μ μ₯νλ€.
- Memgraph λ₯Ό export ν΄μ command line tool μμ νμΈν μλ μλ€.
vmmap
λ©λͺ¨λ¦¬ 리μμ€ μμΈκ° λ°μν μνμ Memgraph λ 컀맨λ λΌμΈ λͺ λ Ήμ΄μΈ vmmap μ μ΄μ©ν΄μ λΆμν μ μλ€.
- vmmap μ νλ‘μΈμ€μ ν λΉλ κ°μ λ©λͺ¨λ¦¬ μμμ 보μ¬μ€λ€.
vmmap --summary <memgraph> λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ ν΄λΉ λ©λͺ¨λ¦¬ κ·Έλνμ μ 체μ μΈ μμ½μ λ³Ό μ μλ€.
- μμμ λ©λͺ¨λ¦¬ ν¬κΈ°, λν° λ©λͺ¨λ¦¬ ν¬κΈ°, μ€μλκ±°λ μμΆλ λ©λͺ¨λ¦¬μ μμ 보μ¬μ€λ€.
- dirty, swap μμμ΄ μ€μ ..!
- swap size λ μμΆλ λ°μ΄ν° ν¬κΈ°κ° μλλΌ μ¬μ μ μμΆλ λ°μ΄ν° ν¬κΈ°μ΄λ€.
vmmap <memgraph> λͺ λ Ήμ΄λ₯Ό μ΄μ©νλ©΄ μ 체 μμμ λν λ©λͺ¨λ¦¬ ν¬κΈ°λ₯Ό νμΈν μ μλ€.
- Non-writable regions : νλ‘κ·Έλ¨μ ν μ€νΈ, μ€ν μ½λ λ± μ°κΈ°κ° λΆκ°λ₯ν μμ
- Writable regions : λ°μ΄ν° μΉμ λ± μ°κΈ° κ°λ₯ν μμ, νλ‘μΈμ€ νμ΄ λ μμΉ
- vmmap κ³Ό awk λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ dirty page κ°μλ₯Ό ꡬνλ λͺ λ Ήλ¬Έμ μμ±ν μ μλ€.
leaks
leaks λͺ λ Ήμ΄λ₯Ό ν΅ν΄ λμ΄μ λ νΌλ°μ€κ° μμ§λ§ ν λΉλμ΄ μλ κ°μ²΄λ₯Ό νμΈν μ μλ€.
- leak κ°μ²΄λ μ λ ν΄μ ν μ μλ dirty memory μ΄λΌλ μ μ κΈ°μ΅..!
λ©λͺ¨λ¦¬ λλ²κ±°μμ leak μ νμΈνλ λ²
- 3κ°μ κ°μ²΄κ° κ°ν μ°Έμ‘°λ₯Ό νκ³ μλ μν
- λμλ κ°μ²΄λ₯Ό νμν λΏ μλλΌ, retain cycle λ νκΈ°λλ€.
- νλ‘μΈμ€μμ malloc μ€ν λ‘κΉ μ νμ±ννλ€λ©΄, λ£¨νΈ λ Έλμ λν μμΆμ λ μ 곡νλ€.
heap
heap <memgraph> λͺ λ Ήμ΄λ₯Ό ν΅ν΄ νμ ν λΉλμ΄ μλ κ°μ²΄λ€μ λ³Ό μ μλ€.
- λ©λͺ¨λ¦¬μ ν λΉλ ν° κ°μ²΄λ, κ°μ μ’ λ₯μ κ°μ²΄κ° λ§μ΄ μ‘΄μ¬νλ λ±μ μΆμ νλλ° λμμ΄ λλ€.
λ©λͺ¨λ¦¬ 리μμ€ μμΈκ° λ¬μλμ Memgraph λ₯Ό κ°μ§κ³ νμΈν΄λ³΄λ©΄ κ° κ°μ²΄μ ν΄λμ€ μ΄λ¦, κ°μ²΄ μ, νκ· ν¬κΈ° λ±μ΄ μ 곡λλ€.
κΈ°λ³Έμ μΌλ‘λ κ°μμ λ°λΌ μ λ ¬λκ³ , ν¬κΈ°μλλ‘ μ λ ¬νκ³ μΆλ€λ©΄ sortBySize μ΅μ μ μΆκ°νλ©΄ λλ€.
- ν¬κΈ°κ° ν° NSConcreteData κ°μ²΄ λ°κ²¬ π
NSConcreteData κ°μ²΄μ€μ νλμ μ£Όμλ₯Ό κ°μ ΈμμΌ νλ€.
- -addresses all μ΅μ κ³Ό ν¨κ» ν΄λμ€ μ΄λ¦μ μ λ¬νλ©΄ κ° μΈμ€ν΄μ€μ λν νμ μμΉν μ£Όμλ₯Ό νμΈν μ μλ€.
malloc_history
malloc stack logging μ΅μ μ νμ±ννλ©΄ κ° ν λΉμ λν backtrace λ₯Ό κΈ°λ‘νλ€.
- μμΆμ λ λ‘κ·Έλ Memgraph λ₯Ό κΈ°λ‘ν λ μΊ‘μ²λμ΄ μ¬μ©λλ€.
- malloc_history <memgraph> <address> λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ νΉμ μ£Όμμ μμΉν μΈμ€ν΄μ€κ° ν λΉλλ κ²μ μμΆμ ν μ μλ€.
NoirFilter.apply λ©μλμμ μμ² ν° NS data λ₯Ό λ§λ€κ³ μλ κ²μ λ°κ²¬ π§
π λ©λͺ¨λ¦¬ λ¬Έμ κ° λ°μνμλ μ΄λ€ λꡬλ₯Ό μ νν΄μΌν κΉ?
μλ μΈκ°μ§ μΌμ΄μ€μ λ°λΌ μ¬μ©νλ λκ΅¬κ° λ¬λΌμ§λ€.
- κ°μ²΄ μμ±μ λ³΄κ³ μΆμμ§
- malloc_history λͺ λ Ήμ΄λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬ ν λΉμ μμΆμ κ°λ₯
- λ©λͺ¨λ¦¬μ κ°μ²΄λ μ£Όμλ₯Ό μ°Έμ‘°νλ κ²μ λ³΄κ³ μΆμμ§
- leaks λͺ λ Ήμ΄λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬ λμ νμΈ κ°λ₯
- μΈμ€ν΄μ€κ° μΌλ§λ ν°μ§ νμΈνκ³ μΆμμ§
- vmmap, heap λͺ λ Ήμ΄λ₯Ό ν΅ν΄ ν¬κΈ° νμΈ κ°λ₯
πΌ Images
iOS μ±μμ κ°μ₯ ν° κ°μ²΄λ Images μ΄λ€.
- μ΄λ―Έμ§μ κ΄λ ¨λ λ©λͺ¨λ¦¬ μ¬μ©μ νμΌ ν¬κΈ°κ° μλ μ΄λ―Έμ§μ ν¬κΈ°μ κ΄λ ¨μ΄ μλ€λ κ²μ΄λ€.
- Memory use is related to the dimensions of the image, not the file size.
- νμΌ ν¬κΈ°λ 590KB μ΄μ§λ§, μ΄λ―Έμ§μ ν¬κΈ°λ 10MB μ΄λ€.
- 2048 * 1536 * 4bytes
π§ μ μ΄λ κ² μ¬μ΄μ¦κ° ν°μ§ μκΈ° μν΄μλ.. iOS μμ μ΄λ―Έμ§λ₯Ό μ²λ¦¬νλ λ°©μμ μμμΌνλ€
- Load, Decode, Render μΈκ°μ§ κ³Όμ μΌλ‘ λλλ€.
- Load λ¨κ³μμλ 590KB μ μμΆλ μ΄λ―Έμ§νμΌμ λ©λͺ¨λ¦¬μ λ‘λνλ€.
- Decode λ¨κ³μμ JPEG νμΌμ GPU κ° μ½μ μ μλ νμμΌλ‘ λ³ννλ€. μμΆλ μ΄λ―Έμ§λ₯Ό νΈλ κ³Όμ μμ 10MB κ° λλ€.
- λμ½λ©λ νμ λ λλ§μ μΈμ λ ν μ μλ€.
- μ΄λ―Έμ§ μ΅μ ν λ°©λ²μ Images and Graphics best practice
SRGB
λμ½λ© μ΄νμ SRGB ν¬λ§·μ ν ν½μ λΉ 4 bytes λ₯Ό ν¬ν¨νλ€.
- μΌλ°μ μΈ κ·Έλν½μ μ΄λ―Έμ§ ν¬λ§·
- Red, Green, Blue, Alpha
Wide format
iOS νλμ¨μ΄λ wide format μΌλ‘ λ λλ§ ν μ μλ€.
- μμ΄λ ν¬λ§·μ SRGB κ°κ°μ΄ λλ°°μ© λμ΄λ ννλ‘, ν½μ λΉ 8 bytes λ₯Ό ν¬ν¨νλ€.
- μ΄λ―Έμ§μ ν¬κΈ°λ₯Ό λλ°°λ‘ λλ¦¬κ² λλ€.
- μ’ λ μμ ννμ μ΄λ―Έμ§ ν¬λ§·,
- ν ν½μ λΉ 2 bytes λ₯Ό ν¬ν¨νκ³ , νλμ μν κ°μ κ°λλ€.
- Alpha κ° νλλ§ κ°λ ν¬λ§·μΌλ‘ 1ν½μ λΉ 1 byte λ‘€ ν¬ν¨νλ€.
- SRGB μ λΉν΄ 75% μ μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νκΈ°μ νλ°±μΈ ν μ€νΈλ λ§μ€ν¬μ μ ν©νλ€.
μ΄λ―Έμ§ νμμ 1ν½μ
λΉ 1 byte μμ 8 bytes κΉμ§ λ€μνκΈ° λλ¬Έμ, μν©μ λ°λΌ μ λΉν ν¬λ§·μ μ νν΄μΌ νλ€.
μ΄λ»κ² μ νν΄μΌ νλ.. μΆμμ§λ§, ν¬λ§·μ μ§μ μ ννμ§ μμΌλ©΄ λλ€κ³ νλ€ π€
- UIGraphicsBeginImageContextWithOptions API λ νμ ν½μ λΉ 4 bytes λ₯Ό μ¬μ©νμ§λ§,
- UIGraphicsImageRenderer λ₯Ό μ¬μ©νλ©΄ μ μ ν ν¬λ§·μ μ€μ ν΄μ£ΌκΈ° λλ¬Έμ λ©λͺ¨λ¦¬λ₯Ό μ μ½ν μ μλ€.
UIGraphicsBeginImageContextWithOptions λ₯Ό ν΅ν΄ λ§μ€ν¬μ μμ κ·Έλ¦¬κ³ μλ€
- κ²μ μ μμ 그리λλ° ν½μ λΉ 4 bytes λ₯Ό μ¬μ©νλ λΆνμν κ³Όμ
UIGraphicsImageRenderer λ₯Ό μ¬μ©νλ©΄ 1ν½μ λΉ 1 byte λ₯Ό μ¬μ©νλλ‘ μλμΌλ‘ λ³νλλ€.
- ν΄λΉ μ΄λ―Έμ§λ₯Ό λ€μ μ¬μ©ν΄μ μμλ§ λ³κ²½ν μλ μλ€. μΆκ°μ μΈ λ©λͺ¨λ¦¬ ν λΉμ΄ μμ΄ μμμ λ³κ²½ν μ μλ€λ μ !
β¬ Down sampling
μΌλ°μ μΌλ‘ μΈλ€μΌμ λ§λ€κΈ° μν΄ λ§μ΄ μ¬μ©νλ μ΄λ―Έμ§ λ€μ΄ μνλ§
- UIImage λ₯Ό μ¬μ©ν΄μ μ¬μ΄μ§, 리μ¬μ΄μ§μ νλ건 μ±λ₯μ΄ λ¨μ΄μ§λ€.
- λ΄λΆ μ’ν κ³΅κ° λ³νκ³Ό λ©λͺ¨λ¦¬μ μλ μ 체 μ΄λ―Έμ§μ μμΆμ νκΈ°μ μ±λ₯μ΄ λ¨μ΄μ§λ€.
- ImageIO νλ μμν¬λ₯Ό μ¬μ©νλ©΄ μ΄λ―Έμ§λ₯Ό λ€μ΄μνλ§ ν μ μλλ°
- κ²°κ³Ό μ΄λ―Έμ§μ dirty memory λΉμ©λ§ μ§λΆ μ μλλ‘ μ€νΈλ¦¬λ° API λ₯Ό μ¬μ©νλ€.
- λ©λͺ¨λ¦¬ μ€νμ΄ν¬λ₯Ό μ€μΌ μ μλ€.
UIImage λ₯Ό μ¬μ©ν΄μ λ μμ μ΄λ―Έμ§λ‘ λ³ννλ μ½λ
ImageIO λ‘ μ νν μ½λ
- λμ€ν¬μμ νμΌμ λ‘λν΄μΌ νλ건 λμΌνμ§λ§ μ΄λ―Έμ§μ ν¬κΈ°λ₯Ό μ§μ νλ건 맀κ°λ³μλ₯Ό ν΅ν΄ μ λ¬νλ©΄ λλ€.
- λ³νλ CGImage λ₯Ό UIImage λ₯Ό λνν μ μλ€.
- μ΄λ―Έμ§ ν¬κΈ° λν μκ³ , μ΄μ μ½λλ³΄λ€ 50% λΉ λ₯΄λ€.
π± Optimizing when in the background
λ°±κ·ΈλΌμ΄λμμ μ΅μ ννλ λ°©λ²
- μ±μ μ 체 νλ©΄μ μ΄λ―Έμ§κ° μλ€κ³ κ°μ νλ€λ©΄, μ±μ΄ μλ¦Όμ λ°μ λ€λ₯Έ νλ©΄μΌλ‘ μ΄λνλλΌλ κ³μ λ©λͺ¨λ¦¬μ λ¨μμκ² λλ€
- νμμ λ³΄μ§ λͺ»νλ ν° λ¦¬μμ€λ μΈλ‘λ νλ κ²μ΄ μ’λ€..
- μ±μ΄ λ°±κ·ΈλΌμ΄λλ‘ κ°κ±°λ, ν¬κ·ΈλΌμ΄λλ‘ λμμ€λ λΌμ΄ν μ¬μ΄ν΄ μ΄λ²€νΈλ₯Ό μ΄μ©νμ.
- λ°±κ·ΈλΌμ΄λλ‘ λ€μ΄κ°λ κ²½μ° ν° μ΄λ―Έμ§λ₯Ό μΈλ‘λ νκ³ , ν¬κ·ΈλΌμ΄λλ‘ λμμ¬ λ μ΄λ―Έμ§λ₯Ό λ€μ λ‘λνλλ‘ νλ€.
- λ°±κ·ΈλΌμ΄λμμ λ©λͺ¨λ¦¬λ₯Ό μ μ½νκ³ , μ¬μ©μκ° μ±μ μ¬μ©νλ¬ ν¬κ·ΈλΌμ΄λλ‘ λμ΄μ¬ λμλ λμΌνκ² μ μ§ν μ μκ² λλ€
navigation controller, tab controller μ κ²½μ°μμλ νΉμ λ·° 컨νΈλ‘€λ¬κ° 보μ΄κ±°λ μ¬λΌμ§ λ λμΌν μ²λ¦¬λ₯Ό ν΄μ€ μ μλ€.
'π iOS > WWDC' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[WWDC21] Discover concurrency in SwiftUI (1) | 2023.05.18 |
---|---|
[WWDC20] The Push Notifications primer (APNs / iOS νΈμ λ±λ‘) (0) | 2023.02.14 |
[WWDC19] Advances in Collection View Layout - Part 1 (0) | 2022.10.17 |
[WWDC19] Data Flow Through SwiftUI - Part 2 (0) | 2022.08.30 |
[WWDC19] Data Flow Through SwiftUI - Part 1 (0) | 2022.08.30 |