ํฌ์ŠคํŠธ

Unity Optimization

Unity Optimization

๐Ÿ’ซ ๋จธ๋ฆฌ๋ง


๐Ÿ’ซ A


๊ณตํ†ต์  ์ตœ์ ํ™” ์ด์Šˆ
๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ ๋Œ€์ƒ
๊ฒฝํ—˜์ ์ธ ๋ถ€๋ถ„๋“ค์ด ๋งŽ์ด ํฌํ•จ๋จ

๐Ÿซง ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ  ์š”์†Œ

  • Shader Variants
  • Keyword๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด 2์˜ ์ง€์ˆ˜ ํ˜•ํƒœ๋กœ variant๊ฐ€ ์ฆ๊ฐ€
    • Keyword๊ฐ€ 10๊ฐ€ ๋งŒ ์žˆ์–ด๋„ 1024
    • Build in Shader๋‚˜ ์ƒ์šฉ Asset ์ˆ˜์ • ์‹œ keyword ์ฆ๊ฐ€ ์ฃผ์˜
  • Dynamic SHader Loading
    • Chunck ๋‹จ์œ„ Variants ์••์ถ•/ํ•ด์ œ
      • PlayerSetting / Shader Variant Loading Settings
      • ์œ ๋‹ˆํ‹ฐ ๋ธ”๋กœ๊ทธ๋ฅผ ํ†ตํ•ด์„œ๋„ ์†Œ๊ฐœ๋จ (2021)
  • Stripping ์ž๋™ ์ œ๊ฑฐ
    • Project Settings/Grapjjics
  • โ€ ์ง์ ‘ ์ œ๊ฑฐ
    • Play log์—์„œ variant ์ •๋ณด ์ถ”์ถœ
    • GraphicsStateCollection.BeginTrace (Unity6)
  • AssetBundle ๊ด€๋ จ๋ จ
  • PersistentManager.Remapper
    • Instance ID์™€ File GUID, Local ID mapping ์ •๋ณด
      • ๋Š˜์–ด๋‚˜๋ฉด ์ฆ์–ด๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ asset ๊ฐœ์ˆ˜ ์ตœ์†Œํ™”
  • SerialzedFile
    • Assetbundle metadata
  • ์žฅ๋ฉด์— ํ•„์š”ํ•œ asset๋งŒ ํฌํ•จ๋œ bundle ๊ตฌ์„ฑ (์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅ)
  • ๋™๊ธฐ Load๋œ bundle ๊ฐœ์ˆ˜ ์ œํ•œ
  • Instance ์ง์ ‘ ๊ด€๋ฆฌ๋กœ bundle ํ•ด์ œ (๊ฐœ๋ฐœ ๋น„์šฉ ์ƒ์Šน)
    • AssetBundle.UNload(False)
      • ์ด๋•Œ ๋กœ๋“œ๋œ ์ธ์Šคํ„ด์Šค๋“ค๋„ ๊ฐ™์ด ๋‚ด๋ ค๊ฐ€์„œ
    • Addressable - Custom assetbundle provider
      • ์ปค์Šคํ…€ ํ•„์š”
1
2
3
4
// AssetBundleProvider.cs

// 14๋ฒˆ์ค„
~ m_AssetBUndle.UnloadAsync(true); // ์ˆ˜์ •?

๐Ÿซง _

IL2CPP Metadata ์ผ๋ถ€ ๊ณ ์ •ํฌ๊ธฐ, ์ผ๋ถ€๋Š” ์‹คํ–‰ ์ค‘ ํฌ๊ธฐ ์ฆ๊ฐ€

  • ์ „์ฒด ๊ทœ๋ชจ ํ™”์ด
    • Platform seting ScriptBdebbuing ์„ค์ • (Debugging ์ •๋ณด ๋ถ€ํ•˜)
  • Native Profiler
    • il2cpp:: filtering
  • ๊ด€๋ จ ์„ฑ์ •
    • Managed Code Stripping - Medium
      • Medinum์ด๋ž‘ ๋‹ค๋ฅธ๊ฑฐ ์„ฑ๋Šฅ 20%์ฐจ์ด์ด
      • ์ฝ”๋“œ ์‚ญ์ œ ๋˜๋Š” ๊ฒฝ์šฐ
      • namespace ์„ค์ • ๊ฐ€๋Šฅ
    • IL2CPP Code Generation - Faster (smaller) builds
    • Package Manager - ๋ถˆํ•„์š”ํ•œ package, plugin ์ œ๊ฑฐ
      • Build ํ›„ ๋‹ค์Œ ๊ฒฝ๋กœ์˜ dllํฌ๊ธฐ๋กœ module ๋ณ„ ํฌ๊ธฐ ์œ ์ถ”
      • Library/Bee/artifact/(platform)

