Graphics Optimization - zzragida/UnityDocs GitHub Wiki

์ปฌ๋ง(Culling)

  • ์ตœ์ข… ํ™”๋ฉด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๋ฌผ์ฒด๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์ด๋ฅผ ๋ Œ๋”๋ง ๋Œ€์ƒ์—์„œ ์ œ์™ธ์‹œ์ผœ ํ•„์š”ํ•œ ๋ฌผ์ฒด๋งŒ ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋ฒ•
  • ํ”„๋Ÿฌ์Šคํ…€ ์ปฌ๋ฆผ(Frustum Culling)
    • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์„œ๋„ ํšจ๊ณผ๊ฐ€ ์ข‹์€ ๋ฐฉ๋ฒ•
    • ์นด๋ฉ”๋ผ ์˜์—ญ๋‚ด์˜ ๊ณต๊ฐ„ ์ •๋ณด๋งŒ ์‚ด๋ ค๋‘๊ณ  ์˜์—ญ ์™ธ๋ถ€์— ์„ค์ •๋œ ์ •๋ณด๋Š” ๋ชจ๋‘ ๋ฒ„๋ฆผ
    • ์นด๋ฉ”๋ผ์— ํ”„๋กœ์ ํŠธ์— ์„ค์ •๋œ ๋ ˆ์ด์–ด๋ณ„๋กœ ์ฐจ๋‹จ ๊ฑฐ๋ฆฌ(Per-Layer Cull Distances)๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•ด ๋ ˆ์ด์–ด์— ์†ํ•œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ์ปฌ๋งํ•จ
  • ์˜คํด๋ฃจ์ ผ ์ปฌ๋ง(Occlusion Culling)
    • ๊ธฐ์กด์˜ ์ ˆ๋‘์ฒด๋ฅผ ์ด์šฉํ•œ ์ปฌ๋ง ๊ธฐ๋ฒ•์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ณต๊ฐ„ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•ด ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ธฐ๋ฒ•
    • Unity์˜ Windows => Occlusion Culling ๋ฉ”๋‰ด๋ฅผ ํ†ตํ•ด ์„ค์ •
    • ์˜คํด๋ฃจ์ ผ ์ปฌ๋ง ์ œ์ž‘๋ฐฉ๋ฒ•
      1. ์˜คํด๋ฃจ์ ผ ์˜์—ญ ์„ค์ •
      2. ์˜คํด๋ฃจ์ ผ ์ปฌ๋ง ๋ฐ์ดํ„ฐ ์ œ์ž‘
      3. ์ตœ์ข… ๊ฒฐ๊ณผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    • ์˜คํด๋ฃจ์ ผ ํฌํ„ธ(Occlusion Portal)
      • ์˜คํด๋ฃจ์ ผ ์˜์—ญ์„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์กฐ์ ˆํ•˜๋Š” ๊ธฐ๋Šฅ

