유니티
[Unity] 최적화 Batching, Draw Call, SetPass calls
Batching(배칭) 동일한 메테리얼을 공유하는 복수의 드로우콜을 하나로 묶어서 드로우콜하는 기법 Batching = Draw Call + SetPass calls Draw Call(드로우콜) CPU가 GPU에게 화면에 오브젝트를 그려달라고 요청하는 것 한프레임에서 오브젝트를 하나 그릴때 여러 정보들이 CPU에서 GPU로 전달 DATA > Storage(HDD,SDD,SD) > CPU Memory > GPU Memory 매 프레임 화면에 그려야 하기 때문에 값이 클수록 프레임에 부하가 걸린다. 적정개수 PC : 1000개 이상 가능 ~ 3000개 모바일 : 100개도 많다. 최신 디바이스는 200개까지가능 일반적으로 오브젝트 단위로 1개씩 증가, 쉐이더에 따라서 추가적으로 증가 SetPass calls..
[Unity] 생명 주기
Reset : 오브젝트를 생성 후 인스펙터 뷰에서 리셋을 눌러줄 때 실행된다. 객체의 속성을 초기 값으로 설정해 줄 때 사용한다. Awake : 스크립트가 실행될 때 한번만 호출된다. 모든 오브젝트가 초기화 된 후 호출되기 때문에 GameObject.Find 같은 명령문을 안전하게 사용할 수 있다. Awake 함수는 언제나 Start 함수 전에 호출되므로 초기화 순서를 정할 수 있게 한다. (Coroutine 사용 불가) OnEnable : 인스펙터뷰에서 체크를 통해서 게임 오브젝트를 활성화 할 때 사용된다. 활성화 할 때마다 호출 된다. Start : Update 함수가 호출되기 전에 한번만 호출된다. 다른 스크립트의 모든 Awake가 모두 실행된 이후에 실행된다. 스크립트가 활성화 되어 있어야한다. ..
[Unity] 애니메이션 타입 legacy로 변경하기
1) 외부에서 import한 모델의 경우 import settings의 rig탭에서 애니메이션 타입을 선택할 수 있다. 2) 유니티에서 애니메이션을 생성한 경우에는 다른 방법으로 애니메이션 타입을 변경 해야한다. 아래 예에서 오브젝트의 애니메이션을 생성하였다. 3) controller와 anim파일이 생성되었고 4) 오브젝트에 animator 컴포넌트가 추가된 것을 확인할 수 있다. 5) 이 게임 오브젝트의 애니메이션 타입을 legacy로 변경하려면 먼저 인스펙터에서 아래이미지 우측상단에 표시한 아이콘을 클릭하고 debug를 선택한다. 6) 애니메이션(text.anim)를 선택하고 legacy에 체크하면된다(이 항목은 debug모드에서만 확인가능하다) 유니티에서 애니메이션 타입 legacy로 변경하기 (..
[Unity] 그래픽스 최적화 - 드로우콜과 배칭
01. Draw Call 드로우콜은 수많은 병목 중 하나의 원인일 뿐,, 반드시 병목이 드로우콜에서 일어난다고 단정지어서는 안됨. 드로우콜이 강조되는 이유는 대부분 병목의 원인이 드로우콜에 있기 때문. 드로우 콜이란? CPU가 GPU에게 이거 그려! 하고 명령을 호출하는 것. 더 자세하게 ? 한 프레임의 렌더링은 매 오브젝트를 순차적으로 그려주면서 오브젝트를 다 그리면 화면에 보여지게 되는 것. 오브젝트를 화면에 렌더링하기 전에 우선 해당 오브젝트가 렌더링 대상에 포함되는지 체크한다. 현재 프레임 상에서 해당 오브젝트가 카메라의 시야 밖에 있다면 안 그려도 되는 것이므로 렌더링 대상에서 제외한다. 이런 검사 과정을 Culling이라고 한다. 컬링을 거친 오브젝트가 렌더링되려면 CPU로부터 GPU에게 정보..
[Unity] 그래픽스 최적화 - 병목
01. 병목의 이해 성능 최적화란? 적은 자원을 사용하더라도 연산 효율이 높아지도록 최적의 성능을 이끌어 내는 것. 최적화를 위해 할 수 있는 노력들은... Mesh의 Vertex 줄이기 텍스처 크기 줄이기 가벼운 Shader 사용 Draw Call 줄이기 게임 로직 최적화 물리 연산 줄이기 등등이 있는데 그 전에 선행되어야 할 것이 병목을 탐지하는 것. Bottleneck, 병목 전체 프로세스가 갑자기 느려지거나 막혀서 정지하는 원인이나 그 장소. 병목현상이 발생했다 ! == 전체 성능이나 용량이 어떤 하나의 구성요소 때문에 제한 받는 일이 생겼다 ! 특정 로직 수행이 오래걸리면 그 친구 때문에 전체 성능이 떨어지게 되는 것. 따라서 최적화를 하려면 병목 현상이 누구 때문에 일어나는지 찾아야 함. 프로..
[Unity] 그래픽스 최적화 - 렌더링 파이프라인
01. GPU의 의미 그래픽 처리를 위한 시스템은 GPU를 중심으로 구성된 칩셋에서 이뤄짐. CPU가 렌더링 명령을 내리면 GPU가 수행. GPU 메모리, VRAM Video Random Access Memory. CPU가 메모리에서 데이터를 읽어오듯 GPU도 그래픽 카드에 GPU 메모리가 있다! 그것이 VRAM. 텍스처, 메시 데이터 등 렌더링에 필요한 데이터들, 렌더링 결과를 저장하는 버퍼들이 포함됨. 렌더링할 때 여기에 저장된 데이터를 참고해서 그래픽 처리. 02. 게임 루프 유저가 게임을 실행하면 로딩(초기화, 리소스 생성) -> 게임 중(매 프레임 렌더링) -> 게임 종료(리소스 해제) 위와 같은 일련의 과정이 게임 루프. 만약 10프레임이라면, 1초동안 10개의 장면, 한 장면당 0.1초를 쓰..
[Unity] 내 주변을 원 모양으로 퍼지는 탄환 생성
특정 오브젝트를 기준으로 원 모양으로 퍼지는 탄환을 생성하는 방법이다. int n = 10; int speed = 150; for (int i = 0; i < n; i++) { GameObject boltObj = Instantiate(boltPrefebs, player.transform.position + new Vector3(0, 0.3f), Quaternion.Euler(0, 0, (360 * i / (n - 1)) + 180)); //투사체의 각도가 자연스럽게 회전값을 넣었다. Vector2 dirVec = new Vector2(Mathf.Cos((Mathf.PI) * 2 * i / (n - 1)), Mathf.Sin((Mathf.PI) * i * 2 / (n - 1))); //원을 기준으로 각각..
[Unity] 내 주변을 원 운동하는 오브젝트 만들기
float circleR; //반지름 float deg; //각도 float objSpeed; //원운동 속도 void Update() { deg+= Time.deltaTime*objSpeed; if (deg < 360) { var rad = Mathf.Deg2Rad * (deg); var x = circleR * Mathf.Sin(rad); var y = circleR * Mathf.Cos(rad); YS[0].transform.position = transform.position + new Vector3(x, y); YS[0].transform.rotation = Quaternion.Euler(0, 0, deg * -1); //가운데를 바라보게 각도 조절 } else { deg = 0; } } 회전하..
[Unity] Sprite Sheet (스프라이트 시트)를 사용한 2D 애니메이션
유니티에서 스프라이트 시트(sprite sheet)를 사용한 2D 애니메이션 스프라이트 시트(sprite sheet)는 여러개의 작은 그래픽을 그리드(grid)에 정렬하여 구성한 비트맵 이미지 파일이다 게임 개발에서 캐릭터의 연속적인 키 포즈를 한장의 이미지에 구성하여 2D 애니메이션 제작에 사용된다. 1) 유니티에서 스프라이트 시트 이미지를 가져오기한다(import) 2) import settings에서 텍스처 유형(texture type)을 sprite(2D and UI), 스프라이트 모드(sprite mode)를 multiple로 설정하고 apply를 클릭한다. 3) 패키지 매니저에서 2D Sprite 패키지를 설치한다(install) 4) import settings에서 스프라이트 편집기(spri..
[Unity] 유니티 2D RPG 강좌 #1 - 스프라이트 설정하기
1-1. 스프라이트란 무엇일까? 3D 게임에 사용되는 플레이어, 적 등의 모델들은 모두 3D 모델로 되어있다. 2D 게임에서 사용되는 플레이어와 적 그림들은 "스프라이트"라고 한다. 게임에서 제일 기초가 되는게 바로 스프라이트다. 지금 만들 2D RPG 게임에 사용될 스프라이트는 "도트" 형식의 스프라이트다. 우리가 흔히 아는 고해상도 고퀄리티의 그림들이 아닌 "점"들을 사용해서 그린 픽셀 아트를 도트라고 한다. 유니티를 실행하고 새 프로젝트를 만들어 줍시다. 상단에 있는 "New" 버튼을 클릭. 먼저 프로젝트 이름과 프로젝트를 저장할 위치를 정한 다음에 우리는 2D 게임을 만들것이기 때문에 Template를 2D로 설정해주자. 설정을 완료했다면 "Create Project" 버튼을 클릭해서 프로젝트를 ..