본문으로 건너뛰기

· 약 1분
karais89

문제 요약

첫 번째 인수에는 배열의 크기가, 두번째 인수에는 배열이 들어온다. 배열의 합을 구해라.

내 소스

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution {

static int simpleArraySum(int n, int[] ar) {
// Complete this function
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += ar[i];
}
return sum;
}

static void Main(String[] args) {
int n = Convert.ToInt32(Console.ReadLine());
string[] ar_temp = Console.ReadLine().Split(' ');
int[] ar = Array.ConvertAll(ar_temp,Int32.Parse);
int result = simpleArraySum(n, ar);
Console.WriteLine(result);
}
}

느낀점

워밍업 단계.

가장 기초적인 배열의 합 구하는 문제.

배열의 크기를 첫번째 인자로 넘겨주는 이유는 C언어 같은 언어는 배열의 크기를 알 수 없기 때문인 것 같다.

· 약 1분
karais89

문제 요약

stdin으로 읽은 두 정수의 합을 반환하는 함수를 만들어라.

내 소스

using System;
using System.Collections.Generic;
using System.IO;
class Solution {
static int solveMeFirst(int a, int b) {
// Hint: Type return a+b; below
return a + b;
}
static void Main(String[] args) {
int val1 = Convert.ToInt32(Console.ReadLine());
int val2 = Convert.ToInt32(Console.ReadLine());
int sum = solveMeFirst(val1,val2);
Console.WriteLine(sum);
}
}

느낀점

워밍업 단계라 주석에 이미 답이 나와 있다.

익숙한 C#으로 작성했다.

테스트 케이스가 작성되어 테스트 통과 후 답을 제출하면 된다.

· 약 3분
karais89

book image

IT 개발자든, 엔지니어든, 컨설턴트든, 전산쟁이가 IT 전문가로 성공하는 법!

기간

4시간

목적

ebook으로 구매.

책 제목 및 리뷰등을 보고 도움이 될 것 같다는 생각을 하고 구매를 했다.

리뷰

224p 분량의 얇은 책입니다.

저자 분은 장동인이라는 저자 분이고 미국 비자카드, EDS, 아메리칸 항공, 독일 아마데우스(AMADEUS), 오라클 본사에서 근무했다고 합니다.

물론 저보다는 저자분이 훨씬 더 뛰어난 분이라고 생각은 듭니다.

그런데 저자분의 책을 읽으면서 정말 이건 아닌데.. 라는 생각을 많이 했습니다.

일단 책의 1/3 정도는 자기 자신의 이야기를 얘기해줍니다. 1/3 정도는 자기의 성공 스토리를 적었습니다.

신입 사원에게 직장 생활을 어떻게 해야된다고 가르쳐 주는 부분도 있습니다.

  1. 무조건 인사를 잘하라.
  2. 회사에 빨리 적응하려면 그 회사의 조직도를 암기하라.
  3. 신입 사원은 회사에서 허드렛일부터 하라.
  4. 회식에 적극적으로 참여하라.
  5. 신입 사원은 남들보다 30분 일찍 출근하고 30분 늦게 퇴근하라.

신입사원은 회식에서는 활기차고 밝게 분위기 살리기, 최신 유행 노래와 춤 멋지게 소화하기 회식 후 선배 직원들 택시 태워서 집에 보내기 등을 하라고 조언하고. 야근이나 주말출근은 자발적으로 먼저 하겠다고 나서야 된다. 그리고 팀장이나 임원이 개인적으로 저녁 모임을 갖자고 하는 경우도 무조건 따라가라는 조언을 해줍니다.

평점 및 한줄평

결국 저자분의 결론은. 야근과 주말출근은 당연히 해야 되며, 회사에 줄을 잘 서야 된다라는 결론으로 보여집니다.

어느정도는 회사 생활을 할때 필요할 수도 있다는 생각을 하게 되기도 합니다.

2.5 / 5

· 약 1분
karais89

book image

프로그래밍 방법론

기간

2~3일

목적

ebook으로 구매. 별다른 목적은 없었고, 예전에 이 책은 뭐지? 라는 관심을 가지다 구매할 기회가 생겨서 구매.

리뷰

  • 200p 분량의 얇은 책
  • 2p당 삽화 하나가 들어있다.
  • 애자일 및 스크럼에 대한 얘기
  • 뜬구름 잡는 얘기인 것 같다.

사실 책에 대해서 크게 리뷰를 할 말이 없다.. 뭔가 뜬 구름 잡는 얘기 인것 같다. 저자 자체는 애자일 선언문에 참여한 사람 중 하나라는데...

평점 및 한줄평

아직 프로그래밍 스킬 능력 부족인지.. 솔직히 말해서 무슨 내용의 책인지 모르겠다.

2 / 5

· 약 2분
karais89

book image

프로그래밍 방법론

기간

2일

목적

리팩토링 및 코드 품질 개선을 위해 구입한 책.

리뷰

  • 상당히 쉽게 잘 쓰여진 책.
  • 번역 또한 매끄럽다. (역: 윤인성1)
  • 게임 프로그래밍 관련 내용으로 코드 품질에 대한 설명을 해주기 때문에 흥미 유발.