๐Ÿซง ๋‹จํŽธํ™” ๋ฌธ์ œ

  • ์žฆ์€ ์ž‘์€ ํ• ๋‹น์— ์˜ํ•œ 2๊ฐ€์ง€ ์ด์Šˆ
    • Memory hole์— ์˜ํ•œ amanaged heap ์ฆ๊ฐ€
    • ์ž‘์€ ํ• ๋‹น์— ์˜ํ•ด ๊ฑฐ์˜ ๋นˆ bucket์˜ ํ•ด์ œ ใ…‚ใ„น๊ฐ€
  • ์ผ๋ฐ˜์ ์ธ ๊ฐ€์ด๋“œ (๋‚œ์ด๋„ ์ƒ)
    • ์ˆ˜๋ช…์ด ๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๊ณ  ์ตœ๋Œ€ํ•œ ์œ ์ง€
    • ~
    • ~

๊ณ ๋ฏผํ•ด๋ณผ ๋งŒํ•œ ๋‚ด์šฉ

  • ํ• ๋‹น ๊ทœ๋ชจ์™€ ๋นˆ๋„๊ฐ€ ๋†’์€ ์ฃผ์š” ๊ตฌ๊ฐ„
    • Text data parsing - parsing ๋ณ„ string ํ• ๋‹น ๊ทœ๋ชจ ํ™•์ธ
    • ๋ช…์‹œ์  ์žฅ๋ฉด ์ „ํ™˜ - ์žฅ๋ฉด๊ฐ„ ๋นˆ ์žฅ๋ฉด ์ถ”๊ฐ€๋กœ heap ํ™•์žฅ ์–ต์ œ
      • ์ด์ „ ์”ฌ, ๋‹ค์Œ ์”ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋‘ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€
  • GarbageCollector..GCMode๋ฅผ ์‚ฌ์šฉํ•œ ํ•ด์ œ ์‹œ์  ๊ด€๋ฆฌ
    • (์‚ฌ๋ก€ ๋ถ€์กฑ์œผ๋กœ ๋น„์ถ”)
    • ๋™์‹œ ํ•ด์ œ๋ฅผ ํ†ตํ•œ ๋‹จํŽธํ™” ๊ฐ์†Œ ํšจ๊ณผ ใ„ฑ๋Œœ
    • ํ•ด์ œ ์‹œ์ ์˜ CPU ๋ถ€ํ•˜ ์ฃผ์˜

๐Ÿซง CPU Stuttering

์ฃผ์˜์  - Profiler Marker ์ˆ˜์ง‘ ๋ถ€ํ•˜

  • Call count์— ๋น„๋ก€ํ•œ ์˜ค์ฐจ ์ฆ๊ฐ€
    • ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ native profiler์˜ ๊ฒฐ๊ณผ์™€ ๊ผญ ๋น„๊ต
  • GC Allocation์˜ call stack ํ™•์ธ
    • Deep Profiler๋Œ€์‹  call stack ์˜ต์…˜ ์‚ฌ์šฉ

Shader.CreateGPUProgram
์‰์ด๋” ๋กœ๋“œ

Shader warmup

  • OpenGGL, DX11
    • Shader.WarmupAlShaders
    • ShaderVariantCollection.WarmUp
  • +
  • off ScreenRendering
    • ๊ฐ€์žฅ ์•ˆ์ „?

