κ²½λŸ‰(FlyWeight) νŒ¨ν„΄

2023. 6. 7. 18:20Β·πŸ–₯️ Study Note/Design Patteren

{ κ²½λŸ‰ νŒ¨ν„΄μ΄λž€? }

κ²½λŸ‰ νŒ¨ν„΄μ€ GoF의 ꡬ쑰 νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ,

μΈμŠ€ν„΄μŠ€κ°€ ν•„μš”ν•  λ•Œλ§ˆλ‹€ 맀번 μƒμ„±ν•˜λŠ” 것이 μ•„λ‹ˆκ³  κ°€λŠ₯ν•œ κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•¨μœΌλ‘œμ¨ λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

λ‹€μˆ˜μ˜ μœ μ‚¬ 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ μ‘°μž‘ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

더 μžμ„Ένžˆ μ„€λͺ…ν•˜μžλ©΄ κ²½λŸ‰ νŒ¨ν„΄μ€ ν•œ 개의 고유 μƒνƒœλ₯Ό λ‹€λ₯Έ κ°μ²΄μ—μ„œ κ³΅μœ ν•˜κ²Œ λ§Œλ“€μ–΄ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄인닀.

- 고유 μƒνƒœ (intrinsic state): μœ μ‚¬ κ°μ²΄λ“€μ˜ 데이터 값이 κ°™μ•„μ„œ κ³΅μœ ν•  수 μžˆλŠ” 데이터

- μ™ΈλΆ€ μƒνƒœ (extrinsic state): μœ μ‚¬ κ°μ²΄λ“€μ˜ 데이터 값이 μ„œλ‘œ λ‹¬λΌμ„œ κ³΅μœ ν•  수 μ—†λŠ” 데이터

 

{ κ²Œμž„ κ°œλ°œμ—μ„œ κ²½λŸ‰ νŒ¨ν„΄ ν™œμš©ν•˜κΈ° : λ‚˜λ¬΄ 클래슀 μ„€κ³„ν•˜κΈ° }

κ²Œμž„ μ›”λ“œ 상에 λ‹€μˆ˜μ˜ λ‚˜λ¬΄κ°€ μžˆλ‹€. 각 λ‚˜λ¬΄λ“€μ„ κ΅¬μ„±ν•˜λŠ” λ°μ΄ν„°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

1. λ‚˜λ¬΄ ν˜•νƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 폴리곀 λ©”μ‹œ

2. λ‚˜λ¬΄ 껍질과 μžŽμ‚¬κ·€ ν…μŠ€μ²˜

3. μ›”λ“œ μƒμ—μ„œ μœ„μΉ˜, λ°©ν–₯, 크기

4. κ·Έ μ™Έ 음영 κ°’κ³Ό 같은 λ§€κ°œλ³€μˆ˜

 

이것듀을 μ½”λ“œλ‘œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

class Tree { 

private:

  Mesh mesh_; 

  Texture bark_; 

  Texture leaves_; 

  Vector position_; 

  double height_;

  double thickness_; 

  Color barkTint_; 

  Color leafTint_;

};

κ²½λŸ‰ νŒ¨ν„΄μ„ μ΄μš©ν•΄μ„œ 이 Tree 클래슀λ₯Ό μ΅œμ ν™”ν•΄λ³΄μž.

λŒ€κ°œ λ‚˜λ¬΄ μΈμŠ€ν„΄μŠ€λ“€μ€ λ™μΌν•œ mesh와 textureλ₯Ό κ°€μ§„λ‹€.

κ·Έλ ‡λ‹€λ©΄ 이 mesh와 textureκ°€ 고유 μƒνƒœκ°€ λ˜λŠ” 것이닀.

고유 μƒνƒœλ“€μ„ μƒˆλ‘œμš΄ ν΄λž˜μŠ€μ— λͺ¨μ•„λ³΄μž.

class TreeModel { 

private:

  Mesh mesh_; 

  Texture bark_; 

  Texture leaves_;

};

- κ²Œμž„ λ‚΄μ—μ„œ 이제 TreeModel κ°μ²΄λŠ” ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜κ²Œ λœλ‹€. 같은 mesh와 textureλ₯Ό μ—¬λŸ¬λ²ˆ λ©”λͺ¨λ¦¬μ— 올릴 ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

- 각 λ‚˜λ¬΄ μΈμŠ€ν„΄μŠ€λŠ” 이 TreeModel 객체λ₯Ό μ°Έμ‘°ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

- Tree ν΄λž˜μŠ€μ—λŠ” μΈμŠ€ν„΄μŠ€λ³„λ‘œ λ‹€λ₯Έ μƒνƒœκ°’λ§Œ 남겨둔닀.

class Tree { 

private:

  shared_ptr<TreeModel> model_;

  Vector position_; 

  double thickness_; 

  Color barkTint_; 

  Color leafTint_;

};
⁜ κ²½λŸ‰ νŒ¨ν„΄ μΈμŠ€ν„΄μŠ€ 생성 μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄, 이전에 같은 것을 μƒμ„±ν•œ 적이 μžˆλŠ”μ§€ 확인해야 ν•œλ‹€.
이러렀면 객체λ₯Ό 생성할 λ•Œ κΈ°μ‘΄ 객체가 μžˆλŠ” μ§€ λ¨Όμ € ν™•μΈν•˜κ²Œ ν•  수 μžˆλ„λ‘, 생성 μ½”λ“œλ₯Ό μΈν„°νŽ˜μ΄μŠ€ 밑에 μˆ¨κ²¨λ‘¬μ•Ό ν•œλ‹€.
λ˜ν•œ 이전에 λ§Œλ“€μ–΄ 놓은 κ²½λŸ‰ νŒ¨ν„΄ 객체λ₯Ό λ°˜ν™˜ν•˜λ €λ©΄, 이미 생성해 놓은 객체λ₯Ό 찾을 수 μžˆλ„λ‘ ν’€(pool)둜 객체듀을 관리해야 ν•œλ‹€.