1장. 읽기 좋은 코드를 작성하는 방법 2장. 간단한 설계를 위한 원칙과 패턴 3장. 소스 코드 품질 측정

1장은 쉬운 설명으로 상당히 만족 스러웠다. 2장은 분야 자체가 굉장히 넓은 분야라 어느정도 맛보기 형식으로 제공되서 자세히는 다루지 못하지만 개념을 파악하기에 좋았다. 3장도 도움이 됐다.

일단 책 자체가 설명과 같이 c++로 소스 코드를 같이 보여주기 때문에 프로그래밍을 조금만 알더라도 이해하기 상당히 쉬웠다. 그냥 술술 읽히는 느낌?

평점 및 한줄평

5 / 5


  1. 모던 웹을 위한 JavaScript + jQuery 입문 저자.

· 약 1분
karais89

book image

예제 형식의 파이썬 서적

기간

2주

목적

파이썬에 대한 관심을 가지게 되어 공부 목적으로 구입

ebook으로 나온 파이썬이고 최신 버전이라 구매를 했다.

리뷰

파이썬 관련 예제 코드 200개

예제 자체에 대한 설명은 괜찮을 수 있다.

하지만 중복된 예제들이 상당 수 있고, 예제 자체에 대한 수준이 많이 떨어지는 것 같다.

전체으로 파이썬에 대한 설명을 놓친 부분이 많은 것 같아서 아쉬웠다.

평점

2.5 / 5

· 약 1분
karais89

book image

파이썬 서적

기간

한달정도 소요

목적

파이썬에 대한 관심을 가지게 되어 공부 목적으로 구입

리뷰

책 자체는 파이썬에 대한 설명과 라이브러리에 대한 설명

목차를 보면 알 수 있듯이 파이썬이 사용되는 분야를 넓게 배울수 있는 서적이다.

따라하기 식의 전형적인 서적이며.

중간 중간에 파이썬 버전 문제 때문에 설치하는데 어려움을 겪을 수도 있다.

500p의 책은 두껍긴 한데 1/5이상은 api에 대한 설명인것 같고. 설명또한 부실한 면이 많다.

그렇게 추천하고 싶지는 않은 책이다.

평점

3.5 / 5

· 약 23분
karais89

Unity Cloud Build 소개

자습서

01. Unity Cloud Build 소개

이 단원을 마치면 Unity Cloud Build가 무엇이며 어떻게 작동하는지 이해하게 될 것입니다.

Unity Cloud Build란 무엇입니까?

Unity 게임을위한 빌드 파이프 라인1을 자동화하는 서비스입니다.

Cloud Build를 사용해야 하는 이유는 무엇인가?

클라우드 빌드 자동화 서비스를 사용하면 시간을 절약 할 수 있습니다.

빌드는 자동으로 컴파일되고 배포되므로 수작업과 개입이 최소화됩니다.

여러 플랫폼이있는 게임을 단일 빌드 프로세스로 통합 할 수 있습니다.

아래와 같은 장점이 있습니다.

  1. 품질 향상.

    • 변화가 감지되면 지속적으로 게임을 제작하여 프로젝트에 도입 된 문제를 감지 할 수 있습니다.
  2. 더 빠른 배포.

    • 클라우드 기반 인프라 스트럭처는 빌드를 컴파일합니다. 다중 플랫폼 프로젝트의 경우 병렬로 실행됩니다. 완성 된 빌드는 Cloud Build의 웹 사이트를 통해 팀 구성원이 다운로드 할 수 있습니다.

Unity Cloud Build는 어떻게 작동합니까?

Unity Cloud Build는 소스 제어 저장소 (예 : Git, Subversion, Mercurial, Perforce)를 모니터합니다.

변경 사항이 감지되면 Cloud Build가 자동으로 빌드를 생성합니다.

빌드가 완료되면 당신과 당신의 팀에게 이메일로 보냅니다.

당신과 당신의 팀 동료를 위해 당신의 빌드가 Unity에 의해 호스팅됩니다.

만약 빌드가 실패하면 문제를 해결하기 위해 로그가 제공됩니다.

Unity Cloud Build를 사용하려면 무엇이 필요합니까?

소스 제어 저장소. 다음 소스 제어 관리 ("SCM") 시스템을 지원합니다.

  • Git
  • Subversion
  • Mercurial
  • Perforce

02. 당신의 첫 번째 소스 컨트롤 저장소 만들기

이 수업이 끝나면 로컬 Git repo가 생깁니다. 유니티 프로젝트가 포함되어 있으며, Git Sever와 연결될 것입니다.

프로젝트에 대한 소스 컨트롤(Git, Subversion, Perforce 또는 Mercurial)이 있는 리포지토리가 이미 있거나 Unity 프로젝트 빌드를 테스트하기 위해 샘플 프로젝트를 사용하려는 경우 3 단원 : 첫 클라우드 빌드 프로젝트 만들기로 진행할 수 있습니다 .

