๋“œ๋กœ์šฐ์ฝœ ๊ณ„์‚ฐ๋ฐฉ์‹

๋“œ๋กœ์šฐ์ฝœ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก Frame Rate๊ฐ€ ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์ ธ ์ตœ์ ํ™”์˜ ์ตœ์šฐ์„  ๊ณ ๋ ค์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

Drawcall์€ ๋ทฐํฌํŠธ์—์„œ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ ˆ๋ฒจ์— ๋ฐฐ์น˜๋˜์–ด์žˆ์ง€๋งŒ ์นด๋ฉ”๋ผ ์˜์—ญ ๋ฐ–์— ์žˆ์–ด์„œ ๋ทฐํฌํŠธ์— ๋‚˜์˜ค์ง€ ์•Š์œผ๋ฉด Drawcall๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ Static Mesh, ๊ฐ™์€ Material์€ ์ถ”๊ฐ€์ ์ธ Drawcall์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Material Instance๋Š” ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์•„๋„ ๋‹ค๋ฅธ Material์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ Static Mesh 2๊ฐœ๋ฅผ ๋ฐฐ์น˜ํ–ˆ์„ ๋•Œ, Mesh๋Š” ๊ฐ™๊ณ  Material์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ Drawcall์€ 3์ž…๋‹ˆ๋‹ค.

Emitter ํ•˜๋‚˜ ๋‹น ์˜ˆ์™ธ์—†์ด ์ถ”๊ฐ€์ ์œผ๋กœ Drawcall์€ 2์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰ ์™„์ „ ๋˜‘๊ฐ™์€ Emitter 2๊ฐœ๊ฐ€ ์žˆ์–ด๋„ 1๊ฐœ์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋˜์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ์ถ”๊ฐ€์ ์ธ Drawcall์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

flowchart TD
    subgraph "Static Mesh Drawcall ๊ทœ์น™"
        A["Static Mesh A<br/>Material M1"] --> B{๊ฐ™์€ Mesh?}
        C["Static Mesh A<br/>Material M1"] --> B
        B -->|YES| D{๊ฐ™์€ Material?}
        D -->|YES| E["โœ… Drawcall +0<br/>(์ธ์Šคํ„ด์‹ฑ)"]
        D -->|NO| F["โŒ Drawcall +1<br/>(๊ฐ๊ฐ ๋ณ„๋„)"]
    end
    
    subgraph "Material Instance ์ฃผ์˜์‚ฌํ•ญ"
        G["Material Master"] --> H["MI_Instance_A"]
        G --> I["MI_Instance_B"]
        H -.->|"๊ฐ™์€ ๋ถ€๋ชจ์—ฌ๋„<br/>๋‹ค๋ฅธ Material"| J["โŒ Drawcall ์ฆ๊ฐ€"]
        I -.-> J
    end
    
    subgraph "Emitter Drawcall ๊ทœ์น™"
        K["Emitter 1"] --> L["โŒ Drawcall +2"]
        M["Emitter 2<br/>(์™„์ „ ๋™์ผ)"] --> N["โŒ Drawcall +2"]
        O["Emitter 3<br/>(์™„์ „ ๋™์ผ)"] --> P["โŒ Drawcall +2"]
        L -.->|"๋ณ‘ํ•ฉ ์•ˆ๋จ<br/>๊ฐ๊ฐ ๋…๋ฆฝ์ "| Q["์ด Drawcall +6"]
        N -.-> Q
        P -.-> Q
    end

    style E fill:#90EE90,stroke:#333,stroke-width:2px
    style F fill:#FFB6C1,stroke:#333,stroke-width:2px
    style J fill:#FFB6C1,stroke:#333,stroke-width:2px
    style L fill:#FFB6C1,stroke:#333,stroke-width:2px
    style N fill:#FFB6C1,stroke:#333,stroke-width:2px
    style P fill:#FFB6C1,stroke:#333,stroke-width:2px
    style Q fill:#FF6B6B,stroke:#333,stroke-width:2px

Tip

stat RHI

Drawcall์˜ ํ• ๋‹น๋Ÿ‰(DrawPrimitive calls)์„ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋“œ๋กœ์šฐ์ฝœ ๋ฌธ์ œ์ 

์–ธ๋ฆฌ์–ผ ์—”์ง„์˜ ๋ Œ๋”๋ง ๊ณผ์ •์€ CPU๊ฐ€ ์„ ์ž‘์—…ํ•˜๊ณ  ๋„˜๊ฒจ์ฃผ๋ฉด GPU ํ›„์ž‘์—…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด ๋•Œ CPU๊ฐ€ ์ฒ˜๋ฆฌํ•  ์†Œ์Šค๊ฐ€ ๋งŽ์œผ๋ฉด GPU๋Š” CPU์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์œ ํ›„์ƒํƒœ(๋ƒ‰๊ฐ์ƒํƒœ) ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆด ํ”ฝ์…€์ด ๋งŽ๋‹ค๋ฉด ์ฝœ์˜ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ๊ฒฝ์šฐ์—๋„ ์ถฉ๋ถ„ํžˆ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœํŒŒ์ผ๋ง ๊ด€์ ์—์„œ Drawcall์ด ๋†’์œผ๋ฉด 80-90ํผ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.
  • Drawcall์€ ํ•˜๋“œ์›จ์–ด์ฝ˜์†”๊ณผ API๋ง๊ณค ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • Cash Memory๋Š” ํ”„๋กœํŒŒ์ผ๋ง์—์„œ ๋งค์šฐ ๋ฒ”์šฉ์ ์ž…๋‹ˆ๋‹ค.
    • ์ด๋ฒˆ์— ๋ณด๋‚ผ Call์˜ ๋‚ด์šฉ์„ ์ €์žฅํ•ด๋‘๋Š” ๊ฒƒ๋„ Cash Memory์˜ ํ•˜๋‚˜์˜ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.