{ μΈμŠ€ν„΄μ‹± }

μΈμŠ€ν„΄μ‹± ν˜Ήμ€ μΈμŠ€ν„΄μŠ€ λ Œλ”λ§μ€ 같은 Mesh와 Material을 κ°€μ§„ μ—¬λŸ¬ 였브젝트λ₯Ό ν•˜λ‚˜μ˜ λ“œλ‘œμš° 콜둜 λ Œλ”λ§ μš”μ²­μ„ ν•˜λŠ” 것이닀.

  • λ“œλ‘œμš° 콜(λ Œλ”λ§ μš”μ²­)이 λ°œμƒν•˜λ©΄ λ Œλ”λ§μ— ν•„μš”ν•œ 데이터λ₯Ό GPU둜 λ³΄λ‚΄κ²Œ λ˜λŠ”λ° 이것은 λΉ„μš©μ΄ 큰 μž‘μ—…μ΄λ‹€.
     => λ”°λΌμ„œ 같은 Mesh와 Material을 κ°€μ§„ μ—¬λŸ¬ 였브젝트λ₯Ό λ Œλ”λ§ν•  λ•Œ, ν•œλ²ˆμ˜ λ“œλ‘œμš° 콜둜 이 μ˜€λΈŒμ νŠΈλ“€μ„ λͺ¨λ‘ 그릴 수 μžˆλŠ” μΈμŠ€ν„΄μ‹±μ„ μ‚¬μš©ν•œλ‹€.
  • μΈμŠ€ν„΄μ‹±μ„ ν•˜λ €λ©΄ 데이터 슀트림이 두 개 ν•„μš”ν•˜λ‹€.
    • 첫번째 μŠ€νŠΈλ¦Όμ—λŠ” μ•žμ„  μ˜ˆμ‹œμ—μ„œ λ‚˜λ¬΄μ˜ mesh와 texture처럼 μ—¬λŸ¬λ²ˆ λ Œλ”λ§λ˜μ–΄μ•Ό ν•˜λŠ” 곡유 데이터가 λ“€μ–΄κ°„λ‹€.
    • λ‘λ²ˆμ§Έ μŠ€νŠΈλ¦Όμ—λŠ” μΈμŠ€ν„΄μŠ€ λͺ©λ‘κ³Ό 각 μΈμŠ€ν„΄μŠ€μ˜ κ°œλ³„ 데이터가 λ“€μ–΄κ°„λ‹€. 
  • μΈμŠ€ν„΄μ‹±μ€ ν•˜λ“œμ›¨μ–΄κ°€ μ§€μ›ν•˜λŠ” κ²½λŸ‰ νŒ¨ν„΄μ΄λ‹€.

λ„μ„œ : κ²Œμž„ ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'πŸ–₯️ Study Note > Design Patteren' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

ν”„λ‘œν† νƒ€μž…(ProtoType) νŒ¨ν„΄  (0) 2023.06.19
κ΄€μ°°μž(Observer) νŒ¨ν„΄  (0) 2023.06.08
λͺ…λ Ή(Command) νŒ¨ν„΄  (2) 2023.06.05
λ””μžμΈ νŒ¨ν„΄μ΄λž€?  (0) 2023.06.05
'πŸ–₯️ Study Note/Design Patteren' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • ν”„λ‘œν† νƒ€μž…(ProtoType) νŒ¨ν„΄
  • κ΄€μ°°μž(Observer) νŒ¨ν„΄
  • λͺ…λ Ή(Command) νŒ¨ν„΄
  • λ””μžμΈ νŒ¨ν„΄μ΄λž€?
Beankong_
Beankong_
μ£Όλ‹ˆμ–΄ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž˜λ¨Έ 곡뢀 기둝
  • Beankong_
    Beankong's Devlog
    Beankong_
  • 전체
    였늘
    μ–΄μ œ
    • 전체 κΈ€ (146)
      • β›… Daily (0)
      • πŸ–₯️ Study Note (2)
        • C++ (1)
        • Unreal Engine (5)
        • Coding Test (123)
        • Design Patteren (5)
        • VCS (Git..) (1)
        • Server (1)
      • 🧭 Devlog (8)
        • μ˜€λ‹΅λ…ΈνŠΈ (4)
        • UE5 GameLift Server Test Project (1)
        • TIL (3)
  • λΈ”λ‘œκ·Έ 메뉴

    • 링크

    • 곡지사항

    • 인기 κΈ€

    • νƒœκ·Έ

      ν—¬ν…Œμ΄μ»€
      κ²Œμž„ 개발
      propertyaccess
      cpp
      UnrealEngine
      μ΅œλ‹¨ 거리 μ•Œκ³ λ¦¬μ¦˜
      κ·Έλž˜ν”„ 순회
      unrealengine build system
      UnrealEngine5
      ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
      μ•Œκ³ λ¦¬μ¦˜
      μ½”λ”©ν…ŒμŠ€νŠΈ
      그리디(greedy)
      κ²Œμž„ λͺ¨μž‘
      OnlineSubsystem
      unrealengine module
      κ²Œμž„ ν”„λ‘œκ·Έλž˜λ°
      ν”„λ£Œκ·Έλž˜λ¨ΈμŠ€
      κ²Œμž„ν”„λ‘œκ·Έλž˜λ°
      programmers
    • 졜근 λŒ“κΈ€

    • 졜근 κΈ€

    • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
    Beankong_
    κ²½λŸ‰(FlyWeight) νŒ¨ν„΄
    μƒλ‹¨μœΌλ‘œ

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”