이 단원에서는 다음을 사용하여 리포지토리를 만듭니다.

  • Bitbucket: 소규모 프로젝트를위한 무료 저장소
  • Git: 인기있는 소스 제어 시스템, Bitbucket과 통합되었습니다.
  • SourceTree: Git 및 Bitbucket에서 작동하는 사용자 친화적인 GUI 툴.

이 도구는 빠른 설정과 손쉬운 사용을 위해 SCM 초보자에게 유용합니다.

시작하려면 로컬 컴퓨터에 기존 Unity 프로젝트가 있어야합니다.

가지고 있지 않은 경우 다음 자습서를 완료하십시오.

Space Shooter Tutorial

01. Download SourceTree

SourceTree를 다운로드하여 설치하려면 www.sourcetreeapp.com을 방문하십시오.

Download Sourcetree

02. Bitbucket 계정 만들기

bitbucket.org를 방문하여 무료 개인 계정에 가입하십시오.

첫 번째 저장소를 만들지 묻는 메시지가 표시되면 '아니요'라고 표시됩니다.

우리는 SourceTree로 저장소를 생성 할 것입니다.

Create Your Repo

03. SourceTree를 사용하여 Bitbucket에 저장소를 만듭니다.

SourceTree를 열고 Bitbucket 로그인 사용자 이름과 암호를 입력하라는 메시지가 나타나면 입력하십시오.

Create a repository on bitbucket

로그인하면 repo를 "Clone"하라는 메시지가 나타납니다 ("Clone a Repo"는 모든 관련 파일을 저장소에서 로컬 시스템으로 복사하는 것입니다).

Bitbucket 계정과 연결된 Repo를 만들지 않은 경우 목록이 비어 있어야합니다. "Skip Setup"을 클릭하십시오.

Skip Setup

"Skip Setup"을 클릭하면 Repository Browser 창이 나타납니다.

Repository Browser

이전에 생성 한 Bitbucket 계정을 사용하여 원격 리포지토리를 만듭니다.

Repository Browser에서 "+ New Repository"를 클릭하십시오. 드롭 다운 목록이 나타납니다. '원격 저장소 만들기'를 선택하십시오.

New Repository Options

"Create a remote repository" 창이 나타납니다.

Create A Remote Repository

아래와 같은 설정으로 세팅합니다:

  • Account: Bitbucket 계정
  • Owner: Bitbucker 유저 이름
  • Name: 무엇이든지 상관 없음
  • Description: 무엇이든지 상관 없음
  • Type: Git
  • This is a private repository: Checked

“Create”를 클릭.

당신은 "Repository Window"로 되돌아 갈 것입니다. "Remote"을 클릭하면 방금 만든 목록의 이름이 목록에 표시됩니다.

04. 당신의 Repo Clone

Repository Window에서 | Remote window에서 이전 단계에서 생성 한 Bitbucket 저장소를 클릭하십시오. 다음 프롬프트가 나타납니다.

Clone A Repository

  • Source URL: 있는 그대로 유지하고 나중에 기록해 두십시오. 나중에 Unity Cloud Build를 구성 할 때 사용하게됩니다.
  • Destination Path: 저장소 파일이 저장 될 로컬 시스템의 위치를 선택하십시오. 대상 경로는 항목이 없는 디렉토리를 가리켜야 합니다.
  • Name: 무엇이든지 상관 없음.
  • Advance Options: 있는 그대로 둡니다.

“Clone”을 클릭.

그러면 Repository Window로 돌아 가게 됩니다. 로컬, 방금 작성한 저장소의 로컬 사본이 표시됩니다. 저장소는 비어 있습니다. 당신은 다음 단계에서 그것을 채울 것입니다.

Empty Repository

05. 유니티 프로젝트로 로컬 레포 채우기

Repository Window에서 | 로컬에서 repo를 더블 클릭하십시오. 메시지가 나타나면 이름과 이메일을 입력하십시오.

User Details

이제 로컬 저장소를 채 웁니다.

로컬 유니티 프로젝트를 찾고 모든 파일을 4단계에서 정의한 repo 대상 경로로 이동하십시오.

다음 스크린 샷에서 단일 프로젝트 "MyFirstProject"가 로컬 리포지토리 폴더 "MyFirstUnityRepo"로 이동합니다

Populate Your Local Repository

로컬 repo를 채울 때 SourceTree는 자동으로 변경 사항을 감지하고 다음과 같이 업데이트합니다 :

First Repsoitory

06. Commit 과 Push 로컬 Repo를 원격 Repo로 푸시합니다.

Unity Cloud Build는 원격 저장소를 모니터링합니다. 이렇게하려면 원격 repo에 파일을 COMMIT하고 PUSH해야합니다.

"Unstaged files"확인란을 선택하여 서버에 푸시 될 모든 파일을 선택합니다.