๋“œ๋กœ์šฐ ์ฝœ ๋ฐฐ์นญ(Draw Call Batching)

  • ํ…์Šค์ณ ์•„ํ‹€๋ผ์Šค(Texture Atlas)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝœ์ˆ˜๋ฅผ ์ค„์ž„
  • ์„ฑ์งˆ์ด ๋™์ผํ•œ ๋ฌผ์ฒด๋“ค์„ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์™€ ์žฌ์งˆ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ†ตํ•ฉ
    • ์—ฌ๋Ÿฌ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉ”์‹œ๋ฅผ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ๋กœ ํ†ตํ•ฉํ•ด์ฃผ๋Š” CombineChildren ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณต
    • ์ตœ์ƒ์œ„ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‹ ์˜ค๋ธŒ์ ํŠธ๋“ค์ด ๊ฐ–๋Š” ๋ฉ”์‹œ๋“ค์„ ๋ถ„์„ํ•œ ํ›„ ์žฌ์งˆ๋ณ„๋กœ ๋ฉ”์‹œ๋ฅผ ํ†ตํ•ฉํ•ด ์žฌ๊ฐ€๊ณตํ•จ
    • ์ปด๋ฐ”์ธ ๋ฉ”์‹œ(Combined Mesh)๋ฅผ ํ†ตํ•œ ์ž‘์—…์‹œ ์ฃผ์˜ํ•  ์ 
      • ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ํ†ตํ•ฉํ•˜๋ฉด ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ณ„๋กœ ์›€์ง์ผ ์ˆ˜ ์—†๊ฒŒ ๋จ
      • ๊ด€๋ จ๋œ ๋น›์˜ ๊ณ„์‚ฐ์ด ํ†ตํ•ฉ๋œ ๋ชจ๋“  ๋ฉ”์‹œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰๋จ
    • ๋ฉ”ํ„ฐ๋ฆฌ์–ผ(Materials)
      • ๋‹ค๋ฅธ ํ…์Šค์ณ์— ์žˆ๋Š” ๋‘๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ๋ฉ”ํ„ฐ๋ฆฌ์–ผ์„ ํ•˜๋‚˜์˜ ํฐ ํ…์Šค์ณ๋กœ ๊ฒฐํ•ฉ ํ•  ์ˆ˜ ์žˆ์Œ(ํ…์Šค์ฒ˜ ์•„ํ‹€๋ผ์Šค)
      • ์ผ๋‹จ ํ…์Šค์ฒ˜๋ฅผ ๋™์ผํ•œ ์•„ํ‹€๋ผ์Šค๋กœ ๋ฌถ์œผ๋ฉด ๋‹จ์ผ ๋ฉ”ํ„ฐ๋ฆฌ์–ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
    • ๋ฐฐ์นญ(Batching)
      • ํ˜„์žฌ ์”ฌ์˜ ์ƒํ™ฉ์„ ํŒ๋‹จํ•ด ์ž๋™์œผ๋กœ ๋“œ๋กœ์šฐ ์ฝœ์„ ์ค„์ด๊ฒŒ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ

      • ์ •์  ๋ฐฐ์นญ Static Batching (Pro required)

        • Static ์˜ต์…˜์ด ์„ค์ •๋œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์—์„œ ๋™์ผํ•œ ์žฌ์งˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌผ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ๋‹ˆํ‹ฐ๋Š” ์ด๋“ค์„ ์ž๋™์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ๋กœ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•จ
        • ์›€์ง์ด์ง€ ์•Š๋Š” ๋ฌผ์ฒด์— ๋Œ€ํ•ด ์ง€์ •๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰
      • ๋™์  ๋ฐฐ์นญ Dynamic Batching

        • ์›€์ง์ด๋Š” ๋ฌผ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋™์ผํ•œ ์žฌ์งˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํŒ๋‹จํ•ด ์ž๋™์œผ๋กœ ๋ฉ”์‹œ๋ฅผ ํ†ตํ•ฉํ•ด ๋“œ๋กœ์šฐ ์ฝœ์„ ์ค„์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ
        • ์ด ์ •์ ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ 900๊ฐœ ๋ฏธ๋งŒ์ธ ๋ฉ”์‹œ๋ฅผ ์ง€๋‹Œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰๋จ
        • ๋ฉ”์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ ์™ธ์—๋„ ๋…ธ๋ฉ€, UV, ๋ผ์ดํŠธ๋งต UV ๋“ฑ ์ด 3๊ฐœ์˜ ์†์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์ •์ ์˜ ์ˆ˜๊ฐ€ 225๊ฐœ๋ฅผ ๋„˜์œผ๋ฉด ๋™์  ๋ฐฐ์นญ์ด ์ ์šฉ๋˜์ง€ ์•Š์Œ

