Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Optimizing Graphics Performance<br />그래픽 퍼포먼스가 낮아지는 이유는?<br />그려지는갯수? (화면상픽셀* 드로우 횟수)<br />쉐이더 연산?<br />버텍스 개수?<br />Draw ...
Draw calls<br />많은 수의 오브젝트들은 CPU의 부하를 주고, 많은 수의 triangle들은 GPU의 부하를 가져다 준다.<br />더해서 게임 코드를 위해서 또한 CPU가 필요.<br />오늘날에 그래픽 ...
Combining<br />씬내에 많은 수의 오브젝트들 – bad.<br />근접해 있는 오브젝트들간에 combine – good.<br />“너무 많은 combine” – bad again.<br />
Good Combining<br />Combined objects are close to each other and use the same meterial<br />Combine의 쉬운 예시로써는 집에 있는 방들 배치 ...
Bad Combining<br />서로간에 멀리떨어진 오브젝트의 경우 절대 하지 말것.<br />If light shines only on part of object, whole object needs to be dra...
Combining Demo<br />No combine<br />
Combining Demo<br />Combine all<br />
Combining Demo<br />Combineclose<br />
Lights are for?<br />동적라이팅과정적라이트맵을합치는것.<br />라이트맵은 월드상에 고정적 빛 요소를 모두 제거 해준다.<br />빠르고 비주얼도 좋다.<br />그럼 동적 빛은 언제 써야할까? 로켓, ...
Raycasting<br />레이캐스팅은 느려지며 각 프레임 별로 레이 캐스트 남용하지 말것.<br />컬링 마스크를 사용함으로써 레이캐스팅을 미리 방지 할 수 있다.<br />3프레임당 한번씩만 레이캐스팅을하는것은 어...
Finding objects<br />FindObjectsOfType, FindGameObjectWithTag, GameObject.Find<br />Avoid doing it too much. It’s convenie...
Only Update nearby objects<br />Don’t run scripts at all, when far away.<br />Function Update() { if(far away) return; }do...
Math<br />Add, substract, multiply: a couple cycles.<br />Divide : 30-40 cycles.<br />Square root, sin, cos:60-100cycles<b...
Total Boids Demo<br />Slow- 1.9FPS<br />
Total Boids Demo<br />Slow - code<br />// Slow<br />var neighbors = GameObject.FindGameObjectsWithTag("Vehicle");<br />// ...
Total Boids Demo<br />1.Built-in array – 13.1FPS<br />
Total Boids Demo<br />1.Built-in array – 13.1FPS<br />function ApplySeparation () {<br />/// OPTIMIZATION<br />/// Use bui...
1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />Total Boids Demo<br />
1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />Total Boids Demo<br />static function UpdateCachedPositions...
1.Built-in array – 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />Total Boids Demo<br />
1.Built-in array – 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />Total Boids Demo<br...
1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />4.Precompute optima...
1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />4.Precompute optima...
Upcoming SlideShare
Loading in …5
×

Unity performanceoptimzation

2,698 views

Published on

Unity performanceoptimzation

Published in: Spiritual, Technology
  • Be the first to comment

Unity performanceoptimzation

  1. 1. Optimizing Graphics Performance<br />그래픽 퍼포먼스가 낮아지는 이유는?<br />그려지는갯수? (화면상픽셀* 드로우 횟수)<br />쉐이더 연산?<br />버텍스 개수?<br />Draw calls?<br />
  2. 2. Draw calls<br />많은 수의 오브젝트들은 CPU의 부하를 주고, 많은 수의 triangle들은 GPU의 부하를 가져다 준다.<br />더해서 게임 코드를 위해서 또한 CPU가 필요.<br />오늘날에 그래픽 처리 장치는 초당 500 개의 draw call들 정도면적당하다.<br />각각의 픽셀 조명은 메쉬를한번더 그리게 되므로, 절대 많은 수의 픽셀 조명을 사용하지 말것!<br />
  3. 3. Combining<br />씬내에 많은 수의 오브젝트들 – bad.<br />근접해 있는 오브젝트들간에 combine – good.<br />“너무 많은 combine” – bad again.<br />
  4. 4. Good Combining<br />Combined objects are close to each other and use the same meterial<br />Combine의 쉬운 예시로써는 집에 있는 방들 배치 같은경우<br />Often requires using texture sheets!<br />오브젝트 크기와 포인트/SPOT 라이트 크기가 같은 경우<br />
  5. 5. Bad Combining<br />서로간에 멀리떨어진 오브젝트의 경우 절대 하지 말것.<br />If light shines only on part of object, whole object needs to be drawn.<br />만약 조명이 오브젝트의 부분에만 드리워지면전체 오브젝트는 그려져야만 함.<br />If camera sees only a tiny corner of object,<br />만약 카메라가 오브젝트 코너에 작은 영역만을 보는 경우<br />Whole object needs to be drawn.<br />전체 오브젝트가 그려질 필요가 있는경우<br />
  6. 6. Combining Demo<br />No combine<br />
  7. 7. Combining Demo<br />Combine all<br />
  8. 8. Combining Demo<br />Combineclose<br />
  9. 9. Lights are for?<br />동적라이팅과정적라이트맵을합치는것.<br />라이트맵은 월드상에 고정적 빛 요소를 모두 제거 해준다.<br />빠르고 비주얼도 좋다.<br />그럼 동적 빛은 언제 써야할까? 로켓, 횟불, 동적 그림자등..<br />Culling masks!<br />
  10. 10. Raycasting<br />레이캐스팅은 느려지며 각 프레임 별로 레이 캐스트 남용하지 말것.<br />컬링 마스크를 사용함으로써 레이캐스팅을 미리 방지 할 수 있다.<br />3프레임당 한번씩만 레이캐스팅을하는것은 어떨까?<br />컬링 마스크 = GUI : Layername부여.<br />
  11. 11. Finding objects<br />FindObjectsOfType, FindGameObjectWithTag, GameObject.Find<br />Avoid doing it too much. It’s convenient but those calls can quickly add up.<br />Use static variable<br />모든 활성화된 컴포넌트들을 static ArrayList와 OnEnable/OnDisable을 사용해서 저장 할 것.<br />
  12. 12. Only Update nearby objects<br />Don’t run scripts at all, when far away.<br />Function Update() { if(far away) return; }does NOT count.Use enabled = false;<br />Use triggers for finding out when player is close by or use coroutine that updates every seconds.<br />오브젝트가 근접했는지를 알아내기 위하여 Trigger를 사용또는 매초마다코-루틴 사용 <br />
  13. 13. Math<br />Add, substract, multiply: a couple cycles.<br />Divide : 30-40 cycles.<br />Square root, sin, cos:60-100cycles<br />Sqrt, Normalize<br />In inner loops avoid Sqrt and Normalize. They are faily expensive. (Normalize internally uses Sqrt)<br />Normalize = vec / sqrt(vec.x^2 + vec.y^2 + vec.z^2); use sqrMagnitude instead.<br />If(distance > dif.magnitude) Bad!<br />If(distance*distance > dif.sqrMagnitude)<br />
  14. 14. Total Boids Demo<br />Slow- 1.9FPS<br />
  15. 15. Total Boids Demo<br />Slow - code<br />// Slow<br />var neighbors = GameObject.FindGameObjectsWithTag("Vehicle");<br />// Slow<br />varavgVelocity = Vector3.zero;<br />for (var i=0;i<neighbors.Length;i++)<br />{<br />avgVelocity += neighbors[i].GetComponent(VehicleTags).velocity;<br />}<br />function ApplySeparation () {<br />// Slow<br />var neighbors = GameObject.FindGameObjectsWithTag("Vehicle");<br />// Slow<br />var separate = Vector3.zero;<br />for(var i=0; i<neighbors.Length; i++) {<br />varposDiff = transform.position - neighbors[i].transform.position;<br />separate += posDiff.normalized * (1.0 / (posDiff.sqrMagnitude + 0.5));<br />}<br />separate.Normalize();<br />separate *= separateForce;<br />steeringForce += separate;<br />}<br />
  16. 16. Total Boids Demo<br />1.Built-in array – 13.1FPS<br />
  17. 17. Total Boids Demo<br />1.Built-in array – 13.1FPS<br />function ApplySeparation () {<br />/// OPTIMIZATION<br />/// Use builtin array containing the vehicles instead of FindWithTag<br />var separate = Vector3.zero;<br />for(var i=0; i<allVehicles.Length; i++) {<br />varposDiff = transform.position - allVehicles[i].transform.position;<br />separate += posDiff.normalized * (1.0 / (posDiff.sqrMagnitude + 0.5));<br />}<br />separate.Normalize();<br />separate *= separateForce;<br />steeringForce += separate;<br />}<br />
  18. 18. 1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />Total Boids Demo<br />
  19. 19. 1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />Total Boids Demo<br />static function UpdateCachedPositions ()<br />{<br />if (cachedPosition == null)<br />cachedPosition = new Vector3[allVehicles.length];<br />for (var i=0;i<cachedPosition.length;i++)<br />{<br />cachedPosition[i] = allVehicles[i].transform.position;<br />}<br />}<br />function ApplySeparation () {<br />var separate = Vector3.zero;<br />/// Optimizations<br />/// * Cache position of our selves (no transform.position)<br />/// * Cache position of other in an array updated once per frame (no transform.position)<br />var position = transform.position;<br />for(var i=0; i<allVehicles.Length; i++) {<br />varposDiff = position - cachedPosition[i];<br />separate += posDiff.normalized * (1.0 / (posDiff.sqrMagnitude + 0.5));<br />}<br />…<br />}<br />
  20. 20. 1.Built-in array – 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />Total Boids Demo<br />
  21. 21. 1.Built-in array – 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />Total Boids Demo<br />function ApplySeparation () {<br />var separate = Vector3.zero;<br />/// OPTIMIZATION<br />/// * Don't use Sqrt in innner loops<br />var position = transform.position;<br />for(var i=0; i<cachedPosition.Length; i++) {<br />// Don't use Sqrt in innner loops<br />// Save 1 division, 1 sqr root<br />varposDiff = position - cachedPosition[i];<br />separate += posDiff / (posDiff.sqrMagnitude + 0.5);<br />}<br />…<br />}<br />
  22. 22. 1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />4.Precompute optimazation – 64.3FPS<br />Total Boids Demo<br />
  23. 23. 1.Built-in array - 13.1FPS<br />2.CachePosition – 33.5FPS<br />3.Magnitude optimazation – 46.5FPS<br />4.Precompute optimazation – 64.3FPS<br />Total Boids Demo<br />static function UpdateCachedPositions ()<br />{<br />if (cachedPosition == null)<br />cachedPosition = new Vector3[allVehicles.length];<br />avgVelocity = Vector3.zero;<br />for (var i=0;i<cachedPosition.length;i++)<br />{<br />cachedPosition[i] = allVehicles[i].transform.position;<br />avgVelocity += allVehicles[i].velocity;<br />}<br />avgVelocity /= allVehicles.Length;<br />}<br />function ApplyAlignment () {<br />/// Optimizations<br />/// Precompute average velocity once per frame, no need to go through array<br />var align = avgVelocity - velocity;<br />align.Normalize();<br />align *= alignmentForce;<br />steeringForce += align;<br />}<br />

×