참고 : 각 파일 이름 오른쪽에 세 개의 점 (•••)이 있음을 알 수 있습니다.이 점을 클릭하면 '자세히'메뉴에 액세스 할 수 있습니다. 이 메뉴를 사용하여 Unity 'Library'폴더에 대해 '파일 무시'를 선택하십시오 (Unity Cloud Build는 빌드 프로세스 중에 Library 폴더를 생성합니다). 프로젝트를 빌드하기 위해 Unity가 필요로하지 않는 다른 파일도 '무시'할 수 있습니다. 이 단계를 완료하지 않으면 필요한만큼 빌드 프로세스가 느려집니다.

화면 상단의 "Commit"을 클릭하십시오. 메시지가 나타나면 이름과 이메일을 입력하십시오.

First Commit

Comment를 입력하고 "Commit"을 클릭하십시오.

First Commit 2

다음 메시지가 나타납니다. "There is nothing left to commit"

Nothing to commit

커밋 된 모든 파일을 원격 저장소에 복사하려면 "Push"를 클릭하십시오.

Push

"확인"을 클릭하십시오. 업로드 프로세스가 시작됩니다.

07. 원격 저장소 확인

bitbucket.org로 이동하여 너의 아이디로 로그인하십시오. 첫 번째 화면에 저장소 이름이 표시되어야합니다. Repo에 대한 페이지로 이동하려면 이름을 클릭하십시오.

repo 페이지에서 브라우저의 주소 표시 줄로 이동하여 표시되는 URL / 주소를 복사하십시오.

Repote Repository

이 URL은 새 프로젝트를 추가 할 때 Unity Cloud Build에 제공하는 URL입니다.

이 페이지에서 'Git' 탭을 클릭하거나 Unity Cloud Build 설정 마법사의 지침에 따라 Bitbucket 계정에 SSH 키를 추가하여 액세스를 허용하십시오.

03. 첫번째 Cloud Build 프로젝트

이 레슨이 끝나면 코드 리포지토리에 커밋 할 때 자동으로 컴파일하고 알려주는 Unity Cloud Build 프로젝트를 갖게됩니다.

시작하려면 다음이 필요합니다.

  1. 소스 제어 저장소. Unity Cloud Build는 Git, Subversion, Mercurial 및 Perforce를 지원합니다. 강의 1을 참조하십시오.
  2. Unity Cloud Build 계정.

01. 프로젝트 만들기

https://build.cloud.unity3d.com으로 이동하여 Unity Developer Account로 로그인하십시오. Cloud Build 홈페이지로 이동하게됩니다.

Cloud Build Home Page

Cloud Build 홈 페이지에서 "Add New"를 클릭하십시오. Cloud Build는 프로젝트의 이름과 프로젝트가 속한 조직의 이름을 선택하도록 요청합니다.

Create New Project

  • Organization: 드롭 다운 메뉴를 클릭하고 사용자 이름을 선택하십시오.
  • Project Name: 무엇이든지 상관 없음.

02. Unity Cloud Build Project를 원격 저장소에 연결하십시오.

repo URL을 제공 한 후 다음을 클릭하십시오.

Connect To Repository

03. 액세스 권한 구성

repo가 비공개 인 경우 Cloud Build는 파일에 액세스하여 빌드 할 수 있도록 SSH 키를 추가하라는 메시지를 표시합니다 (공개 인 경우 자동으로 다음 단계로 건너 뜁니다)

이전 강의를 사용하여 BitBucket Repo를 만든 경우 Unity Cloud Build에서 제공하는 SSH 키를 BitBucket Repo에 첨부해야합니다

이 작업을 수행하지 않으면 빌드 시도가 실패하게됩니다. Bitbucket에 로그인하고 Cloud Build SSH 키를 Bitbucket 계정에 추가하십시오.

이전 단계의 샘플 프로젝트를 사용한 경우에는 액세스 권한을 구성하라는 메시지가 표시되지 않습니다. 프로젝트는 공개입니다.

Connect To Repository

클라우드 빌드에서 제공하는 SSH 키 복사

Cloud Build에서 제공하는 SSH 키를 리포에 연결합니다. 만약 레슨 2를 진행 하였다면, BitBucket 레포에 SSH 키를 추가할 수 있을 것입니다.

Connect To Repository

저장소 구성을 마치면 다음을 클릭하여 설정을 구성하십시오.

04. Unity Cloud Build 프로젝트 구성하기

플랫폼을 선택하라는 메시지가 나타납니다. 이 레슨에서는 Web Player를 선택하십시오.

Select Build Targetb Update

자세한 구성 정보를 제공하라는 메시지가 나타납니다. 빌드 할 Repo에서 지점을 선택해야합니다. 레슨 2의 Bitbucket 레포를 사용하는 경우 "마스터"를 선택하십시오.

Select Build Branch

05. 빌드!

"Next"를 클릭하면 Unity Cloud Build가 자동으로 컴파일을 시작합니다.

Select Build Branch

빌드 프로세스가 완료되면 자동으로 통지됩니다.

04. 부록 : 빌드 프로세스 기본 사항

소개

이 섹션에서는 게임 빌드 프로세스에 대한 높은 수준의 개요를 제공합니다. 이 단원을 마치면 빌드 프로세스와 구성 요소가 무엇인지 알 수 있습니다.