Instantiate

  • ์ตœ์ ํ™”
    • ์˜ค๋ธŒ์ ํŠธ ํ’€ ์‚ฌ์šฉ
    • Serialized field ๊ตฌ๋ชจ์— ๋น„๋ก€ํ•œ CPU ๋ถ€ํ•˜
    • ์ƒ์„ฑ์‹œ์ ๋ถ„๋ฆฌ ์˜ˆ) ์บ๋ฆญํ„ฐ ๋ Œ๋”๋Ÿฌ์™€ ์ •๋ณด
    • Object. Instantiate Async
      • Produce & Copy ๋น„๋™๊ธฐ (Deserialied ํฌ๊ธฐ) -> Job์œผ๋กœ ๋Œ๋ฆฌ๊ณ , AWake ๋น„๋™๊ธฐ

GC.Collect

  • GC allocation ์ œ๊ฑฐ๋กœ GC.Collect ์ง€์—ฐ
    • ํŠนํžˆ Update, ๋ฐ˜๋ณต๋ฌธ ๋น„๋ช…์‹œ์  ํ• ๋‹น (object.name ์ด๋Ÿฐ ๋ณต์‚ฌ๋ณธ ๋ฐ˜ํ™˜ ๋ฉค๋ฒ„ ์ฃผ์˜)
  • Incremental GC
  • ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ• GCMode ํ™œ์šฉ์— ๋Œ€ํ•œ์˜๊ฒฌ
    • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€์— ๋Œ€ํ•ด ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์‚ฌ์™•์ธ์ง€ ๊ฒ€ํ† 

๐Ÿซง ์ฃผ์š” CPU ๋ถ€ํ•˜ ์š”์ธ

์ฃผ์š” CPU ๋ถ€ํ•˜ ์š”์ธ

REndering

  • Draw ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ํ™œ์šฉ
    • **SBP Batcher, Instancing
    • Indirect draw, Batch Render Group API
    • GPI Resident Drawer (MeshRenderer, Foward*, Unity 7)
  • Cull
    • ์›๊ฑฐ๋ฆฌ ์ดˆ์†Œํ˜• ๋ฌผ์ฒด ๋ฐ ์‚ฌ์ „ ์ œ๊ฑฐ
      • Camera Cull
      • Light
      • ~
    • Culling Group (์žฅ๋ฉด ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์œ ํšจ, ๊ทธ๋ฆผ์ž ๋ฌธ์ œ)

UGUI

ํ•ต์‹ฌ ์ตœ์ ํ™” ๋ฐ ๊ณ ๋ ค์‚ฌํ•ญ

  • ๋™์  ์š”์†Œ์— ์˜ํ•œ Batc ๋น„์šฉ ์ตœ์†Œํ™”
    • ๋™์ .์ •์  ์š”์†Œ canvas ๋ถ„๋ฆฌ (Animator, Scroll , โ€ฆ)
  • Layout system ๋ถ€ํ•˜
    • ๊ณ„์ธต ๊ตฌ์กฐ ์ตœ์†Œํ™” ๋ฐ ๋น„ํ™œ์„ฑํ™”
  • REctMask2D cull query ๋ถ€ํ•˜
    • ๋Œ€์ƒ ์š”์†Œ ๊ทœ๋ชจ์— ๋น„๋ก€ํ•จ (ํŠนํžˆ Text ํฌํ•จ ์‹œ ๊ธ‰๊ฒฉํ•œ ์ฆ๊ฐ€ - ๊ธ€์ž ๋‹จ์œ„๋กœ Culling ํ•˜๊ธฐ ๋•Œ๋ฌธ์—)

Animator ~ ์‚ฌ์ง„ ์ฐธ๊ณ 
Job์„ ํ†ตํ•ด์„œ ๋Œ์•„๊ฐ€๋Š”๋ฐ
Event ๋“ฑ์„ ์“ฐ๋ฉด?? MainThread์—์„œ ๋Œ์•„๊ฐ€๋„๋ก ๋˜์–ด ์žˆ์Œ์Œ

Skinning ~ ์‚ฌ์ง„ ์ฐธ๊ณ  X

๊ธฐํƒ€
๋ถˆํ•„์š”ํ•œ ์นด๋ฉ”๋ผ
RenderObjects์— Override ? ์ปค์Šคํ…€ ๋ Œ๋” ํ”ผ์ฒ˜? ์‚ฌ์šฉ์— ๋”ฐ๋ผ์„œ๋Š” ..?