์ตœ์ ์˜ ํผํฌ๋จผ์Šค๋ฅผ ์œ„ํ•œ ์บ๋ฆญํ„ฐ ๋ชจ๋ธ๋ง(Modeling Characters for Optimal Performance)

  • ์‹ฑ๊ธ€ ์Šคํ‚จ ๋ฉ”์‰ฌ ๋ Œ๋”๋Ÿฌ ์‚ฌ์šฉ

    • ๊ฐ ์บ๋ฆญํ„ฐ์— ์Šคํ‚จ ๋ฉ”์‰ฌ ๋ Œ๋”๋Ÿฌ(class-SkinnedMeshRenderer)๋Š” ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • Unity๋Š” ์‹œ์•ผ ์ปฌ๋ง ๋ฐ ๊ฒฝ๊ณ„ ๋ณผ๋ฅจ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ตœ์ ํ™”ํ•˜๊ณ , ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋Š” ํ•˜๋‚˜์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ปดํฌ๋„ŒํŠธ ๋ฐ ํ•˜๋‚˜์˜ ์Šคํ‚จ ๋ฉ”์‰ฌ ๋ Œ๋”๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋ธ์˜ ๋ Œ๋”๋ง ์‹œ๊ฐ„์€ ๋‘๊ฐœ์˜ ์Šคํ‚จ ๋ฉ”์‰ฌ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ํ•˜๋‚˜์˜ ์Šคํ‚จ ๋ฉ”์‰ฌ๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ๋ณด๋‹ค ๋Œ€๋žต 2๋ฐฐ ์ •๋„ ์ด๋ฉฐ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฉ”์‰ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์งˆ์ ์ธ ๋ฉ”๋ฆฌํŠธ๊ฐ€ ์žˆ๋Š” ์ผ์€ ๋“œ๋ญ…๋‹ˆ๋‹ค.
  • ๊ฐ€๋Šฅํ•œ ๋ฉ”ํ„ฐ๋ฆฌ์–ผ์„ ์ ๊ฒŒ ์‚ฌ์šฉ

    • ๊ฐ ๋ฉ”์‰ฌ์˜ ๋ฉ”ํ…Œ๋ฆฌ์–ผ์˜ ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ๋ฉ”ํ…Œ๋ฆฌ์–ผ์„ ์บ๋ฆญํ„ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฅธ ์‰์ด๋”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฟ ์ž…๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ˆˆ ๋ถ€๋ถ„์€ ํŠน์ˆ˜ ์‰์ด๋”).
    • ๊ทธ๋Ÿฌ๋‚˜ ์บ๋ฆญํ„ฐ์—์„œ ๋‘ ๊ฐœ ๋˜๋Š” ์„ธ ๊ฐœ์˜ ๋ฉ”ํ…Œ๋ฆฌ์–ผ๋กœ ๊ฑฐ์˜ ๋ชจ๋“  ์ผ€์ด์Šค์— ์ถฉ๋ถ„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋Šฅํ•œ ํ•œ ๋ณธ(Bones)๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉ

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

    • ํด๋ฆฌ๊ณค ์ˆ˜๋Š” ํ•„์š”ํ•œ ํ’ˆ์งˆ ๋ฐ ๋Œ€์ƒ ํ”Œ๋žซํผ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋ฐ”์ผ ์žฅ์น˜๋Š” ๋ฉ”์‰ฌ ๋‹น 300์—์„œ 1500 ํด๋ฆฌ๊ณค์œผ๋กœ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์Šคํฌํ†ฑ ํ”Œ๋žซํผ์—์„œ์˜ ์ด์ƒ์ ์ธ ๋ฒ”์œ„๋Š” 1500์—์„œ 4000 ์ •๋„์ž…๋‹ˆ๋‹ค.
    • ๋ฐ˜๋ฉด, ๊ฒŒ์ž„์— ๋งŽ์€ ์บ๋ฆญํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ๋ฉ”์‰ฌ ๋‹น ํด๋ฆฌ๊ณค์˜ ์ˆ˜๋ฅผ ์ค„์ผ ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, Half Life 2๋Š” ์บ๋ฆญํ„ฐ์— 2500 - 5000 ์‚ผ๊ฐํ˜• ์ˆ˜์˜€์Šต๋‹ˆ๋‹ค.
    • ํ˜„์žฌ PS3์™€ XBox 360์˜ ์ตœ๊ณ  ๋žญํฌ ๊ฒŒ์ž„์€ ๋ณดํ†ต ์บ๋ฆญํ„ฐ์— 5000์—์„œ 7000 ์‚ผ๊ฐํ˜• ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ํฌ์›Œ๋“œ ๋ฐ ์—ญ์šด๋™ํ•™์„ ๋ถ„๋ฆฌ

    • ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ž„ํฌํŠธ ๋  ๋•Œ, ๋ชจ๋ธ์˜ ์—ญ์šด๋™ํ•™(IK) ๋…ธ๋“œ๋Š” ํฌ์›Œ๋“œ ์šด๋™ํ•™(FK)์— ๋ฒ ์ดํฌ(baked)๋œ ๊ฒฐ๊ณผ๋กœ Unity๋Š” IK ๋…ธ๋“œ๊ฐ€ ์ „ํ˜€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋ธ์— ๋‚จ์•„์žˆ์œผ๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  CPU ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ์„ ํ˜ธ์— ๋”ฐ๋ผ Unity ๋˜๋Š” ๋ชจ๋ธ๋ง ๋„๊ตฌ, ์–ด๋А ๊ฒƒ์ด๋“  ์ค‘๋ณต IK ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ƒ์ ์œผ๋กœ๋Š” IK ๋ฐ FK ๊ณ„์ธต์„ ๋ชจ๋ธ๋ง ์‹œ์— ๋ณ„๋„๋กœ ๋ณด๊ด€ํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ IK ๋…ธ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ํ†ต๊ณ„ ์ฐฝ(Rendering Statistics Window) ํ™•์ธ

  • Time per frame and FPS
    • ํ•˜๋‚˜์˜ ๊ฒŒ์ž„ ํ”„๋ ˆ์ž„์„ ์ฒ˜๋ฆฌ ๋ฐ ๋ Œ๋”๋งํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„(ํ”„๋ ˆ์ž„/์ดˆ)
    • ์ด ์ˆซ์ž๋Š” ํ”„๋ ˆ์ž„ ์—…๋ฐ์ดํŠธ ๋ฐ ๊ฒŒ์ž„ ๋ทฐ์˜ ๋ Œ๋”๋ง์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„๋งŒ ํฌํ•จ๋˜๋Š” ๊ฒƒ์— ์œ ์˜
    • ์—๋””ํ„ฐ๊ฐ€ ์”ฌ ๋ทฐ ์ธ์ŠคํŽ™ํ„ฐ์˜ ๊ทธ๋ฆฌ๊ธฐ ๋ฐ ์—๋””ํ„ฐ ์ „์šฉ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์€ ํฌํ•จ๋˜์ง€ ์•Š์Œ
  • Batches
    • โ€œBatchingโ€ is where the engine attempts to combine the rendering of multiple objects into a chunk of memory in order to reduce CPU overhead due to resources switching.
  • Saved by batching
    • Number of batches that was combined. To ensure good batching, you should share materials between different objects as often as possible.
    • Changing rendering states will break up batches into groups with the same states.
  • Tris and Verts ๊ทธ๋ ค์ง„ ์‚ผ๊ฐํ˜•๊ณผ ์ •์ ์˜ ์ˆ˜. ์ด๊ฒƒ์€ optimizing for low-end hardware์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • Screen ํ™”๋ฉด ํฌ๊ธฐ, ์•ˆํ‹ฐ ์•จ๋ฆฌ์–ด์‹ฑ ๋ ˆ๋ฒจ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰.
  • SetPass ๋ Œ๋”๋ง ํŒจ์Šค์˜ ์ˆ˜. ๊ฐ ํŒจ์Šค์— ๋Œ€ํ•ด์„œ ์œ ๋‹ˆํ‹ฐ ๋Ÿฐํƒ€์ž„์€ CPU ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์‰์ด๋”๋ฅผ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.
  • Visible Skinned Meshes ๋ Œ๋”๋ง๋œ ์Šคํ‚จ ๋ฉ”์‰ฌ ์ˆ˜
  • Animations ์žฌ์ƒ ์—๋‹ˆ๋ฉ”์ด์…˜ ์ˆ˜