빌드 란 무엇입니까?

게임의 사용 가능한 버전.

플레이어는 장치를 사용하는 빌드를 중요하게 생각합니다.

종종 공개, 라이브 또는 프로덕션 빌드라고도합니다.

주어진 프로덕션 빌드의 경우 게임 개발자가 생성 한 빌드 수는 수백 개는 아니지만 수천 개에 달합니다.

게임이 제대로 작동하도록하기 위해 만들어졌습니다. 이러한 빌드는 모두 구성, 컴파일, 유효성 검사 및 배포에 시간이 필요합니다.

빌드 프로세스 (또는 빌드 파이프 라인) 란 무엇입니까?

게임 개발자가 빌드를 만드는 데 사용하는 일련의 도구 및 단계.

솔로 개발자라면 프로세스가 간단합니다.

코드, 자산, 버전, 빌드 환경 및 시스템은 모두 로컬 컴퓨터에 있습니다.

그러나 팀 환경에서는 팀이 개선해야하는 "권위있는"버전의 게임을 결정하기 위해 도구와 프로세스가 필요합니다.

빌드 프로세스는 무엇으로 구성됩니까?

일반적인 요소는 다음과 같습니다.

  • 자산 및 코드가 저장되는 저장소 (또는 "Repo"). 전문적인 환경에서 프로젝트의 모든 파일은 소스 제어 관리("SCM") 시스템에 저장되므로 여러 팀 구성원이 최소한의 충돌로 동일한 리소스로 작업 할 수 있습니다.
  • Build Environment는 저장소에서 코드와 자산을 가져 와서 게임의 실제 버전으로 컴파일합니다.
  • 배포 서비스는 사용자에게 빌드를 가져옵니다. 대부분의 게임 개발 라이프 사이클에서 빌드는 유효성이 확인되면 내부적으로 배포됩니다.
  • 자동화 엔진은 빌드 프로세스의 일부를 모니터하고 자동 조치를 취합니다. 보고서, 알림 및 배포뿐만 아니라 빌드 컴파일. 자동화 엔진이 없으면 팀원 중 한 명 이상이 수동으로 프로세스를 실행합니다.

일반적인 빌드 파이프 라인은 다음과 같습니다.

Build Pipeline

소스 제어는 무엇입니까?

소스 제어 (일반적으로 버전 제어라고도 함)는 여러 파일의 변경 사항을 '실행 취소'하는 방법을 제공하고 팀과 함께 소프트웨어 프로젝트를 공동 작업하는 시스템입니다.

소스 컨트롤을 사용하면 실수로 게임 시간을 잃지 않도록 보호하고 코드로 다른 것을 시도해 보는 것이 더 쉽지만보다 안정적인 버전의 프로젝트로 롤백하기 때문에 게임 개발에있어 '모범 사례'로 간주됩니다 당신이 당신의 접근 방식을 재고 할 필요가 있다면.

소스 제어는 어떻게 작동합니까?

특정 소스 관리 관리 시스템에 따라 다릅니다. 소프트웨어 개발을 위해 Git을 사용하기위한 워크 플로는 일반적으로 다음과 같이 작동합니다.

  1. 당신은 repo (어딘가에서 호스팅)를 만들고 Unity 프로젝트를 넣습니다.
  2. 변경 사항을보고 추적 할 수 있는 인터페이스를 제공하는 Git 클라이언트 (소프트웨어)를 선택합니다.
  3. Git에게 라이브러리 폴더와 같은 특정 파일을 무시하도록 명령한다.
  4. Unity 프로젝트를 약간 변경하고 Unity에 저장합니다.
  5. Git 클라이언트로 전환하면 변경된 파일을 알려줍니다.
  6. 그 파일을 선택하고 '커밋'하면됩니다 - 이것은 프로젝트의이 버전을 표시하는 것과 근본적으로 유사하므로 나중에 참조 할 수 있습니다.
  7. 1 (또는 그 이상) 커밋이 끝나면 커밋을 Gitl 호스트 / 서버로 'push' 때문에 이제는 백업되고 프로젝트에서 작업중인 다른 사람도 볼 수 있습니다. 마지막 'push' 단계는 Unity Cloud Build가 프로젝트를 시청할 때 보는 단계입니다. 그러면 자동으로 새 빌드를 시작합니다.

Cloud Build에서 지원하는 소스 제어 시스템은 무엇인가요?

Unity Cloud Build는 다음 소스 제어 관리 시스템 ("SCM")을 지원합니다.

  • Git
  • Subversion("SVN")
  • Perforce
  • Mercurial

특정 시스템에 대한 자세한 내용은 다음 리소스를 참조하십시오.

솔로 개발자는 빌드 파이프 라인이 필요합니까?

예, 직접 작업하는 개발자조차도 소스 제어 및 파이프 라인 구축의 이점을 누릴 수 있습니다.

소스 컨트롤은 하드 드라이브가 죽거나 실수로 프로젝트를 삭제하거나 중단 한 경우 복구 할 수있는 프로젝트의 백업을 제공합니다.