๋™์ผํ•œ REdnerer๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์ž‡๋Š”๋ฐ
์„œ๋ธŒ ์นด๋ฉ”๋ผ๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ,์ตœ์ ํ™”๋œ ๋ณ„๊ฐœ์˜ Renderer๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ..

๋ฌผ๋ฆฌ
Fixed UPdate

RayCase
D rawMesh๋Š” ์ง์  Culcingํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์ด ๊ณ ๋ ค

๐Ÿซง GPU ๋ถ€ํ•˜

PixelOVerDraw
์ฃผ๋กœ ๋ณต์žกํ•œ UI, Particle์—์„œ ๊ฒน์ณ์ ธ ์žˆ๋Š” ๋ถ€๋ถ„
ํŒŒํ‹ฐํด, ์ฃผ๋กœ Billboard๋ฅผ ์“ฐ๋Š”๋ฐ, ์™„์ „ ํˆฌ๋ช…ํ•œ ์˜์—ญ์ด ์žˆ์Œ
ํƒ€์ดํŠธํ•œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ

ํ›”์งˆ์ด ํ—ˆ์šฉํ•˜๋Š” ์„ ์—์„œ๋Š” ๋ณ‘ํ•ฉํ•ด์„œ,

UI, ๋ณต์žก๋„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์—
๊ผญ ๊ฐ€๋ ค์ง€๋Š” 1,2๊ฐœ ์ •๋„ ์žˆ๋Š”๋ฐ
๊ผญ ๊บผ์ฃผ์‹œ๊ณ 

Alpha 0 ์ผ๋•Œ ์•„์˜ˆ ๊บผ์ฃผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ
์ตœ์‹ ์™€์„œ๋Š” ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ์•ผ

Shader
SHader๊ฐ€ ๊ฐ€์ง€๋Š” Pixel Coverage
Native Profiler๋ฅผ ์“ฐ๋ฉด , ์‰์ด๋”, ์Šคํฌ๋ฆฐ ๊ธฐ์ค€์œผ๋กœ ํ”ฝ์…€? ์ด ์–ผ๋งˆ๋‚˜ ์“ฐ์ด๊ณ  ์žˆ๋Š” ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
์ง์ ‘ Shader ์ตœ์ ํ™” ํ•œ๋‹ค๊ณ  ํ–ˆ์„๋•Œ, ์ •์  ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜์‹œ๊ณ , ์‚ฌ์šฉ๋˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์ •๋ฐ€๋„?? ๋“ฑ์ด ํฌํ•จ๋˜๋Š”๋ฐ, ๋†’์€ ์ •๋ฐ€๋„์˜ ์ธ์ŠคํŠธ๋ ฅ์…˜์ธ ๊ฒฝ์šฐ ์ •๋ฐ€๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒฝ์šฐ ํšจ๊ณผ?? ์œ„์น˜๋‚˜ ์‹œ๊ฐ„๊ณผ ๊ณผ๋ จ๋œ ์ธ์ŠคํŠธ๋ ฅ์…˜์ธ ๊ฒจ์šฐ๋Š” ์ฃผ์˜๋ฅผ ํ•ด์•ผ ใ…Ž๋งˆ.

  • ๋™์  ๋ถ„๊ธฐ ์ œ๊ฑฐ?
    • ๋™๊ธฐ์„ฑ์„ ์œ„ํ•ด ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค?

ํ”ฝ์…€๋ณด๋‹ค ์ž‘์€ ์‚ผ๊ฐํ˜•์˜ ๊ฒฝ์šฐ 3๊ฐœ์˜ ๋ฒ„ํ…์Šค? ๋‚ญ๋น„๊ฐ€
Micro triangle

์ธก์ •์ด ์‰ฝ์ง€ ์•Š๋‹ค
๋ชจ๋ฐ”์ผ..?
HDRP๋งŒ ์ œ๊ณตํ•˜๋А ใ„ด์ค‘

NativePRofiler ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ ,์‰ฝ์ง€ ์•Š๋‹ค

