Unity의 UI 시스템 (UGUI)의 성능 최적화
·
Unity/최적화
본 글은 Unity Korea의 3월 알쓸유잡 : Unity의 UI 시스템 (UGUI)의 성능 최적화 영상을 기반으로 작성되었습니다. 출처:https://www.youtube.com/watch?v=1e2mSCS7o1A UGUI 시스템 구조 및 개념 파악하기UGUI의 병목 (CPU 바운드 현상)UI 시스템의 성능 병목은 GPU보다 CPU에 걸리는 경우가 더 많다. 주요 CPU 바운드 원인은 다음과 같다.드로콜(Draw Call) 과다: 너무 많은 드로콜이 발생하여 CPU가 GPU에게 처리 명령을 내리는 부하가 증가한다.데이터 재구축 시간: 다른 모델링(책상, 의자 등)은 CPU에서 메시 데이터를 GPU에 넘기면 끝이다. 그러나 UI는 동적으로 변경될 때, 메시 데이터(버텍스)를 매 프레임 다시 계산하고 재..
CPU vs GPU, 메모리 최적화
·
Unity/최적화
본 글은 Unity Korea의 [유니티 TIPS] 알쓸유잡 | 병목 (Bottleneck) - CPU vs GPU, 메모리. 최적화 및 프로파일링 팁 영상을 기반으로 작성되었습니다. 출처:https://www.youtube.com/watch?v=o3o7fVCV4OA 병목 현상(Bottleneck)이란?병목 현상은 데이터 흐름의 파이프라인 중 가장 처리 속도가 느린 지점을 의미한다. 마치 물병의 좁은 목처럼, 전체 시스템의 흐름은 가장 느린 이 지점의 속도에 의해 결정된다. 드로우콜(Draw call)이란?CPU가 GPU에게 랜더링 명령을 내리는 것. 이때 OpenGL이나 DirectX11를 통해서 명령을 주게 된다. 화면에 다음과 같은 오브젝트를 그릴 때 순차적으로 그리게 된다. 이때 해당 오브젝..
Batching이란?
·
Unity/최적화
본 글은 Unity Korea의 [유니티 TIPS] 유니티 최적화를 위한 필수 기본기! Batching 방법 소개 영상을 기반으로 작성되었습니다. 출처: https://www.youtube.com/watch?v=w14yjBlfNeQ Draw CallCPU가 GPU에게 무엇을 그리라고(draw) 명령하는 호출을 Draw Call이라고 부른다. SetPassCPU가 GPU에게 무엇을 그리라(draw)고 지시하는 명령을 내릴 때 따라오는 데이터가 존재한다.이를 커맨드 버퍼라고 부른다. 이중 그래픽 관련 상태 데이터(Material, Shader 등)를 패키징한 그룹을 SetPass라고 부른다. SetPass Call드로우 콜을 내릴 때, 그래픽 관련 상태 데이터(Material, Shader 등)를 패키징하여..
MonoBehaviour
·
Unity
MonoBehaviour는 모든 Unity 스크립트가 파생되는 기본 클래스이다. 이를 통해 스크립트를 GameObject에 컴포넌트로 붙이고, 다양한 실행 이벤트(콜백)를 활용할 수 있다. Unity 엔진은 MonoBehaviour가 제공하는 콜백 함수(예: Start, Update, OnDestroy 등)를 호출한다. 이러한 흐름을 생명주기(Lifecycle)라 부른다. 생명주기 주요 함수다음은 MonoBehaviour에서 자주 사용하는 생명주기 함수와 호출 시점이다 Awake()스크립트 인스턴스가 로드되는 즉시 호출된다. 초기화 용도로 주로 사용한다.OnEnable()컴포넌트가 활성화될 때 호출된다. Awake 이후, 활성화 시점마다 실행된다.Start()첫 업데이트 직전에 한 번만 호출된다. 추가 ..
생명 주기
·
Unity
Unity 스크립트 생명주기씬 로드 -> 프레임 업데이트 전 -> 프레임 업데이트 루프로 나뉜다. 첫 번째 씬 로드 (First Scene Load)씬이 로드될 때, 씬에 포함된 모든 게임 오브젝트당 한 번씩 다음 이벤트들이 순차적으로 실행된다. Awake가장 먼저 호출되는 함수이다.프리팹이 인스턴스화된 직후 실행되며, 게임 오브젝트가 비활성 상태라면 활성화될 때까지 호출이 지연된다.OnEnableAwake 다음, 오브젝트가 활성 상태일 때 호출된다.MonoBehaviour 인스턴스가 생성되거나 씬이 로드될 때 실행된다.팁: 씬에 포함된 모든 오브젝트의 Awake와 OnEnable이 실행된 후에 Start, Update 등의 함수가 호출된다. Runtime 중 게임플레이 도중에 인스턴스화된 오브젝트는 이..
코루틴
·
Unity
코루틴코루틴(Coroutine)은 프레임 간 일시 정지 후 재개할 수 있게 해주는 기능이다. 특정 시점에 작업을 나눠 실행하거나, 시간·조건에 따라 흐름을 제어하는 데 유용하다. 코루틴은 메인스레드에서 실행되고 HTTP 전송, 에셋 로드, 파일 I/O 완료 등을 기다리는 것과 같이 긴 비동기 작업을 처리해야 하는 경우 사용하는 것이 가장 좋다. 예제일반 메서드로 구현했을 때의 문제void Fade(){ Color c = renderer.material.color; for (float alpha = 1f; alpha >= 0; alpha -= 0.1f) { c.a = alpha; renderer.material.color = c; }} 이 방식은 한 프레임 ..
Astar, JPS, JPS Plus 성능 비교 분석
·
Unity/최적화
문제점Angles 프로젝트에 서바이벌 모드를 추가했다. 대략 100~200마리 정도의 객체가 맵에 존재하고 모두 플레이어를 추적한다.이때 플레이어와의 거리가 멀어질수록 탐색해야할 노드의 개수가 급격히 증가한다. 맵 크기가 대략 42 x 82이므로 최악의 경우 3,444개의 노드를 탐색해야 한다.빨간 두 점 사이의 경로를 탐색했을 때, 프로파일링 결과를 확인해보자 (테스트 기종 - S23fe) A*의 경우 1회 탐색에 1.62ms가 걸리는 것을 확인할 수 있다. 추적하는 적의 객체가 50 ~ 100마리 정도만 되어도 심각한 프레임 드랍이 일어나는 것을 예상할 수 있다. 따라서 JPS, JPS+ 알고리즘을 활용하여 탐색 과정을 비교 분석 해보겠다. 수행 시간 비교 분석JPS의 경우 총 걸린 시간은 1...
ColorMemory 스크롤 기능 최적화
·
Unity/최적화
저사양 기기에서 개발 중인 게임을 테스트 하던 중 성능 문제가 생겼다.(테스트 기기 - Galaxy tab s6 lite) Horizontal, Vertical Scroll을 드래그 시 60fps 에서 30fps까지 떨어지는 문제가 있었다. 이번 글에서는 Unity Profiler 데이터를 바탕으로 성능 병목 현상을 분석하고, 그 원인과 해결 방법을 정리해보겠다. 원인프로파일러를 활용하여 병목 지점을 확인했다. UI, Rendering, Others 쪽에서 병목이 일어나는 것이 보인다. 좀 더 자세히 프로파일러 항목을 확인해보자UGUI.RenderingUpdateBatches - 32.38ms스크롤 시 Content 내부 UI 요소의 위치가 변경되면서 DirtyFlag가 활성화 된다.이후 Canva..
mealgyu
'unity' 태그의 글 목록