Unity Cloud Build와 같은 빌드 파이프 라인을 사용하면 여러 플랫폼에 대한 빌드를 한 번에 만들 수 있으므로 시간을 절약 할 수 있습니다.


  1. 시스템의 효율을 높이기 위해 명령문을 수행하면서 몇 가지의 특수한 작업들을 병렬 처리하도록 설계된 하드웨어.

· 약 19분
karais89

메모리와 리스소를 최적화 해야 되는 이유

  1. 용량이 50MB를 넘게 되면 다운로드하는 유저 수가 절반으로 줄어든다.
  2. 메모리를 많이 쓰면 게임 유저 수에 제약이 생긴다. (저사양 핸드폰에서는 돌아가지 않는다)
  3. 최적화를 하지 않을 시 발생하는 오버헤드는 일반 앱과 비교가 되지 않을 정도로 크다.

02. 스크립트 연산 최적화

01. 유니티 게임 오브젝트를 찾지 말고 캐싱하라.

FindObject 계열 함수들은 매우 느립니다.

찾은 오브젝트는 꼭 변수에 할당해서 캐싱해 놓은 후에 사용합시다.

02. 오브젝트 풀링 기법을 사용하라.

유니티에서 반복적으로 등장하고 제거되는 오브젝트들을 관리하려면 오브젝트 풀링은 필수입니다. Instanitate와 Destory 함수를 이용한 프리팹의 생성/해제는 비용이 크기 때문입니다.

03. Update 함수 보다는 Coroutine을 활용하자.

Update는 매 프레임마다 호출됩니다.

매 프레임마다 호출되야 되는 경우가 아닌 경우에는 코루틴을 활용해 봅시다.

아래는 코루틴이 성능이 좋은 이유입니다.

예를 들어 코루틴에서 yield return new WaitForSeconds(10)이라는 명령을 수행하면 코루틴은 유니티 엔진에게 WaitForSeconds(10)이라는 데이터를 보내고 쉬기 시작합니다. 유니티 엔진은 이를 받고 기록해두었다가 묵묵하게 자기 할 일을 진행 하면서 10초가 지나면 쉬고 있는 코루틴을 깨웁니다. 코루틴이 없이 일반적으로 이를 구현 한다면 Update 구문에서 Time.deltaTime을 사용하여 매 프레임마다 시간을 더해서 10초가 지났는지 감지해야 하는데, 프레임의 평균 소요 시간이 0.01초라고 한다면, 아이러니하게 10초 동안 대기하기 위해 스크립트는 Update 함수를 1000번 호출해야 합니다. 코루틴을 사용하면 10초 동안 스크립트가 쉬는데 말이지요~

04. 문자열을 연결할 땐 StringBuilder를 쓰자.

일반 String + String을 쓰면 임시 문자열이 생성됩니다. (가비지 컬렉터 생성)

StringBuilder.Append() 함수를 사용하여 병합합시다.

05. 나누기 10보단 곱하기 0.1

나눗셈보다 곱셈의 연산 속도가 몇십 배 빠릅니다. 곱하기로도 가능한 나눗셈 연산은 곱하기로 표현하는게 좋습니다.

06. 가비지 컬렉션에서 벗어나자.

문자열은 readonly 혹은 const를 사용하여 가비지 컬렉션에서 벗어나도록 합니다.

07. 객체 캐싱을 활용하라

컴포넌트 참조 GetComponent() 함수는 한 번만 호출하여 객체를 캐싱해 놓습니다.

ex) transform 컴포넌트 캐싱

private Transform _tr;
void Awake()
{
_tr = GetComponent<Transform>();
}

08. 빈 콜백 함수는 제거

Start()나 Update() 같은 콜백함수는 비어있어도, 성능에 영향을 끼칩니다. 사용하지 않는 경우에는 제거 해 줍시다.

03. 리소스 최적화로 메모리 사용량 줄이기

[텍스처 압축 방식별 차지하는 메모리 용량]

[standalone & WebGL]

압축 방식메모리 사용량 (bytes/pixel)
RGB crunched DXT1variable
RGBA Crunched DXT5variable
RGB Compressed DXT10.5 bpp
RGBA Compressed DXT51 bpp
RGB 16bit2 bpp
RGB 24bit3 bpp
Alpha 8bit1 bpp
RGBA 16bit2 bpp
RGBA 32bit4 bpp

[iOS]

압축 방식메모리 사용량 (bytes/pixel)
RGB Compressed PVRTC 2 bits0.25 bpp (bytes/pixel)
RGBA Compressed PVRTC 2 bits0.25 bpp
RGB Compressed PVRTC 4 bits0.5 bpp
RGBA Compressed PVRTC 4 bits0.5 bpp
RGB 16bit2 bpp
RGB 24bit3 bpp
Alpha 8bit1 bpp
RGBA 16bit2 bpp
RGBA 32bit4 bpp

[Android]