์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์šด GPU ๋ถ€ํ•˜๋Š” ์ด๊ฒƒ์„ ์˜์‹ฌํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ซ B


5๊ฐ€์ง€ ๋‚ด์šฉ

์„ฑ๋Šฅํƒ€๊ฒŸ๋Ÿฌ์ •

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ Mindsetใ…‡๋ฅด ์„ฑ๋Šฅ ์ฃผ๋„์ ์œผ๋กœ
์„ฑ๋Šฅ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•  ๋•Œ๋Š”

ํƒ€๊ฒŸ ํ”„๋ ˆ์ž„ ํƒ€์ž„
์ด๊ฒƒ์„ ๋ฐ€๋ฆฌํƒ€์ž„ ๋‹จ์œ„๋กœ ์ƒ๊ฐํ•ด์•ผ ํ•จ
ํŠน์ • ํ”„๋ ˆ์ž„์„ ๋ Œ๋”๋ง/๋งˆ๋ฌด๋ฆฌ CPU์—์„œ ๋งˆ๋ฌด๋ฆฌใ…๋Š”๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‹œ๊ฐ„์ด ใ…“ใ„น๋ฆฌ๋Š” ์ง€ ์ค‘์š”ํ•˜๋‹ˆ๊นŒ์š”

์ฃผ์˜ํ•  ๋ถ€๋ถ„
ํŠน์ • FPS ์˜ˆ๋กœ 30์œผ๋กœ ํ•˜๋ฉด 33, 60์ด๋ฉด 16ms, 90ms 11ms ์ดˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค
๊ทธ๋ž˜์„œ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ์„ ํ•ด์•ผ

์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ?
FPS๊ฐ€ ์šธ๋ ์ด๋ฉด ๋””ํ„ฐ, ๋ฌผ๋ฆฌ, ์• ๋‹ˆ๋ฉ”์…˜ ๋“ฑ์ด ํŠ„๋‹ค

์„ฑ๋Šฅ ๋ฒ„ํผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค

๊ทธ ๊ฐ€์šด๋ฐ 65%๋งŒ ์จ์•ผ ํ•œ๋‹ค
๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๊ณ , ์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„ ์ €ํ•˜๋  ๋•Œ ๋ฒ„ํผ์—ญํ• ์„ ํ•œ๋‹ค
๋ฐœ์—ด, ๋“ฑ

์ˆจ์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์„ ๋‘ฌ์•ผ ํ•œ๋‹ค
๊ณต๊ฐ„์„ ๋‘ฌ์„œ ์ฟจ๋‹ค์šด ํ•  ์ˆ˜ ์ด์Ž…

๋ฒ„ํ‚ท์„ ์ „๋ถ€ ์“ฐ๋ฉด ์–ด๋ ต๋‹ค

33ms 21ms์ดˆ
60FPX 16 10ms ์ดˆ ๋“ฑ

๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์—์„œ ํ”„๋กœํŒŒ์ผ๋ง
์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ธฐ๊ธฐ (์ €๊ฐ€ ๊ณ ๊ฐ€ OS ใ…”์กฐ์ž ๋“œ๋ผ์ด๋ฒ„ ๋“ฑ)

์ผ๊ด€์„ฑ์žˆ๋Š” ํ”„๋กœํŒŒ์ผ๋ง์„ ์žฌํ˜„๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์—์„œ
์–ธ์ œ๋‚˜ ์ด์”ฌ์„ ์ž๋™์œผ๋กœ ์žฌ์ƒํ•˜๋ฉด์„œ ํ˜น์€ ๋ Œ๋”๋งํ•จ๋…€์„œ
์ผ๋ฐ˜์ ์ธ ๊ณ ๊ฐ์ฒ˜๋Ÿผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•ด์•ผ
์ผ๊ด€์„ฑ ํ™•๋ณด๊ฐ€ ์ค‘์š”ํ•˜๋‹ค

Profile early, oftne, and on the target device