ํ”„๋ ˆ์ž„ ๋””๋ฒ„๊ฑฐ(Frame Debugger)

  • ๋ฉ”๋‰ด: Window > Frame Debugger
  • ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ทธ๋ฆฌ๋Š” ์˜ค๋ธŒ์ ํŠธ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์คŒ

์‰์ด๋” ๋กœ๋”ฉํƒ€์ž„ ์ตœ์ ํ™”(Optimizing Shader Load Time)

ํ•ญ์ƒ ํฌํ•จํ•˜๋Š” ์‰์ด๋”์™€ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•ด์•ผ ํ•˜๋Š” ์‰์ด๋” ์ง‘ํ•ฉ์„ ์„ค์ •ํ•˜์—ฌ ์‰์ด๋” ๋กœ๋”ฉ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ์คŒ

  • ํ•ญ์ƒ ํฌํ•จํ•˜๋Š” ์‰์ด๋”(Always Included Shaders)

    • Project Settings > Graphics > Always Included Shaders
  • ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‰์ด๋” ์ง‘ํ•ฉ(Preloaded Shader Variant Collection)

    • ์‰์ด๋” ์ง‘ํ•ฉ ์ƒ์„ฑ

    • Assets > Create > Shader Variant Collection

    • ์‰์ด๋” ์ง‘ํ•ฉ ๋ฏธ๋ฆฌ ๋กœ๋”ฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€

    • Project Settings > Graphics > Preloaded Shaders

