전체 글 19

그래픽스 퍼포먼스 최적화(3) GPU 최적화

모델 지오메트리 최적화 - 필요 이상으로 삼각형을 사용하지 않습니다. - UV매핑의 경계 부분과 하드 에지(버텍스 2배)의 수를 최소화 합니다. GPU가 처리해야할 실제 버텍스의 숫자는 3D 응용 프로그램에서 알려주는 숫자와 보통 일치하지 않습니다. 모델링 응용 프로그램은 일반적으로 지오메트리 버텍스 수(모델을 구성하는 각 모서리 지점의 수)를 나타냅니다. 하지만, GPU에서 일부 지오메트리 버텍스는 렌더링 목적으로 둘 또는 그 이상의 논리 버텍스로 나눌 필요가 있습니다. 버텍스는 다수의 노멀, UV좌표나 버텍스 컬러가 있다면 분리돼야 합니다. 따라서 Unity에서의 버텍스 숫자는 보통 3D응용 프로그램에서 계수하는 것보다 클 수 밖에 없습니다. 모델의 지오메트리의 수가 GPU에 가장 중요하지만 Unit..

참고 자료 모음

책 레트로의 유니티 게임 프로그래밍 에센스 유니티 5.x 게임 개발의 시작 사이트 https://docs.unity3d.com/Manual/index.html Unity - Manual: Unity User Manual 2020.3 (LTS) Use the Unity Editor to create 2D and 3D games, apps and experiences. Download the Editor at unity.com. The Unity User Manual helps you learn how to use the Unity Editor and its associated services. You can read it from start to finish, or use it as a refe docs...

기타 2021.07.22

그래픽스 퍼포먼스 최적화(2) CPU 최적화

화면에 오브젝트를 렌더링 하려면 CPU가 많은 작업을 처리해야 합니다. CPU가 하는 작업 - 광원 계산 - 셰이더, 셰이더 파라미터 설정 - 드로잉 커맨드를 그래픽 드라이브에 전송 - 커맨드가 그래픽 카드에 전송되도록 준비 - 등등... 오브젝트 별 CPU 사용은 리소스를 많이 사용하는데 보이는 오브젝트가 많다면 CPU에 무리가 갈 수 있습니다. 예시) 1000개의 삼각형을 그릴때, 하나의 삼각형을 하나의 메시에 넣는 것(메시 1000개를 그림)보다 모든 삼각형을 하나의 메시(메시를 결합하여 1개만 그림)에 넣는 것이 CPU를 효율적으로 사용할 수 있습니다. 두 경우 GPU 코스트는 비슷함 CPU 작업량을 줄이는 방법 1. 가까이 있는 오브젝트를 수동이나 Unity의 드로우 콜 배칭을 활용해 결합 2...

그래픽스 퍼포먼스 최적화(1) 개요

게임을 제작하거나, 플레이하면서 최적화라는 이야기를 많이 들어보셨을텐데요. 이번 포스팅에서는 유니티에 최적화 관련 매뉴얼을 보기 편하게 정리하고 테스트까지 해보려고 합니다. 게임에서 훌륭하게 최적화를 했다는 것은 게임의 렌더링 속도를 최대로 끌어올리면서 그래픽 수준은 유지하는 것을 말합니다. 낮은 사양에서도 훌륭한 그래픽을 끊김 없이 표시할 수 있다면 최적화가 잘 되어있다고 할 수 있을 겁니다. 게임 그래픽은 CPU와 GPU가 주로 담당을 하고 있습니다. 어떠한 기법으로 최적화를 할지 정하기 전에, 먼저 어디에서 퍼포먼스 문제가 발생하는지 찾아야 합니다. CPU와 GPU 최적화는 전략이 완전히 다르기 때문입니다. GPU 최적화를 위해 CPU의 작업을 늘리거나 그 반대의 경우가 흔히 발생하기 때문입니다. ..

오브젝트 풀링(Object Pooling)이란?

이번 포스팅에서는 다양한 최적화 기법들 중에서 오브젝트 풀링(Object Pooling)에 관해서 알아보겠습니다. 간단하게 오브젝트 풀링을 설명하자면, 오브젝트의 Pool 즉 웅덩이를 만들어두고, 그 웅덩이 안에서 필요할 때마다 객체를 꺼내서 사용하는 것을 뜻합니다. 게임에서는 엄청나게 많고 다양한 오브젝트를 사용하는데, 이런 오브젝트들을 실시간으로 생성하고, 파괴하고를 반복하면 어떻게 어떻게 될까요? 수천수백의 오브젝트들이 게임상에서 등장하고 사라질 때, 새로 오브젝트들을 생성하고 거기에 파괴하면 메모리를 할당하고 해제하는 일이 반복될 것입니다. 할당과 해제는 CPU가 담당하고, CPU에 부담이 오브젝트가 많아질수록 더해지게 됩니다. 게다가 유니티에서 메모리 해제를 하며 가비지 컬렉터가 발생하는데, 많..