ํ”„๋ฆฌํ”„๋กœ๋•์…˜, ๋“ฑ๋“ฑ ์„ฑ๋Šฅ ๊ฒ€์ฆ ๋“ฑ
๋ชจ๋ฐœ์ผ - ๋ชจ๋“  ๋””๋ฐ”์ด์Šค๊ฐ€ ์„ฑ๋Šฅ์ด ๋‹ค๋ฅด๊ณ  ๋ญ”๊ฐ€ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ๋ฅผ ์ฃผ๊ณ 
์—๋””ํ„ฐ ์žฌํ˜„ ๋ถˆ๊ฐ„์œผ

  • ๋ Œ๋” ํƒ€๊ฒŸ ์•„ํ‚คํ…์ผœ

Dedicated Graphics Memory
OldSchool
๋…ธํŠธ๋ถ, ์ปด ๋“ฑ ๊ฐœ๋ณ„์ ์ธ ์ฒ˜๋ฆฌ

์ด๊ฒŒ Old School ์ธ์ด์œ 
์ด์ œ ๋Œ€๋ถ€๋ถ„์€ Unified
CPU GPU ๊ณต์œ ํ•œ RAM์„ ์“ฐ๊ณ  ์žˆ๋‹ค๋Š” ๋œป

์•„๋‹Œ๊ฒฝ์šฐ๊ฐ€ ์ด๊ฒƒ์ด ์ •๋ง ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์“ฐ๊ณ  ์žˆ๋‹ค

PC, Labtop์€ ์ „๊ธฐ ์—ฐ๊ฒฐํ•˜๋ฉด ๋˜๋Š”๋ฐ
๋ชจ๋ฐ”์ผ์€ ๊ทธ๋ ‡์ง€ ์•Š์ฃ 