압축 방식메모리 사용량 (bytes/pixel)
RGB Compressed DXT10.5 bpp (bytes/pixel)
RGBA Compressed DXT51 bpp
RGB Compressed ETC10.5 bpp
RGB Compressed PVRTC 2 bits0.25 bpp
RGBA Compressed PVRTC 2 bits0.25 bpp
RGB Compressed PVRTC 4 bits0.5 bpp
RGBA Compressed PVRTC 4 bits0.5 bpp
RGB 16bit2 bpp
RGB 24bit3 bpp
Alpha 8bit1 bpp
RGBA 16bit2 bpp
RGBA 32bit4 bpp

텍스쳐 압축은 메모리 사용량과 관련이 깊습니다.

이미지 파일 사이즈와 상관없이 이미지가 메모리상에서 차지하는 용량 계산 방식은 다음과 같습니다.

메모리 사용량 = 가로 픽셀 세로 픽셀 압축 방식의 메모리 사용량(bpp)

이미지 메모리 사용량을 잘 관리하는 방법은 눈에 보이는 이미지는 압축하지 않고, 잘 보이지 앟는 이미지는 압축을 많이 하는 것입니다.

특히나 유저 인터페이스의 경우네는 압축을 많이 하면 이미지가 깨지기 때문에 게임의 퀄리티가 상당히 낮아 보입니다. 이런 이유로 유저 인터페이스는 압축을 피하는 것이 좋습니다.

하지만 3D 몬스터 캐릭터의 텍스쳐 등은 조금 압축을 하더라도 퀄리티에 크게 영향을 주지 않습니다. 스마트폰 게임 특성상 제한된 리소스를 효율적으로 써야 하기에 퀄리티를 강조하고 싶은 영역에는 보다 화질 좋은 텍스쳐를 쓰는 것이 현명한 선택이라 할 수 있습니다.

01. 디바이스별로 권장하는 압축 텍스쳐 포맷

  • 아이폰(powerVR) : PVRCT
  • 안드로이드(Tegra) : DXT
  • 안드로이드(Adreno) : ATC
  • 안드로이드(공통) : ETC!

02. 이미지 가로세로 사이즈는 무조건 2의 제곱

게임에서 사용하는 이미지 가로세로 사이즈는 무조건 2의 제곱으로 되어야 한다(Power Of Two).

컴퓨터에서 이미지를 사용할 때에는 개념적으로 “[1번] 디스크에서 이미지 불러오기→[2번] 이미지 압축 포맷 압축 해제→[3번] 1024×1024×32비트 메모리 블록에 해당 이미지 할당” 과정을 거친다.

1024×1024×32비트 RGBA 기준으로 이미지를 압축한 png 용량은 313KB에 불과하다. 하지만 압축을 해제하면 메모리상 이미지 사이즈는 4MB나 된다. 2048×2048이라면 16MB에 이른다.

이렇게 가로세로 사이즈가 2의 제곱으로 된 이미지가 아닌 경우에는 상당한 메모리 낭비가 일어나게 된다. 예를 들어 900×900 사이즈 이미지가 있다고 하자. 메모리상에서 900×900 사이즈 이미지를 도르할 때 해당 이미지를 똑같이 1024×1024로 변환해 다시 메모리에 저장하게 된다. 다시 말해 거의 배에 가까운 이미지 메모리가 낭비되는 것이다.

이런 이유 때문에 유니티3D를 비롯한 여러 게임 개발 엔진에서 아틀라스(Atlas)라는 리소스 단위를 사용하게 된다. 이미지를 POT(2의 제곱) 방식으로 바꿔서 항상 활용하기를 권한다.

03. 압축된 텍스처와 밉맵 활용

32bit가 아닌 16bit 텍스쳐도 상황에 맞게 적절히 활용하는 것이 좋습니다. 밉맵은 렌더링 속도를 향상시키기 위해 기본 텍스쳐와 이를 연속적으로 미리 축소시킨 텍스쳐들로 이루어진 비트맵 이미지의 집합입니다. 메모리와 리소스 최적화를 위해서는 이런 밉맵을 사용하는 것도 도움이 됩니다.

04. 오디오는 92kb 모노 인코딩으로

모바일에서 스테레오는 의미가 없습니다. 그러니 모두 92kb 모노로 인코딩하는 것이 좋습니다. 92kb 모노 인코딩은 유니티 엔진에서 간편하게 설정할 수 있습니다. 또한 사운드 파일을 임포트하면 디폴트 값으로 3d 사운드가 설정됩니다. 이를 2d 사운드로 설정 변경하는 것도 리소스 낭비를 줄이는데 도움이 됩니다.

05. 오디오 파일은 .wav 형식으로 저장

오디오 파일은 용량을 줄일려고 굳이 .mp3 형식으로 임포트할 필요가 없습니다. 왜나혀면 .wav 파일을 임포트해도 자체 인코더가 용량을 원하는 데로 압축해주기 때문입니다. 음향 손실을 피하려면 wav로 저장하여 유니티 내부 인코더를 활용하는 편이 낫습니다.

04. 캐싱 활용법