2D 게임 만들기 (8) 프리팹(Prefab)으로 작업 줄이기

유니티에서 비슷한 게임 오브젝트를 여러 개 만들고자 할 때, 프리팹(Prefab)을 사용하여 만들어둔 오브젝트를 재사용할 수 있습니다. 프리팹이란? 1. 재사용 가능한 미리 만들어진 게임 오브젝트 에셋 2. 파일로 저장되어 현재 씬뿐 아니라 다른 씬에서도 사용 가능 사용하는 이유는? 비슷한 게임 오브젝트를 여럿 만들 때 매번 다시 설정하지 않아도 되기 때문!! (복사 & 붙여 넣기라고 생각하시면 편합니다) 프리팹을 만드는 방법은 매우 간단합니다. 게임 오브젝트를 프로젝트 창으로 Drag & Drop만 하면 됩니다!! 우선 Assets 폴더에 Prefabs폴더를 만들고, 현재 씬의 Gem 오브젝트와 platform-long 오브젝트를 Prefabs폴더로 Drag & Drop 해줍니다. 이렇게 만들어진 2개..

2D 게임 만들기 (7) Collider, Tag를 이용한 점수 내기

지난 포스팅에서는 GameController가 가진 Score(int)의 값으로 Canvas 위에 해당 값을 표시하는 내용까지 다뤘습니다. 그러면 이제 Score(int)의 값을 변화시키려면 GameController의 GetScore 함수를 호출 해야합니다. public void GetScore() { score += 100; SetText(); } 우선 Gem, 우리의 점수를 올려줄 오브젝트를 준비해봅시다. Gem의 sprite파일은 Sunnyland -> artwork -> Sprites -> Items -> gem폴더에 있습니다. https://whiny.tistory.com/10 2D 게임 만들기 (2) Animator, 유한 상태 머신 사용하기 이번 포스팅에서는 Animator 창에서 유한 상..

2D 게임 만들기 (6) 점수 시스템(Canvas)

이번 포스팅에서는 점수 시스템을 만들어보려고 합니다. 간단한 게임이지만, 점수 시스템이 필요하겠죠?? 하이어라키 창 우클릭 -> UI -> Canvas를 클릭해서 UI를 만들 준비를 해봅시다. 캔버스는 UI를 만들기 위해서는 가장 먼저 만들어야 하는 오브젝트입니다. 캔버스를 만들면 EventSystem이 자동으로 함께 생성되는데, Canvas위에서 일어나는 Input 관련 이벤트에 관여하는 오브젝트입니다. 하지만 이번 포스팅에서는 캔버스 위주로 설명하도록 하겠습니다. 우선 우리 게임의 UI가 다양한 해상도에 대응하도록 만들어보겠습니다. 캔버스에서 가장 많이 사용 되는 스케일 모드는 고정 픽셀 크기(Constant Pixel Size), 화면 크기에 따른 스케일(Scale With Screen Size) ..

2D 게임 만들기 (5) 캐릭터 움직이기

이전 포스팅에서는 PlayerInput 컴포넌트를 통해 키 입력을 받는 작업까지 마쳤습니다. 이번 포스팅에서는 PlayerController 컴포넌트를 통해 PlayerInput 컴포넌트에서 받은 값으로 캐릭터를 움직여보겠습니다. PlayerController 전체 코드입니다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { private PlayerInput playerInput; private Rigidbody2D playerRigidBody; public Collider2D footCollider; public float ..

2D 게임 만들기 (4) 캐릭터를 움직이기 위한 준비, 키 입력 받기

이번 포스팅에서는 지금까지 설정한 캐릭터를 직접 움직여 보려고 합니다. 지금의 캐릭터는 Transform, Sprite Renderer, Animator 이 세 개의 컴포넌트만 가지고 있습니다. 이제 여기에 Box Collider 2D, Rigidbody 2D를 추가해주겠습니다. Box Collider 2D - 직사각형의 형태로 2D 충돌을 감지하는 컴포넌트입니다. Offset과 Size를 조정하여 캐릭터의 발 위치로 조정하였습니다. Rigidbody 2D - 게임 오브젝트가 물리 제어로 동작하게 해주는 컴포넌트입니다. Mass(질량), Linear Drag(움직일 때 공기저항), Angular Drag(회전할 때 공기저항), Gravity Scale(몇 배의 중력을 적용할지) 등을 설정하였습니다. 그리..