๊ทธ๋ž˜์„œ (ํƒ€์ผ ๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ค‘์š”
๋ Œ๋”๋ง์ด ํ™”๋ฉด ํ•œ ๋ฒˆใ…‡ ใ…”๊ทธ๋ฆฌ์ง€ ์•Š๊ณ , ํƒ€์ผ ์ƒ์œผ๋กœ ๋œ๋‹ค ?

์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ

์‹ค์ œ ๋ Œ๋”๋ง ์›Œํฌ ํ”Œ๋กœ์šฐ

์”ฌ์ด ๋ Œ๋”๋ง ๋˜๋ฉด ์”ฌ์ด ํ”„๋กœ์„ธ์‹ฑ์„ ํ•ž๋‹ค
๋ฒ„ํ…Œ๊ธ‹๊ฐ€ ์–ด๋–ค ์ˆซใ„ด์„œ๋กœ ๋ Œ๋”๋ง ๋˜์–ด์•ผ ํ•˜๋Š”์ง€

์นด๋ฉ”๋ผ ์•ˆ๋ณด์ด๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค๋˜์ง€ Culling ๋“ฑ์„

๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ Ram์ชฝ์œผ๋กœ

์ด๊ฒƒ์„ GPU๊ฐ€ ์ฝ์–ด๋‚ธ๋‹ค Struct Resoruces

ํƒ€์ผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์“ฐ๊ฒŒ ๋˜๊ณ 

Vertex, Fragment SHader๋ฅผ ์“ฐ๊ณ 
์ „๋ถ€ ๊ธฐ์–ตํ•˜์ง€๋Š” ์•Š์•„๋„ ๋˜๊ณ 

ํ•˜๋‚˜ํ•˜๋‹ ํ”„๋ ˆ์ž„์— ๊ณ„์† ์นดํ”ผํ•˜๊ณ  ์ฝ์–ด๋‚ด๊ณ  ๋ฐ”๋…น๋˜๊ธฐ ๋•Œ๋ฌธ์—

๋‚˜๋ˆ ์„œ ํšจ์œจ์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”

๋„ˆ๋ฌด ๋งŽ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค (๋ฐ์ดํ„ฐ ์นดํ”ผ, ์ฝ๋Š” ๊ณผ์ •)

  • ํ”„๋กœํŒŒ์ผ ํˆด

Project Auditor
์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ
WIP
์ฝ”๋“œ ์ด์Šˆ๊ฐ€ ๋ญ๊ฐ€ ์žˆ๋Š”์ง€, ๊ทธ ๊ฐ•๋„๋Š” ์–ด๋–ค์ง€ ๋“ฑ ์ •์ ์ธ ๋ถ„์„
๋Ÿฐํƒ€์ž„์ด ์•ˆ๋ฆฌ ใ…์ตœ์ ํ™” ์ฒซ๊ฑธ์Œ์œผ๋กœ ใ…—๊ฒŒ๋œใ„ด

Profiler

Frame Debugger ์œ ๋‹ˆํ‹ฐ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ญ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฒŒ์–ด์ง€๊ณ  ์žˆ๋А์ง€ ๋“ฑ
์ž์„ธํ•˜์ง„ ์•Š์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ๋˜๊ณ  ์žˆ๊ฑฐ๋‚˜

Shader DrawCall Batching ๋“ฑ์„ ๋””๋ฒ„๊น… ๊ฐ„์œผ

Frame Debugger ์ข€ ๋”

์–ด๋–ป๊ฒŒ ์”ฌ์ด ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
Bath, Batch Break๊ฐ€ ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ๋˜๋А์ง€ ์•ˆใ„น ์ˆ˜ ์žˆ๊ณ 
๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์„ ์‹œ์ž‘์œผ๋กœ ~

์—ญ์—๋Š” GPU Profierl
์ถ”์ฒœ๋˜๋Š” ๊ฒƒ์€ (์œ ๋‹ˆํ‹ฐ์—์„œ๋„ ์“ฐ์ด๋Š”) RenderDOc AOD Metal GPI Debugger IOS

RenderDOc ์˜ˆ์‹œ

TimeLine ๋“ฑ์ด ์žˆ๊ณ  (์ด๋ฒคํŠธ๋“ค)
์ขŒ๊ธใ„ฑ ์ƒ๋‹จ์—๋Š” Event ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์žˆ๋‹ค
์–ด๋А์ •๋„ ๋А๋ฆฌ๊ฒŒ ์ง„ํ–‰์ด ๋˜๋Š”ใ„ท, ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ๊ฐ์˜ ์ฝœ๋“ค์ด ๊ทธ๋ž˜ํ”ฝ์Šค ์ฝœ์—์„œ ์–ผ๋งˆ๋‚˜ ์ฐจ์ง€ํ•˜๋Š”์ง€ (์Œ๋Œ€์ ์œผ๋กœ (์ ˆ๋Œ€ X))

๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅธ์ชฝ์€ ํ…์Šค์ณ ๋ทฐ์–ด
์‹ค์ œ๋กœ ์–ด๋–ค Output์ด ๋‚˜์˜ค๋Š”์ง€
๋А๋ฆฐ๋ฐ ๋ญ˜ ๊ทธ๋ฆฌ๊ณ  ์žˆ๋Š”๊ฑด์ง€?

๋“ฑ์„ ์•Œ๋ ค์ฃผ๋Š”

๊ตฌ์ฒด์ ์œผ๋กœ ํ•˜๋ฉด ๋์ด ์—†๊ณ 
ํ•ต์‹ฌ์€ ์‹œ์ž‘์„ ์žก์„ ์ˆ˜ ์žˆ๋‹ค

  • ์„ฑ๋Šฅ์ €ํ•˜ ๊ทธ๋ž˜ํ”ฝ ์‹ค์ˆ˜๋“ค

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ํ•œ๋‹ค๋Š” ๊ฒƒ

Mesh Mistiakes

๋ณต์žกํ•œ ์ง€์˜ค ๋ฉ”ํŠธ๋ฆฌ๋Œ€์‰ฌ

๋งŽ์€ ์‚ผ๊ฐํ˜•
์‚ผ๊ฐํ˜•์˜ ํ˜•ํƒœ๋„ ์ค‘์š”ํ•˜๋‹ค
๋ชจ๋ฐ”์ผ์€ ํƒ€์ผ ๊ธฐ์ค€์œผ๋กœ ํ™”๋ฉด์„ ์ชผ๊ฐœ๋Š”๋ฐ, ์ด ์‚ผ๊ฐํ˜•์ด ํƒ€์ผ์— ๋”ฑ ๋งž์•„ ๋–จ์–ด์ง€๋ฉด ์ข‹์„ ์ˆ˜๋ก ์ข‹๋‹ค
๋‚ฉ์ž‘ํ•œ ๊ฒŒ ์ข‹๋‹ค?
์™„๋ฒฝํ•˜๋ฉด GPU๊ฐ€ ๋” ํšจ์œจ์ ์œผใ…—ใ„น ๊ฐ€๋Šฅ

๋งˆ์ดํฌ๋กœ ์‚ผ๊ฐํ˜•
์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์‚ผ๊ฐํ˜• (ํ•˜๋‚˜์˜ ํƒ€์ผ์— ์—„์ฒญ ๋งŽ์Œ)

LOD๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•ˆํ” ๊ฒƒ
ํƒ€์ผ ๋ Œ๋”๋ง์„ ์‹ญ๋ถ„ ํ™”๋ฃกํ•˜๋ ค๋ช… LOD

์นด๋ฉ”๋ผ ์‚ฌ์šฉ ์ˆซ์ž ์ค„์—ฌ์•ผํ•œ๋‹ค
2๊ฐœ ์ด์ƒ์€ ํ•˜๋‚˜๋กœ ์ค„์ผ์ˆ˜์žˆ๋ƒ ์–ธ์ œ๋‚˜ ๋ฌผ์–ด๋ณธ๋”” - ์—„์ฒญ ๋ณต์žกํ•˜๊ธด ํ•˜์ฃ  CPU ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—„์ฒญ ๊ฑธ๋ฆฐ๋‹ค

์ปฌ๋ง ๋ ˆ์ด์–ด๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ
Read/Write enabled ํ™”์„ฑํ™” ํ•˜์ง€ ์•Š๊ธฐ?
-> ์›๋ž˜ ํ…์Šค์ณ ๋ฐ์ดํ„ฐ๋Š” GPU์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก GPU ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผ, ์œ ์ € ์Šคํฌ๋ฆฝํŠธ์—์„œ Texture.GetPixel/SetPixel() ํ•˜๊ธฐ์œ„ํ•ด CPU์—๋„ ๋ฉ”๋ชจ๋ฆฌ ์˜ฌ๋ ค๋†“์„์ง€ ์—ฌ๋ถ€ ์˜ต์…˜ (๊ธฐ๋ณธ ๋น„ํ™œ์„ฑํ™”) -> Mesh๋„

ํ…์Šค์ณ ์‹ค์ˆ˜๋“ค
Max Size๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

  • ๋‚ด๋ถ€ ์ง€์‹? ๊ตํ›ˆ?

๐Ÿ’ซ ๋ฉ”๋ชจ


MipMap
2์˜ ๋ฐฐ์ˆ˜๋กœ ์ž‘์•„์ง€๋Š” (๋‹ค ํ•ฉ์ณ์„œ ์›๋ณธ์˜ 33% ์ •๋„?)
์นด๋ฉ”๋ผ ๊ฑฐ๋ฆฌ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ

๐Ÿซง ์ฐธ๊ณ 

  • UNTIE SEOUL 2025
    • โ€˜๋ฅ˜ํƒœ๊ทœโ€™: โ€˜Unity ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์‹œ ๋ฐ˜๋“œ์‹œ ์ฒดํฌํ•ด์•ผ ํ•  ์ตœ์ ํ™” ๊ด€๋ จ ๊ธฐ๋Šฅ ๊ณต์œ โ€™
    • โ€˜Elbert Perezโ€™: โ€˜๋ถ€๋“œ๋Ÿฌ์šด ๋ชจ๋ฐ”์ผ ๊ฒŒ์ž„: ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•œ ๊ทธ๋ž˜ํ”ฝ ์ตœ์ ํ™”โ€™

Canvas ์ง์ ‘ ์›€์ง์ด๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ
Canvas ๋‚ด Element๋ฅผ ์›€์ง์ด๋Š” ๊ฒƒ์€ Rebuild

RenderTexture ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ์นด๋ฉ”๋ผ ๊บผ์ ธ์žˆ์–ด๋„ ๋ Œ๋”๋ง?

Disclaimer

CameraStacking URP

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.