페이스북이나 카카오톡과 게임을 연동하게 되면 프로필 이미지를 자주 불러오게 됩니다. 프로필 이미지를 매번 다운로드해서 표시한다면 프로필 이미지가 뜨기까지 시간이 아주 길어집니다. 이를 매끄럽게 하기 위해서는 꼭 캐싱 기법을 사용해야 합니다.

캐싱은 자주 사용하는 데이터를 디스크나 메모리에 저장해두는 기법입니다. 이를 활용하면 네트워크 대역폭을 크게 줄일 수 있습니다. 인터넷에서 다운로드한 이미지를 디스크에 저장해 활용하는 캐싱 기법에 대해 알아봅시다. 이 과정은 총 두번의 스텝으로 이루어집니다.

  • 다운로드할 이미지가 디스크에 있는지 체크 (void LoadProfile)
  • 디스크에 없으면 인터넷에서 이미지를 받아서 디스크에 저장(IEnumerator DownloadProfile)

과정 중간에 에러나 예외가 발생하면 null을 반환합니다.

null을 반환시 사용자는 null 처리를 해주시며 됩니다(ex) 디폴트 이미지를 뿌려준다던지..)

예제를 통해 확인해 봅시다.

캐싱 기법을 활용한 메모리/리소스 최적화 방법은 단편적인 솔루션입니다.

하지만 게임에서 가장 많은 용량과 메모리를 차지하는 이미지 리소스 최적화에서는 아주 기본적인 단계이기도 합니다.

05. 그래픽스 최적화 주요 지표

최적화의 기본은 병목현상을 파악하고 제거하는 것이 핵심입니다.

에디터에서 Game-Stats 메뉴를 클릭하면 통계 수치를 확인할 수 있습니다.

항목설명
Time per frame and FPS하나의 프레임을 처리 및 렌더링 하는 데 걸린 시간 및 상호 관계에 있는 프레임/초, 이 숫자는 프레임 업데이트 및 게임 뷰의 렌더링에 걸린 시간만 포함되는 것에 유의합니다. 에디터가 신 뷰 인스펙터의 그리기 및 에디터 전용 작업을 수행하는 데 걸린 시간은 포함되지 않습니다.
Batches(배칭)배칭이란 여러 오브젝트를 메모리 덩어리로 결합시키는 작업을 말합니다.
Saved by batching(결합된 배칭 수)결합된 배칭의 수입니다. 좋은 배칭을 이끌어내기 위해서는 가능한 한 많은 매터리얼을 공유하도록 하는 게 좋습니다.
Tris and Verts(삼각형의 정점 수)그려진 삼각형과 정점 수
Screen화면 크기, 안티 앨리어신 레벨 및 메모리 사용량
SetPass드로우 콜(Draw Call)과 같은 단어라고 보면 됩니다. 렌더링 패스의 수, 각 패스에 대해서 유니티 런타임은 CPU 오버헤드를 가져올 수 있는 새로운 쉐이더를 바인딩합니다.
Visible Skinned Meshes렌더링 스킨 메시 수
Animations재생 애니메이션 수

06. 배칭

배칭이란 3D 오브젝트들을 하나의 메모리 덩어리로 만들어서 한 번에 그리도록 도와주는 작업을 말합니다. 유니티 메뉴의 [Window > Frame Debugger]를 사용하면 배칭 연산이 이루어지는 단계별로 스냅샷을 볼 수 있습니다.

유니티에서 지원하는 배칭에는 스태틱 배칭과, 다이내믹 배칭 두 가지가 있습니다.

유니티 메뉴에서 Edit-Project Setting-Player로 들어가면 스태틱 배칭을 설정할 수 있습니다.

1) 스태틱 배칭

변하지 않는 오브젝트의 인스펙터탭에서 static 체크박스를 선택함으로써 스태틱 배칭이 일어나도록 설정할 수 있습니다.

2) 다이내믹 배칭

동적으로 비슷한 재질의 오브젝트를 하나의 연산 단위로 묶는 방식을 말합니다.

3D 오브젝트이 정점 수에 영향을 받습니다.

07. 오버드로우와 세이더

1) 오버 드로우

오버 드로우 : 한 픽셀에 여러 번 그리는 행위

화면의 한 픽셀에 두번 이상 그리게 되는 경우에, 오버 드로우가 발생한다고 합니다.

한 픽셀에 어러 번 그리는 만큼 그래픽 부하도 증가하는 건 당연합니다.

2d게임에서 여러 반투명 이미지들을 겹쳐서 표현하는 과정에서 발생합니다.

꼭 반투명이 필요한 이미지만 반투명 옵션을 주고, 굳이 반투명 옵션이 필요하지 않은 경우에는

최대한 옵션 선택을 줄이는 형식으로 반투명 오브젝트에 개수 제한을 걸면 오버드로우 문제를 해결할 수 있습니다.

2) 유니티 세이더

기본 세이더는 모바일용 세이더를 사용합니다. 가장 빠른 세이더는 VertexLit 입니다.

Mobile-VertexLit로 선택하면 됩니다. 화질 차이가 매우 중요한 오브젝트 외에는 모바일에 최적화된

세이더를 쓰는 것이 좋습니다.

참조