ํ…์Šค์ฒ˜ ์บ์‹œ(Texture Cache)

  • ๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ GPU ์ œ์กฐ์‚ฌ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ํ…์Šค์ฒ˜ ํฌ๋ฉง์„ ์‚ฌ์šฉํ•˜๋ฉด ์บ์‹œ ์ ์ค‘๋ฅ ์ด ๋†’์•„์ ธ ์†๋„์˜ ํ–ฅ์ƒ์„ ์–ป๊ฒŒ ๋˜๋ฉฐ, ํŠนํžˆ GPU์˜ ์„ฑ๋Šฅ์ด ์•ฝํ•œ ์Šค๋งˆํŠธํฐ ๊ธฐ๊ธฐ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์˜์ฐจ์ด๊ฐ€ ํผ
  • ํ”Œ๋žซํผ๋ณ„ ๊ถŒ์žฅ ํ…์Šค์ฒ˜ ํฌ๋ฉง
  • ์•ˆ๋“œ๋กœ์ด๋“œ ํ…์Šค์ฒ˜ ์••์ถ• ์ง€์›
    • http://stackoverflow.com/questions/9148795/android-opengl-texture-compression/9514396#9514396
    • ETC1 (Ericsson texture compression)
      • This format is supported by all? Android phones.
      • But, It doesn't support an alpha channel, so can only be used for opaque textures.
    • PVRTC (PowerVR texture compression)
      • Supported by devices with PowerVR GPUs (Nexus S, Kindle fire ...)
    • ATITC (ATI texture compression)
      • Used in devices with Adreno GPU from Qaulcomm (Nexus One ...)
    • S3TC (S3 texture compression)
      • This texture compression is used in the NVIDIA chipset integrated devices (Motorola Xoom ...)
  • ์•ˆ๋“œ๋กœ์ด๋“œ Developer์— ์ •์˜๋œ ๋‚ด์šฉ
    • https://developer.android.com/guide/topics/graphics/opengl.html#textures
    • ATITC (ATC) - ATI texture compression
      • GL_AMD_compressed_ATC_texture
      • GL_ATI_texture_compression_atitc
    • PVRTC - PowerVR texture compression
      • GL_IMG_texture_compression_pvrtc
    • S3TC (DXTn/DXTC) - S3 texture compression
      • GL_OES_texture_compression_S3TC
      • GL_EXT_texture_compression_s3tc
      • GL_EXT_texture_compression_dxt1
      • GL_EXT_texture_compression_dxt3
      • GL_EXT_texture_compression_dxt5
    • 3DC - 3DC texture compression
      • GL_AMD_compressed_3DC_texture
// Texture compression supported on Android
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  Strings = gl.glGetString(GL10.GL_EXTENSIONS);
 
  if (s.contains("GL_IMG_texture_compression_pvrtc")) {
    // Use PVRTC compressed textures
  } else if (s.contains("GL_AMD_compressed_ATC_texture") ||
             s.contains("GL_ATI_texture_compression_atitc")) {
    // Use ATITC compressed textures
  } else if (s.contains("GL_OES_texture_compression_S3TC") ||
             s.contains("GL_EXT_texture_compression_s3tc")) {
    // Use DTX Textures
  } else {
    // Handle no texture compression founded
  }
}

ํ…์Šค์ฒ˜ ์„ค์ •

  • Texture
  • Normal map
  • Editor GUI and Legacy GUI
  • Sprite (2D and UI)
  • Cursor
  • Reflection
  • Cookie
  • Lightmap
  • Advanced

ํ…์Šค์ฒ˜ ํฌ๋ฉง์ง€์› ํ™•์ธ

  • Android ์žฅ๋น„์—์„œ ์ง€์›ํ•˜๋Š” ํ…์Šค์ฒ˜ ํฌ๋ฉง์„ ํ™•์ธํ•ด์„œ ์ ํ•ฉํ•œ Asset๋“ค์„ ๋‹ค์šด๋ฐ›๋Š” ํ˜•ํƒœ๋Š” ์–ด๋–จ๊นŒ?
  • http://docs.unity3d.com/ScriptReference/SystemInfo.SupportsRenderTextureFormat.html
  • UnityEngine.SystemInfo ํด๋ž˜์Šค์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

ํ…์Šค์ฒ˜ ์ƒ์„ฑํŒ

์˜ค๋ฒ„๋“œ๋กœ์šฐ(Overdraw)

  • ๋ฌผ์ฒด๊ฐ€ ๊ฒน์ณ์„œ ๋’ค์— ์žˆ๋Š” ๋ฌผ์ฒด๋ฅผ ๊ทธ๋ฆฐํ›„์— ์•ž์— ์žˆ๋Š” ๋ฌผ์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ฉด ๊ฒน์น˜๋Š” ๋ถ€๋ถ„๋งŒํผ ํ”ฝ์…€์„ ๊ณ„์‚ฐํ•ด์„œ ๊ทธ๋ ค์•ผ ํ•จ
  • ์ด๋ ‡๊ฒŒ ํŠน์ • ์˜์—ญ์˜ ํ”ฝ์…€์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์„ ์˜ค๋ฒ„๋“œ๋กœ์šฐ๋ผ๊ณ  ํ•จ
  • ๋ถˆํˆฌ๋ช…ํ•œ ๋ฌผ์ฒด์˜ ์˜ค๋ฒ„๋“œ๋กœ์šฐ๋ฅผ ์ค„์ด๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ฐ€์žฅ ํฐ ์˜์—ญ์„ ์ฐจ์ง€ํ•˜๋Š” ๋ฌผ์ฒด๋ฅผ ๋จผ์ € ๊ทธ๋ฆฌ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ

์œ ์šฉํ•œ ์—์…‹