블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2838)
Unity3D (886)
Script (94)
Extensions (16)
Effect (3)
NGUI (81)
UGUI (9)
Physics (2)
Shader (40)
Math (1)
Design Pattern (2)
Xml (1)
Tips (204)
Link (26)
World (1)
AssetBundle (25)
Mecanim (2)
Plugins (85)
Trouble Shooting (71)
Encrypt (7)
LightMap (4)
Shadow (4)
Editor (12)
Crash Report (3)
Utility (9)
UnityVS (2)
Facebook SDK (2)
iTween (3)
Font (18)
Ad (14)
Photon (2)
IAP (1)
Google (11)
URP (4)
Android (51)
iOS (46)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (188)
협업 (64)
3DS Max (3)
Game (12)
Utility (140)
Etc (99)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (52)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
이번에 감사하게도 페이스북 데브코리아 페이지의 이벤트에 담첨되어, 유나이트 코리아에 무료로 참석하게 되었습니다.

많은 인파가 몰려서 약간 정신 없기도 했었던 컨퍼런스 였지만 유익한 정보를 많이 얻어갈 수 있어서 참 기분이 좋았습니다.

유니티 5.0에서 추가되는 기능들에 대한 설명을 들을 수 있었구요.

뉴비 프로그래머인 저에게 도움이 되는 기술적인 테크닉을 알려주는 세션도 있었습니다.

이 좋은 내용들을 어떻게 나눌까 고민하다가 

즉흥적으로 메모했던 부분들을 첨부할까 합니다. 

좀 내용이 일관적이지 않고 앞뒤가 맞지 않지만 키워드 정도는 참고 가능하실지도 모를까 싶어 올립니다.

다음에도 이런 좋은 이벤트가 많이 열려서 데브코리아에 항상 상주하시는 개발자 분들과의 소통이 많이 되었으면 좋겠습니다. 

감사합니다!

ps1. 첫째날 세션4 유니티를 이용한 아키텍쳐 강의 프로젝트 파일을 다운받을수 있는 주소와
둘쨋날 세션4 더욱 강력한 C# 활용 강의 프로젝트 파일 주소를 받을 수 있었는데
혹시 몰라서 댓글 달아주시는 분께 비밀댓글로 알려드리도록 하겠습니다.


Day1 
세션 1.
메가님 그리고 그 이상을 뛰어넘어.
유니티 Pierre Paul Giroux


엔트리, 엑셉트 노드 추가.
스테이트 머신의 전환이 심플하게 가능해짐

idle이 여러게일 경우 많은 상태가 필요해 꼬이기 마련.
이걸 해결할수 있는 방안.

디시즌 노드를 FSM에 추가함.

아이들 머신이 자급자족이 가능.. (여러게의 아이들)

스테이스 모델들끼리 공유가 가능.
에셋스토어에서 판매가능

스테이트머신 비헤이비어 추가.

onStateEnter
엔트리에 들어갈때

onStateUpdate
엔트리 업데이트.
모든 프레임에서 이루어짐

onStateExit
끝날때

OnStateMove

onStateIK

스테이트머신이 자립.

애니메이션 연동해 이팩트 호완 가능..

이팩트 또한 연동작업이 가능.

메카님 코드를 완전히 공게

네비게이션 빌더.

프리뷰 화면 줌아웃 페이드 인 가능.

블랜드 쉐이프

캐릭터 표정 원프레임 애니메이션을 활용.

다이렉트 블랜드 트리 추가됨 5.0
(웃으면서 눈깜밖임, 입 벌리며 웃기)

5.0추가 되는 기능  정리..

스테이트 머신 전환 
간단하게 스테이트머신 로직 활용.

스테이트머신 비헤이비어
코드 로직을 스테이트 내에 바로 넣을수 있게 해줌.
idle, 트레일 렌더러 추가.

루트모션 애니메이션
2d게임에서 애니메이션 활용.
2d 네비게이션.

디렉트블랜드 트리
애니메이션 가중치를 직접적으로 연결.

루트 애니메이션 이슈..

Question..

애니메이션이 많아질 경우.. 메모리 문제 발생..

애니메이터는 프로그램 시작시 모두 로드가 됨.

애니메이션 옵티멀 기능을 꼭 사용해봐라.

예를 들어서 굉장히 괜 애니메이션이라도. 애니메이션이 1메가라면..

옵티멀 압축모드 사용해봤는지?

2.0 ~ 3.0시절의 애니메이션 기능이 사라진 경우에 대한 질문

애니메이터에서 연결되어서 사용되야 함.

애니메이터 사용시 메모리 할당이 많이 되어서 문제다..

레거시 모드... -> 중장기 적으로는 없애는 기능..


세션2.
유니티로 멀티플레이 게임 만들기, UNET
유니티 Erik Juhl

멀티 플레이 파운데이션 

피드백 받으려고 함

MMO까지 가능한 파운데이션을 제공해주려 함.

멀티 플레이 파운데이션은 뭔가?

전문가 적인 인프라 툴

로우레벨 api 소켓처럼 인터페이스가 됨

하이레벨 api 도 제공함.

네트워크 엔지니어 아니더라도 개발을 하려면 하이레벨이 정답.

메치 메이커. 

비전

phase 1
multiplayer foundation
not in 5.0 but releaed in unity 5.x

phase 2
server authoritative gameplay
being re

phase 3
..

why create the multiplayer foundation.
하이레벨로 먼저 개발해서 제공.. 네트워크 개발자들이 불만.. (레거시 시스템)

빠른 숙도가 요구되는 게임은 UDP 

MMO 동자원 문제.

이벤트 드리븐 IO

하이레벨 스크립트 api

서버와 클라이언트 하이레벨에섯 지원

네트워크 메시지를 주고 받을수 있고

클라이언트 서버모델이 기본적으로 설치되어 있음

클라이언트에서 서버로 바로 메시징

서버에서 클라이언트로 이동

클라이언트들끼리의 통신은 없음.
(로우레벨을 사용하여야 함)

Engine and ediotr integration

세션3
Asset Store 등록과 절차 소개
유니티 조현태

1. 에셋스토어 소개
2. 에셋스토어 활용법
3. 에셋 스토어 등록방법

에셋 스토어란 ?

장난감 상점..

에셋 = 장난감 = 리소스
게임을 제작할 때 필요한 모든 리소스
아트, 프로그래밍, 사운드, 템플렛

에셋 + 게임 제작 병행
- 에셋 스토어의 판매수익을 바탕을 게임 제작
제작한 게임 내의 자체 제작한 에셋을 에셋 스토어에서 판매.



에셋 스토어 활용.
다양한 애니메이션 셋
Mixamo <- 유명한 애니메이션 에셋.
수백게의 모델과 수천게의 애니메이션 제공

Particle Playground <- 파티클 에셋.

게임사운드 

Retro sound fx, 
효과음, 
배경음악, 각족 오디오 툴, 보이스 바니(캐릭터 대사를 글로 작성해 보내면 녹음해서 보내줌)

효율적인 프로그래밍

스크립팅 툴
플레이 메이커, uscript, nodify

쉐이더 프로그래밍 툴
shader forge
strumpy shader editor
shader fusion

AI스크립팅 툴
Befave 2 for unity
plyGAme
plyBlox

에셋 스토어 등록

1. 한번 올린 에셋은 영구적으로 판매가능
2. 서포트는 판매자가 직접 제공
3. 수익은 판매자와 유니티가 7:3으로 배분
2주에 한번씩 송금.

에셋 스토어 계정 만들기 - > 퍼블리셔 셋팅 -> 팩키지 올리기 -> 등록완료 검수를 기다림.


1. 가입하기

E-mail
password, 
repeat password, 
firstname, lastname, 
organization or company, 
address1, 
address 2, 
zip or postal code, 
city, 
country, 
phone number, 
vat number

2. 퍼블리셔 셋팅

퍼블리셔 유얼 에셋 버튼 클릭 -> 다운로드.

Asset Store Tools

publisher account

unity3d.com 홈페이지 가서 에셋 스토어의 publisher login 

paypal 페이팔 가입해서 2주에 한번 송금받는 방법. 
wire  한번 송금에 20 달러 250이하는 안됨


Asset Store Tools 에서
에셋스토어 등록.


세션4
유니티를 이용한 아키텍쳐
유니티 Rustum Scammell
Architecting GAmes in Unity
Common pattern.

Broken Windows
fix the windows
int new tork city, albuquerque and the netherlands, improving the physical appearance of a beighbourhood has been shown to reducecrime and increase quality life
people are influenced by their environment
social norms and conformity
routine monitoring

에셋 리스트 폴더관리.

good architecture = good standardss
use c#
Naming conventions.

switch-case 복잡함.

delegates 런타임 메모리가 항당되어 별로.....

delegates[] 사용!


Implementing Gameplay

싱글턴,

Pool Based Object.

bast-Practices

use c#
naming conventions
logical folder structure
zero-toler

Day2
기조연설 2
SquareEnix 드래곤 퀘스트의 모바일 개발과 전개

hatakeis@square-enix.com

스퀘어닉스 그룹.


모바일 사업 
- ios app 120 titles
- android os 80 titles

장점.

Single DL Contents(Premium)
싱글다운로드가 장점이다.

Free to Play Contents(Freemium)

드래곤 퀘스트

28년전 처음 출시.

국민적인 RPG.

드래곤 퀘스트 8 출시. 
유니티로 개발.

드래곤퀘스트  포탈
DQ overall information site
Platform Application of DQ1~ 3 treated as In-app purchse
DQ liaison page for smart phone

DL Status of DQ portal

over 4,000,000 for only 3 month

배경으로는 드래콘 퀘스트 1을 기간한정 무료 프로모션을 함.

드래곤 퀘스트 1의 무료 배포의 의미는..

드래곤퀘스트 1의 다운로드가 아닌 드래곤퀘스트 포탈의 다운로드...

드래곤 퀘스트 포탈에서 다운로드 받음... 인앱결제도 여기서..

400만명에게 다양한 프로모션이 가능해짐.

가장 마케팅적으로 좋은 솔루션은 푸쉬...

푸쉬 알림을 함으로서 스토어에 구입하려는 사람이 많음(구체적인 숫자는 노코멘트)



What's the titles with using Unity... 

스퀘어 에닉스 테크니컬 메니저(발표자 바뀜)

드래콘 퀘스트 8 포팅하는데 있어 유니티와 어떻게 활용을 했는지

모바일 개발을 위해서 모바일 개발의 트렌드에 대해 얘기를 한다.



1. 모바일 게임업계의 현제와 미래
2. 유저인터페이스와 게임디자인 (드래곤 퀘스트 8 에서 인터페이스와 디자인)
3. 스퀘어 에닉스와 유니티의 관계 스퀘어 에닉스가 유니티에서 포팅한 게임의 겟수.


먼저 모바일 게임의 현재와 미래..

진화하는 속도가 빨라지고 있다.

지금 현재와 미래의 전망.

현재 휴대폰 사양
cpu 32bit, 64bit,
gpu multi-core
graphics api
opengl es 1.1, 2.0 , 3.0
ram 1.0GB 
storage
64GB

콘솔과 같은 형태로 개발이 가능해지고 있다.

대용량 디바이스의 등장.. 과 우리가 어떤 타이틀을 만들것인가?


드래콘 퀘스트 8 포팅...

콘솔 타이틀을 손바닥 크기로.. 프레임 안정적.

콘트롤러의 수요..가 있고 대응하고 있음.... 

폰에서 피씨로 포팅... 그러기 위해서는 컨트롤러 대응 해야됨.


일본 스마트폰 시장 50% 점유율

역포팅 작업중.. pc 플스 엑박.. 닌텐도

유저 인터페이스 디자인.


세로 화면을 기준으로 개발..
플레이어가 편하게 실행 

전철에서 게임을 플레이 하는것을 타겟으로..

게임의 메인 유아이를.. 잘쓰는 손에 맞춰서 변경할 수 있도록 함.

이런부분을 세세하게 케어 해줘서 플레이를 손쉽게 즐길수 있또록 함.


게임 데이터.

스마트폰을 사용할때는 보통 멀티테스킹 작업.. (메일, 웹, etc)

어플리케이션을 많이 기동할수록 램이 부족해짐..

램이 부족해지면 백그라운드 프로그램 종료..

그래서

오토세이브를 생각했다.

자동으로 종료가 되면 자동저장이 된다.

자동저장이 없을때 많은 불만사항들이 생겼지만..

구현해서 적용 후 많은 호평을 받았음.



스퀘어 에닉스와 유니티의 관계..


유니티를 이용한 타이틀 9개
성검전설, 드퀘8, 데드맨즈 크로즈, 

왜 유니티를 사용하는 기회가 늘어났는지

유니티가 왜 활용하기 쉬운지..

많은 사용자로 인해 쉬운 대응이 가능.

커스텀마이징이 뛰어남.(?)

개발환경의 원 페키지 화.

소스를 재활용 해서 사용이 가능.


세션 1
유니티에서 웹개발의 미래
유니티 Jonas Echterhoff

아시아 시장이 사용량이 가장 많다.

HTML5 로 오면서 플러그인이 필요가 없어졌다.
(플러그인이 내장되어 있다.)

왜?

보안, 통제권 떄문에 브라우저 회사는 플러그인을 좋아하지 않는다.

플러그인은 점점 통제권이 사라지고 있다.

Web GL을 발표했다.

하드웨어 가속을 할수 있는 라이브러리.. (브라우저 내에서)

브라우저에 빌트인 되어 있기 때문에 플러그인이 필요 없다.

자바 스크립트를 사용하는 플러그인

유니티에 내장된 opengl api를 거의 수정하지 않음.

open web standard

파피어 폭스, 크롬, 인터넷익스플러러, 오페라 에서 가지고 있다.

사파리 같은 경우는 기본값이  disable 되어있어 제외.

유니티 솔루션을 구현하는 가장 좋은 솔루션이다. 

언어적 플러그인적 장벽이 없다..

항상 이 기능을 가지고 싶어 했다.

2년 전부터 구현하려고 함 HackWeek에서 시도를 시작

HackWeek란 2년에 한번씩 코펜하겐에 모여 새로운 아이디어 프로젝트 실험.

일주일 동안 테스트를 함.

데드 트리거 2 를 webGL로 구현.. 

와우... 잘 돌아감..


기술적으로 어떻게 되느냐?


유니티에서 웹 지엘을 사용하기 위해서는..?

웹 지엘은 자바 스크립트 api 이다.


유니티 엔진 코드는 C/ C++ 작성되어 있음.

c#이나 유니티 스크립트를 자바스크립트로 바꿔야 함.

Emscripten 크로스 컴파일러.

크랭 컴파일러를 이용해서 C++ 코드를 LLVM bitcode로 바꿔줌.

c 코드를 webgl로 바꾸는데 도움.. 서칭이 필요.


asm.js

자바 스크립트는 다이나믹 해서 코드 최적화가 어려움.

자바 스크립트의 서브 셋.

자바 스크립트를 AOT complie를 할수 있도록 함.

자바 스크립트의 빠른 실행을 하게 해줌.

자바스크립트의 서브셋 이기 때문에 완벽한 호완이 가능.

브라우저의 지원 여부에 상관없이 실행 가능.(webGL만 된다면..)

모질라에서 개발한 기술.

파이어폭시에서도 지원 가능.



지금은 파이어폭스에서만 지원함.




유저코드는 어떻게 해야하나?

C#을 어떻게 자바스크립트로 바꿔야 하나?


IL2CPP

C# -> C++로 만들어줌.

이코드를 asm.js를 사용

종합.
c# 스크립터를 웹에서 자바 스크립트로 변환이 가능..



C# -> .net 바이트 코드로 변환됨. 
이 닷넷 바이트 코드를 IL2CPP를 통해 C++코드로 변경.-> asm.js 를 활용해 자바스크립트로 변경.

|0 <- asm.js 에서 인티져로 사용하도록 함.


-> 최적화 패스를 함.


unity webgl 유니티 5.0에서 web gl을 어떻게 지원할 것인가?

초기 버전을 unity 5.0에서 구매 가능할거임.

처음에는 제약사항들이 많은거임.

데스크탑 버전과 파이어 폭스만 지원할 예정. -> 계속 늘어감.


5.0에서 제한되는 기능

video

runtime substance generation

networking ( www class is supported, but no .NET sockets)

마이크, 웹켐

스크립팅 디버깅



퍼포먼스는?

네이티브 코드만큼 빠를수가 없음.

얼마나 퍼포먼스가 떨어지는가?

브라우저에 따라 다름.(브라우저 마다 자바 스크립트 엔진이 다름)

asm.js를 지원하기 위한 움직임이 있어 확장할 가능이 있음.

멀티 쓰레딩을 사용하면 느려짐


최소한 네이티브 보다 50% 이상의 퍼포먼스를 보여준다.

데스크탑 pc의 50% 퍼포먼스는 그나마 많은것을 할 수 있다.

gpu 완전 지원이 되기 떄문에 고차원적인 렌더링을 많이 할 수 있따.

계속해서 발전이 될것이다.

유니티 프로파일러 100% 지원가능..


웹지엘 플러그인을 지원함.

unity 5.x 에서 기능적인 제약들을 없앨수 있도록 노력할것이다.

앞으로 더 많은 브라우저들이 webgl들을 지원해줄수 있을것으로 본다.

유니티 웹 플레이어는?

아직까지 가장 강력한 가장 광범위하게 지원되고 잇는 플러그인 이다.

두 기술을 동시에 지원할 계획 

유니티 웹 플레이어는 언젠가는 지원이 되지 않을 것인가?

마소는 웹지엘 작업중
애플도 지금 현재 웹 지엘 수정중

올해는 웹지엘 2.0이 나올텐데.

멀티쓰레딩 지원에 대해서는...? 브라우저 벤더들이 지원을 하려고 하고 있다는 얘기를 들었다.

지원이 되면 네이트브와의 퍼포먼스 차이를 줄임.

세션 2

유니티짱 한국에 상륙.
유니티 짱에 대한 이야기..

케릭터가 귀여우면 텐션이 올라간다?!

2년전에 유니티짱 프로토 타입 만들었지만 문제가..

캐릭터가 성공하지 못함..

일단 그리기가 어려움..

와닫는 부분이 없다. 제작이 힘든 부분. 임팩트가 없음..

유니티짱 프로토 타입 실패를 보고.. 2가지 요소를 생각..

그리기 쉬운 캐릭터, 그리기 어려운 캐릭터 

그리기 쉬우면 팬의 엑티비티가 높아진다..



셋팅 에셋. (표정, 움직임)

shared world


setting asset makes her live 

디자인을 100% 의도하고 만들었다..


액션 게임에서도 활용가능한 에셋을 제작하고 했음.

움직임을 보였을때 즐겁게 움직임을 보였으면 좋겠다.

배색도 중요.. 배색만 보고도 유니티 짱인지 알게 만드는것?


유니티 짱에 포함된 에셋

character model
shaders
animations

4 5 voices
locomotions
facial control sample

유니티 짱 라이센스.

전년도 수익 천만에 이하의 아래

금액을 넘게 되면 상의를 해달라..


2차 조작.. 동호인 활동 허가

기술적인 데모 아카데미 데모에서 사용 가능.




수익 상한선을 넘었을때 상의 바람.
야한거 안됨...;;

정치적인 메시지 전달 안됨


케릭터 개조할경우 라이센스를 숨겨야 함.

기술적인 언급은 없었음... 



세션 3

Unity Test Tools
유니티 tomek paszek
이시간은 살짝 졸았내요;;

tomek paszek toolsmith
테스트 인프라 개발 관리.


테스트의 개괄적인 내용.

테스트를 자동화 시켜야 하는 이유?

테스트의 목적인 리그레이션을 찾기 위함임.

테스트 자동화는 퀄리티 계약을 하는것과 같다..

코드를 납품하는 회사의 퀄리티 계약 'ㅅ'.




테스트를 자동화 하기 때문에 더많은 테스트를 할수 있다.

개발의 막바지에 갈수록 비용이 많이 든다.



Unity Test Tools goals

fill out the gap in the industry
evanglize testability
버그 레포트를 제출하는 세로운 방법.


자동화 피라미드

UI
Integration
Unit

유니티 테스트 툴

유닛 테스트 러너

어세션컴포넌트

인테그레션 테스트 러너



Unit Test Runner 사용 방법

  
코드를 리컴파일 할때마다 테스트 하도록 셋팅.


세션 4

더욱 강력한 C# 스크립트 활용
정해종


유니티 허브 프리데브로 활동중.


큐어스노우대표 + 게임개발자



Big Script -> Small Script


Master 클래스..


모노 비헤이비어 상속 -> 모노 비헤이비어를 상속 받는 마스터 클래스.


All round variable
로컬 변수

all round variable - local sharing
로컬 공유



Class RabitAttack : 모노 -> RabitAttack : Master


마스터 클래스에서 공용변수를 공유

vars.setBool(), vars.getBool() api 를 제작하여 활용.


전역 공유

varAll.




오브젝트 변수들을 저장하고 싶은 경우에는?

파일 입출력 할 경우.

var.setFloat("speed", 1.of);
var.setString("name", '홍길동");
var.


아웃풋된 파일을 로드해서 적용.
var.LoadFile("경로/파일명.txt");
var.getInt("monsterCount");

데이터베이스를 따로 구축하지 않고 파일입출력을 활요해서 적용.



데이터를 데이터베이스로 보내는 기능도 있음
var.SetString("id","test");
var.SetString("password"","1234");
var.SendHttp("주소");

http 응답을 기다려야함..

변수의 값이 바뀌었는지 확인.


Master Find - catched find 만능 변수 객체
var.FInd

한번만 찾고 변수가 바뀌지 않는 이상 비용이 크게 들지 않음.

MasterName 

NGUI 클래스에 마스터 클래스 넣고 이름 설정해서 찾기하면 비용이 적게 든다.

All round Variable - modify detection
만능 변수 객체 - 변수 수정감지

OnVariableChange(string name)
{
}

만능 변수 객체 - 문자열을 이용한 변수 설정.
all round Variable - set by string

var.FromString("int a = 1; int b = 2; string = "ttttt";);
마스터 클래스에서 변수가 설정됨.




애니메이터 사용하기


다중 오디오 사용하기.


타이머 설정
코루틴 몰라도 사용 가능.

암호화 되는 playerPrefs 사용.



출처 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=45126&page=0&sca=&sfl=&stx=&spt=0&page=0&currentId=44#c_45143

반응형
Posted by blueasa
, |

유니티 – 그래픽 성능 최적화

원문 - http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html

자주 보는 문서라 한글로 보는 게 편할 것 같아 번역해서 적어놓습니다. 오역이 있을 수 있습니다. T_T

 

2012년 7월 29일 자 버전 번역본

 

그래픽 성능 최적화

대다수 게임의 성공에 있어 좋은 성능은 가장 중요한 부분입니다. 아래 내용은 여러분 게임의 그래픽 렌더링 속도를 최대화하는 몇 가지 요약 지침입니다.

 

그래픽 비용이 어디서 많이 드는가

여러분 게임의 시각적 부분은 컴퓨터의 두 장치 GPU나 CPU에서 주로 비용을 사용합니다. 무슨 최적화든지 간에 첫 번째로 볼 것은 성능 문제가 있는 곳을 찾는 것입니다. 왜 그러냐 하면 GPU와 CPU의 최적화 방법은 상당한 차이(도 있고 반대로 GPU일 때도 그렇지만, CPU를 최적화하는 동안 GPU를 좀 더 일하게 하는 일이 상당히 흔하기)가 있기 때문입니다.

 

발생 빈도가 높은 병목과 그를 확인하는 방법

 

- GPU는 보통 fillrate나 메모리 대역폭에 의해 제약을 받습니다.

- 게임을 저해상도로 돌리면 더 빨라진다고요? 그렇다면, 아마도 GPU상의 fillrate에 의해 제약받고 있을 겁니다.

- CPU는 보통 draw calls라고 부르는 렌더링을 해야 하는 물체 수에 의해 제약을 받습니다.

렌더링 통계 창에 나오는 draw calls를 확인해 보세요. 이게 몇천(PC에서)이나 몇백(모바일에서)을 넘는다면 물체 수를 최적화해야 합니다.

 

물론, 이건 보통 이렇다는 겁니다. 병목은 다른 곳에 있을 수도 있습니다. 발생 빈도가 낮은 병목은 다음과 같습니다.

 

- GPU와 CPU 둘 다 확인해도 렌더링이 문제가 아닌 경우! 예를 들어, 직접 작성한 스크립트나 물리가 실제 문제를 일으키고 있을 수 있습니다. 분석기를 사용해 문제를 찾아보세요. (하지만 난 베이직이지.)

- GPU가 처리할 정점이 너무 많은 경우. 얼마나 많은 수의 정점이 “괜찮은지”는 GPU와 정점 셰이더의 복잡도에 의해 좌우됩니다. 모바일에서는 “십만 개를 넘지 않고”, PC에서는 “몇백만 개를 넘지 않는 것”이 적당합니다.

- CPU에서 처리하는 정점이 처리하기엔 너무 많은 경우. 골격 메시(skinned meshes), 피복 시뮬레이션, 입자(particle) 등이 될 수 있습니다.

 

CPU 최적화 – draw call 수

어떤 물체를 화면에 표현하기 위해 어느 조명이 물체에 영향을 주는지 알아내기, 셰이더와 셰이더 매개변수를 설정하기, 그리기 입력을 그래픽 드라이버로 보내기, 그래픽 카드로 보낼 명령을 준비하기 같은 몇 가지 작업을 CPU가 합니다. “물체당 한 번씩”하는 앞에 나온 모든 CPU 작업은 그렇게 많이 저렴하지 않기 때문에 보이는 물체가 많다면 비용이 증가할 것입니다.

 

예를 들어서, 삼각형(보통 국내에서는 폴리곤이라고 부르는데 원문 그대로 번역합니다.) 천 개를 가지고 있다고 합시다. 삼각형 하나로 구성된 천 개의 개별적인 메시가 있을 때보다 모든 삼각형이 한 개의 메시 안에(로 구성되어) 있을 때가 비용이 더 많이 많이 저렴할 겁니다. GPU상에서 두 경우의 비용은 아주 비슷하지만, CPU에서 천 개의 물체를 표현 완료하는 것은(한 개에 비해) 비용이 상당할 것입니다.

 

CPU가 일을 더 적게 하도록 보이는 물체 수를 줄이는 것이 좋습니다.

 

- 근접해 있는 물체들을 유니티의 draw call 일괄처리를 사용하거나 직접 합칩니다.

- 개별 텍스처를 큰 텍스처 지도(texture atlas)에 넣거나 다른 방법으로 물체의 재질(materials)을 적게 사용합니다.

- 물체를 여러 번 렌더하게 하는 기능을 적게 사용합니다. (반사, 그림자, 픽셀당 조명 등등, 아래 참조.)

 

각각의 메시가 최소 몇백 개의 삼각형을 갖도록 물체들을 함께 합치고 합친 메시당 한 개의 재질만 사용합니다. 재질을 공유하지 않는 두 물체를 합치는 것은 성능 향상이 전혀 없다는 것을 이해하는 것이 중요합니다. 두 메시가 같은 텍스처를 사용하지 않는 것이 다중 재질을 사용하는 가장 흔한 이유이기 때문에 CPU를 최적화하려면, 반드시 합치려는 물체가 같은 텍스처를 사용하게 해야 합니다.

 

하지만 전방 렌더링 패스에서 픽셀 조명을 많이 사용하면 아래에 설명한 대로 물체 결합을 할 수 없는 상황이 생길 수 있습니다.

 

GPU: 모델의 지오메트리 최적화

모델의 지오메트리(기하 구조, 외형, 외견, 폴리곤)를 최적화하려면 기본적으로 두 가지 해야 할 것이 있습니다.

 

- 필요하지 않은 경우 삼각형을 더 사용하지 말 것

- UV 매핑 이음새(재봉선, uv가 분리되어 버텍스를 공유하지 못하기 때문에 처리해야 할 데이터가 늘어납니다.)와 심한 모서리(겹쳐있는 정점) 수를 가능한 한 적게 유지하도록 노력할 것

 

그래픽 하드웨어에서 처리하는 실제 정점 수는 삼차원 모델링 프로그램에서 알려주는 수와 대개 같지 않다는 것을 주목하세요. 모델링 프로그램은 보통 기하학적 정점 수, 즉 모델을 구성하는 꼭짓점 수를 표시합니다. 하지만 그래픽 카드는 렌더링을 위해 어떤 기하학적 정점을 두 개나 그 이상의 실제 정점으로 분리해야 할 때가 있습니다. 정점이 다중 법선, 다중 UV 좌표나 다중 정점 색상을 가지고 있다면 반드시 분리해야 합니다. 그 결과 유니티에서 표시되는 정점 수는 언제나 삼차원 프로그램이 알려주는 것보다 많습니다.

 

모델의 지오메트리 양은 GPU와 관련이 가장 많지만, CPU에서 모델을 처리하는 메시 스키닝과 같은 유니티의 몇몇 기능도 관련이 있습니다.

 

조명 성능

전혀 계산하지 않는 조명이 항상 가장 빠릅니다! (당연한 거 아닌가?!) 프레임마다 계산하는 대신 정적 조명을 딱 한 번 “굽는” 라이트맵을 사용해보세요. 유니티에서는 단순히 장면(scene) 안에 조명을 설치하는 것보다 라이트맵이 적용된 주변 환경(지형, 배경 등)을 생성하는 과정이 살짝 할 게 더 많지만,

 

- 이렇게 하면 더 많이 빨라집니다. (픽셀당 조명 2개의 경우 2~3배 정도)

- 전역 조명을 구울 수 있고 라이트매퍼가 결과물을 부드럽게 할 수 있으므로 시각적으로 더 많이 좋아집니다.

 

대개 곳곳에 조명을 더 추가하는 대신 셰이더와 콘텐츠로 간단하게 속임수가 가능합니다. 예를 들어 “뒷조명(rim lighting, 역광)” 효과를 얻기 위해 카메라 쪽을 곧게 비추는 조명을 추가하는 대신 전용 “뒷조명” 계산을 셰이더를 안에 직접 추가하는 방법을 고려해보세요.

 

전방 렌더링의 조명

픽셀당 동적 조명은 영향을 받는 모든 픽셀에 큰(significant) 렌더링 부담(overhead)를 추가로 주고 물체들을 다중 패스 렌더링을 하게 합니다. 모바일과 최저사양 PC의 GPU처럼 사양이 낮은 기기에서는 한 개의 물체에 하나 보다 많은 픽셀 조명이 비추는 것을 피하고, 정적 물체를 밝히기 위해 조명 계산을 모든 프레임마다 하는 대신 라이트맵을 사용해보세요. 정점당 동적 조명은 정점 변형 시 큰 비용이 추가될 수 있습니다. 어떤 물체든지 여러 조명이 비추는 상황을 피하려고 노력하세요.

 

만약 픽셀 조명을 사용하고 있다면 각각의 메시는 픽셀 조명이 메시를 비추는 만큼 여러 번 렌더링 될 것입니다. 아주 멀리 떨어진 두 메시를 합쳤다면 합쳐진 물체의 영향을 받는 크기는 증가할 것입니다. 이 합쳐진 물체를 비추는 모든 픽셀 조명은 렌더링 중 (조명 빛이 닿지 않는 멀리 떨어진 부분도) 계산에 들어가기 때문에 렌더링해야 할 렌더링 패스 수가 증가할 것입니다. 일반적으로 합쳐진 물체를 반드시 렌더해야 되는 패스 수는 (합치게 될) 각 개별적 물체의 패스 수의 합이기 때문에 물체를 합쳐서 추가되는 것은 없습니다. 이런 이유로 다른 위치에 있는 픽셀 조명의 영향을 받게 될 너무 멀리 떨어진 메시들을 합쳐서는 안 됩니다.

 

렌더링 중, 유니티는 메시를 둘러쌓고 있는 모든 조명을 찾고 이중 가장 영향을 주는 조명을 계산합니다. 얼마나 많은 조명이 픽셀 조명과 정점 조명이 될 건지 조정할 때 품질 설정을 사용합니다. 각각의 조명은 메시로부터 얼마나 멀리 떨어져 있는지에 기반을 둔 중요도와 빛이 얼마나 강할지를 계산합니다. 그뿐만 아니라 몇몇 조명은 순전히 게임 맥락(개발자의 의도)에 따라 다른 조명보다 더욱 중요하므로 모든 조명은 Important또는 Not Important를 설정할 수 있는 표현 방법(Render Mode) 설정을 가지고 있고 조명이 Not Important로 설정된 조명은 일반적으로 낮은 간접 처리를 하게(갖게) 됩니다.

 

예를 들어, 플레이어의 자동차가 전조등을 켜고 어둠 속에서 달리고 있는 자동차 게임을 생각해보세요. 전조등은 게임에서 시각적으로 가장 중요한 조명이기 때문에 표현 방법을 아마도 Important로 설정할 것입니다. 반면에 게임의 (다른 자동차의 후면등 같은) 다른 조명들은 덜 중요하고 픽셀 조명의 시각 효과 향상이 없을 것입니다. 이런 조명들이 작은 이익을 줄 수 있는 곳에서 렌더링 비용이 버려지는 것을 피하고자 렌더 모드를 안전하게 Not Important로 설정할 수 있습니다.

 

픽셀당 조명 최적화는 CPU와 GPU 양쪽 모두 자원을 절약하게 합니다. CPU는 draw call이 적게끔 하고 GPU는 처리할 정점이 적게끔 하며 이 모든 추가적인 렌더링의 레스터라이즈될 픽셀을 적게 만듭니다.

 

GPU: 텍스처 압축과 밉 맵

압축된 텍스처를 사용하면 텍스처의 크기를 줄일 수(그 결과 로딩 시간이 더 짧아지고 메모리가 차지하는 공간이 더욱 작아집니다.) 있고 렌더링 성능을 극적으로 올릴 수 있습니다. 압축된 텍스처는 압축되지 않은 32bit RGBA 텍스처가 필요로 하는 메모리 대역폭의 일부만 사용됩니다.

 

텍스처 밉 맵 사용하기

(mipmaps 또는 MIP maps, 앞에 있는 MIP는 라틴어 multum in parvo에서 온 말로 작으면서 효율적(much in little)이라는 뜻이 있다네요…그렇다고요 ;ㅁ;)

경험상 말하자면, 삼차원 장면에서 사용되는 텍스처는 밉 맵 생성하기(Generate Mip Maps)를 항상 켜두세요. 같은 식으로 텍스처 압축도 적용하면 GPU가 렌더링 중일 때 전송되는 텍스처 데이터양을 제한하는 데 도움이 됩니다. 밉 맵이 적용된 텍스처는 GPU가 작은 삼각형에 저해상도 텍스처에 사용할 수 있게 합니다.

 

위 내용의 한 가지 예외는 텍셀(텍스처 픽셀)이 2D 게임상이나 UI 요소로써 화면 픽셀에 1:1로 적용되어 렌더할 때입니다.

 

LOD와 레이더당 배제 거리

몇몇 게임에서는 CPU와 GPU가 사용되는 것을 줄이기 위해 큰 것보다 작은 물체를 더욱 공격적으로 배제(cull)하는 것이 적절할 수 있습니다. 예를 들어서 먼 거리에서 큰 건물이 아직 보일 때 작은 돌과 파편은 (화면 픽셀보다 작아져서) 보이지 않을 수 있습니다.

 

위 내용은 Level Of Detail 기능(하지만 난 베이직이지.)을 사용하거나 카메라의 레이어당 배제 거리를 직접 설정해서 적용 할 수 있습니다. 작은 물체를 개별 레이어에 넣고 Camera.layerCullDistances 스크립트 함수를 사용해서 레이어당 배제 거리를 설정할 수 있습니다.

 

실시간 그림자

실시간 그림자는 멋지긴 하지만 CPU에는 draw calls를 추가하고 GPU에는 추가 처리를 하게 하여 성능에 상당한 비용이 들게 합니다. 더 상세한 내용은 그림자 항목을 보세요.

 

GPU: 높은 성능의 셰이더 작성법

최고사양 PC의 GPU와 최저사양 모바일 GPU는 성능이 말 그대로 수백 배 차이가 날 수 있습니다. 단일 플랫폼에서도 마찬가지입니다. PC 상에서 빠른 GPU는 느린 통합형 GPU보다 수십 배 빠르고 모바일 플랫폼에서도 똑같이 GPU 간에 큰 차이를 볼 수 있습니다.

 

그러므로 모바일 플랫폼과 최저사양 PC의 GPU 성능은 여러분이 개발하고 있는 장비보다 매우 낮을 거란 것을 기억해야 합니다. 보통 셰이더는 좋은 성능을 얻기 위해 계산과 텍스처 읽기를 줄여 손수 최적화해야 합니다. 예를 들어 몇몇 내장(built-in) 유니티 셰이더는 더 빠른(지만 어떤 제약을 받거나 비슷한 효과를 사용하기 때문에 더 빠른) “모바일” 대용 셰이더를 갖고 있습니다.

 

아래 내용은 모바일과 최저사양 PC의 그래픽 카드에 가장 중요한 몇 가지 지침입니다.

 

복잡한 수학적 연산

수학의 (pow, exp, log, cos, sin, tan, 등등 같은) 초월함수는 비용이 상당하기 때문에 경험상 볼 때 저런 픽셀당 연산은 하나를 넘으면 안 됩니다. 하나를 넘었다면 대용으로 룩업 텍스처를 사용하는 것을 고려해 보세요.

 

어떻게 하든 간에 직접 normalizedotinversesqrt 연산을 작성하려는 것은 권장하지 않습니다. 내장 함수를 사용하면 드라이버가 더 나은 코드를 만들어 낼 것입니다.

 

알파를 테스트하는(버리는) 연산은 프라그먼트(픽셀) 셰이더를 느리게 만든다는 것을 기억하세요.

 

부동 소수점 연산

직접 셰이더를 작성할 경우 부동 소수점 변수의 정밀도(precision)를 반드시 적어야 합니다. 최상의 성능을 얻기 위해 가능한 낮은 정밀도의 부동 소수점 형식을 고르는 것은 중요합니다. 연산의 정밀도는 대게 데스크톱 GPU에서는 완전히 무시되지만, 대부분의 모바일 GPU 상에서의 성능에 있어서는 중요합니다.

 

셰이더가 Cg/HLSL로 작성되어 있다면 정밀도는 다음과 같이 명시되어 있습니다.

 

float : 32-bit를 전부 사용하는 부동 소수점 형식으로 정점 변형에 적합하지만, 성능에 있어 가장 느립니다.

half : 16-bit로 줄인 부동 소수점 형식으로 텍스처 UV 좌표에 적합하고 대략 float보다 두 배정도 빠릅니다.

fixed : 10-bit 부동 소수점 형식으로 색상, 조명 계산과 다른 고비용 연산에 적합하며 대략 float보다 네 배정도 빠릅니다.

 

셰이더가 GLSL ES로 작성되어 있다면 부동 소수점 정밀도는 각각 highpmediumplowp로 명시되어 있습니다.

 

셰이더 성능에 대해 더 자세한 내용은 셰이더 성능 항목을 읽어보세요.

 

게임을 더욱 빠르게 만들기 위한 요약 확인 항목

- PC 게임을 만들고 있다면 목표로 하고 있는 GPU에 맞춰 정점 수를 프레임당 2십만에서 3백만 아래로 유지하세요.

- 내장 셰이더를 사용하고 있다면 모바일이나 Unlit 범주에 있는 것을 고르세요. 이 셰이더들은 기존 복잡한 셰이더를 간략화하고 비슷한 효과를 내게 만든 형태로써 모바일이 아닌 플랫폼에서도 잘 동작합니다.

- 장면 하나당 재질 종류 수를 적게 유지하세요. 다른 물체끼리 재질을 가능한 한 많이 공유하세요.

- 움직이지 않는 물체에 Static 속성을 적용해서 Static batching 같은 내부 최적화를 할 수 있게 하세요. (하지만 난 베이직이지.)

- 필요하지 않다면 픽셀 조명을 사용하지 말고 지오메트리에 영향을 주는 픽셀 조명(될 수 있으면 방향 조명)을 하나만 있게끔 하세요.

- 필요하지 않다면 동적 조명을 사용하지 말고 대신 라이트맵을 사용하세요.

- 가능하다면 압축된 텍스처 형식을 사용하세요. 사용할 수 없다면 32bit보다 16bit를 주로 사용해보세요.

- 필요하지 않다면 안개를 사용하지 마세요.

차폐 배제(Occlusion Culling)의 이점을 알고 차폐가 많은 복잡한(물체가 많은) 정적 장면의 경우 보이는 지오메트리와 draw-calls 양을 낮추기 위해 차폐 배제를 사용하세요. 차폐 배제로 인한 이점에 맞춰 레벨을 제작하세요. (하지만 난 베이직이지.)

“가짜” 원거리 지오메트리를 표현하기 위해 스카이박스를 사용하세요.

- 여러 텍스처를 섞기 위해 다중 패스 방식 대신 픽셀 셰이더나 텍스처 합성기를 사용하세요.

- 직접 셰이더를 작성하고 있다면 가능한 항상 가장 정밀도가 낮은 부동 소수점 형식을 사용하세요.

fixed / lowp : 색상, 조명 정보와 법선용.

half / mediump : 텍스처 UV 좌표용.

float / highp : 픽셀 셰이더에서는 피할 것. 정점 셰이더에서 위치 계산용으로 사용하는 것이 좋습니다.

- 픽셀 셰이더에서 powsincos 등등과 같은 복잡한 수학 연산 사용을 최소화하세요.

- 프래그먼트(화면 픽셀)당 텍스처를 적게 사용하세요.



출처 : http://fetchinist.com/blogs/?p=712

반응형
Posted by blueasa
, |
유니티 관련 3DS Max 에서 작업시 유의사항


- 이곳에서는 3DS Max 에서 유니티 관련 작업을 할 때 유의사항들을 하나하나 정리해 보려 합니다.

익스포트(Export)모델링 데이타는 가급적 FBX 포멧을 사용하자.
: 유니티에서 3DSMAX 와 MAYA 포맷을 지원하지만 내부적으로는 표준 그래픽 교환 포멧인 FBX 로 변환해 관리한다. 가급적 FBX Exporter 툴을 사용해 FBX를 만든 후 유니티로 가져오는 것을 권장한다.

최신의 FBX 익스포터를 사용하자.
: 과거 버전에서 만든 파일을 임포트할 경우 결과가 달라질 수 있으므로 가능한 한 가장 최신의 FBX 익스포터를 사용한다.

FBX를 내보내기 전에 Resource Collector 를 사용해 텍스처를 Asset 폴더로 복사할 수 있다.


3차원 좌표계유니티는 기본적으로 Y축이 위를 향하는 왼손 좌표계를 사용한다.
: FBX 익스포터 옵션에서 Y UP 으로 설정되어 있는지 확인하도록 하자.


스케일(Scale)유니티에서 1의 단위는 1미터를 의미한다.
: Scale Factor 를 통해 모델링을 불러올 때 스케일을 조정할 수 있지만, 가급적 모델링 작업 때 이 단위를 감안하자.


노멀(Normal) 구성대부분의 유니티 셰이더는 기본적으로 뒷면은 그리지 않도록 설정되어 있다.
: 일반적으로 그래픽 소프트웨어는 양면을 다 그리는 반면 유니티 셰이더는 그렇지 않다. 이 때문에 면의 노멀 방향이 잘못되어 있을 경우 그래픽 소프트웨어에서 잘 보이는 물체가 유니티에서는 잘 안 보일 때가 있다.


텍스처(Texture)유니티에서는 이미지가 RGBA 압축된 DXT 이미지인 .dds 형식으로 변환하여 사용된다.
: 유니티에서는 이미지를 .dds 형식으로 변화하여 사용됨으로, tif, psd 같은 대용량 파일도 마음대로 사용해도 된다.

2의 제곱수 사이즈의 텍스처를 사용하자
: 2의 제곱수 이미지를 사용하면 밉매핑(mip-mapping) 이미지가 사용될 때, 아티팩팅(artifacting) 이라는 깜빡임 현상으로 인한 부작용이 거의 없어진다. 또한 컴퓨터 내부적으로 메모리가 2의 제곱수 블록 형태로 사용됨으로 메모리 최적화와 효율성에서 이득이 있다. 가능하다면 이미지는 항상 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 등의 크기로 만들어야 한다.


재질(Material)재질(Material)이름과 텍스처 파일명과 같게 하자
: Unity3D 툴 재질에 텍스처가 자동으로 들어가게 하려면 이름이 같아야 한다.

유니티는 임포트 시점에 객체에 대해 기본 디퓨즈 텍스처만을 생성한다.
: 범프(bump)나 반짝임, 높이, 기타 특수 맵은 직접 추가해야 한다.


메시(Mesh)맥스 객체는 모서리 문제를 막기 위해 에디터블 폴리 대신 에디터블 메시로 병합해야 한다.
: FBX는 회전 모서리를 지원하지 않으므로 내보내는 과정에서 모델이 변경될 수 있다.


애니메이션(Animation)복잡한 애니메이션 계층구조는 유니티에 임포트할 때까지 정사영 방향으로 유지한다.
: 유니티는 비정사영 회전 매트릭스를 지원하지 않는다.

유니티는 현재 모프 타깃 같은 정점 애니메이션을 지원하지 않는다.
: 정점 단위로 객체에 영향을 주는 애니메이션은 항상 뼈대를 사용해 처리해야 한다.

각 비헤이비어(behaviour)나 타임 세그먼트의 시작 및 끝에 있는 변형과 객체에 대해 모두 키를 지정한다.

비헤이비어의 타임 세그먼트는 여러 객체가 같은 이름의 타임 세그먼트나 클립을 사용하지 않는 한 겹치지 않게 한다.


출처 : http://www.devbb.net/viewtopic.php?f=37&t=1120

반응형
Posted by blueasa
, |

VS2013을 깔았는데 Unity3D의 External Tools에 리스트가 뜨지 않길래 찾아보니 수동 등록 방법이 있다.


How to use Visual Studio 2013

  1. In Unity Editor go to Edit->Preferences->External Tools and In External Script Editor choose Browse from the drop down box.
  2. Browse to and select C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe.
  3. The External Script Editor should automatically show your selected editor as Visual Studio 2013.
  4. That’s it! It should just work from that point on.

Visual Studio fails to load for me!

Some people may have trouble loading VS2013 even after applying the correct settings above. The solution, for the time being, is to run Visual Studio 2013 beforehand and then the Unity Editor will successfully load its own project instance.

It works now but its not quite right

The above method isn't perfect and that is because Unity3D just doesn't properly generate the correct project files. If you don't like the limitations of the above method and you're able to afford it the best option right now is still buy the UnityVS plugin for Unity3D.



출처 : http://stackoverflow.com/questions/19889848/working-with-unity3d-and-visual-studio-2013

반응형
Posted by blueasa
, |
// 해당 폴더가 있는지 체크하기 위해..
Object oTargetFolder = AssetDatabase.LoadAssetAtPath("Assets/Resources", typeof(Object));

if(null == oTargetFolder)
{
    // 못찾으면 폴더 없다고 보고 폴더 생성.
    AssetDatabase.CreateFolder("Assets", "Resources");

    // 한 번 더 찾기 시도..
    Object oTargetFolder2 = AssetDatabase.LoadAssetAtPath("Assets/Resources", typeof(Object));

    if(null != oTargetFolder2)
    {
        // 있으면 셀렉트 되도록 대입..
        Selection.activeObject = oTargetFolder2;
    }
}
else
{
    // 있으면 셀렉트 되도록 대입..
    Selection.activeObject = oTargetFolder;
}


우선 위와같은 방법으로 했는데.. 더 좋은 방법이 있는지는 모르겠다..

폴더도 오브젝트일까? 라는 생각으로 해봤는데 오브젝트인가보다..잘되네..@ㅅ@;;

반응형
Posted by blueasa
, |

유니티는 Profiler라는 기능을 지원하여 현재 사용중인 플랫폼의 어플 동작상태를 알수가있는데

폰과 연결이 되지않아 사용을 못하고있었는데 오늘 해결책을 알게되어 공유합니다.

 

1. 빌드시 Development Build 체크

2. Autoconnect Profiler 체크

 

빌드후 어플실행시 Profiler 가 실행되고, Active Profiler 에 AndroidPlayer가 보이게된다.

이때 AndroidPlayer 선택이 되지 않는다면

윈도우 커맨드창에(Console)

안드로이드SDK/platform-tools/ 폴더로 가서

 

adb forward tcp:54999 localabstract:Unity-패키지명(Product Name)

 

와 같이 입력후 다시 선택하면 됩니다.

(명령어 입력시 콘솔창에는 아무것도 어떠한 출력도 하지않고 다시 입력대기상태가됩니다.)

Profiler 를 이용하면 기기에서 어플 동작중 어떤 스크립트에서 CPU 를 얼마나 쓰다던지의 좋은 정보를 많이알수있기때문에 메모리와 퍼포먼스관련 문제를 해결하는데

큰 도움이 될꺼라 생각합니다.


* 회사메일로 공유한내용을 혹시나 도움이 되실까 올립니다 ㅎ



출처 ; http://www.gamecodi.com/board/zboard-id-GAMECODI_Talkdev-no-1919-z-2.htm 쿠하님



참조 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&page=1&sn1&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=2364

반응형
Posted by blueasa
, |

유티니 스크립트 기본 형태는


[UnityFolder]\Editor\Data\Resources\ScriptTemplates

안에 들어있습니다. 원하시는 형태로 바꿔 쓰세요 :) 

Unity 4.3 기준

------------------------------------------------------------------------

맥은 Contents -> Resources -> ScriptTemplates 이네요



반응형
Posted by blueasa
, |

Text Gizmo

Unity3D/Tips / 2014. 2. 7. 16:41


  1. void OnDrawGizmos() {
  2.     Handles.Label(transform.position, transform.name);
  3. }


출처 : http://forum.unity3d.com/threads/27902-Text-Gizmo


참조 : http://tsubakit1.hateblo.jp/entry/2014/07/25/222017


참조 : http://docs.unity3d.com/Documentation/ScriptReference/Handles.Label.html


반응형
Posted by blueasa
, |

원문은 이곳에서 보실수 있습니다.
더 많은 번역 글은 
http://unityindepth.tistory.com/에서 보실수 있습니다.



"14일만에 0에서 60프레임 만들기" 
Unity3D를 사용하여 우리의 게임을 최적화시키면서 배웠던 것들


부드러운 게임 플레이는 매끄러운 프레임 레이트를 기반으로하는데, 아이폰과 아이패드를 대상으로 60프레임에 이르게하는 것은 우리의 다가오는 액션 게임, Shadow Blade의 중요한 목표였다. (http://shadowblade.deadmage.com)

다음은 우리가 고려해야 했던 것과 성능을 개선시키기위한 게임 내의 변화, 그리고 집중적인 최적화 기간 동안 목표 프레임에 도달하게하는 것들에 대한 요약이다.

기본적인 게임 기능이 잘 작동되고 난 후, 목표로 설정한 게임 성능을 만족시켜야 했다. 우리의 주요 성능 측정 툴은 내장 유니티 프로파일러와 Xcode 프로파일링 툴이였다. 유니티 프로파일러를 사용하여 장치에 실행중인 코드를 프로파일하는 것은 매우 유용한 특징이라는 것을 증명했다.

여기 우리의 요약과, 집중적인 측정, 수정, 재측정에 대해서 배운 것들이 있고, 그 결과 우리의 목표 장비에 고정된 60프레임을 만들 수 있었다.

1 – 가비지 컬렉터라고 불리는 흉포한 괴물과 직접 맞서라.

C/C++ 게임 프로그래밍 배경에 비롯하여, 우리는 가비지 컬렉터의 특정한 행동을 사용하지 않았다. 사용하지 않는 메모리를 당신 대신에 자동으로 깨끗이 하는 것은 일단 매우 멋진 일이지만, 곧 실제로 효과가 서서히 나타나기 시작하고, 쓰지 않는 메모리를 모으는 가비지 컬렉터에 의해 당신은 CPU Load를 보여주는 프로파일러에서 정기적인 급등을 목격할 것이다. 이는 특별히 모바일 장비에서 거대한 이슈로 드러났다. 메모리 할당과 이를 제거하는 것은 최우선순위가 되었고, 여기에 우리가 취했던 몇가지 주요 행동들이 있다:

  1. 코드에서 문자열 병합을 제거하라. 이는 가비지 컬렉터가 수거할 수 있는 많은 쓰레기를 남긴다.
  2. foreach 반목문을 간단한 "for" 반복문으로 교체해라. "foreach" 반복문에서 한번 돌 때마다 24Byte의 쓰레기 메모리를 생성한다. 10번을 반복하는 간단한 반복문은 납득할 수 없는 GC가 수거 가능한 240byte의 메모리를 남긴다.
  3. 게임 오브젝트의 태그를 비교하는 방법을 교체해라. if(go.tag == "Enemy")를 사용하는 대신에, 우리는 if(go.CompareTag("Enemy")를 사용했다.
    객체에 tag 프로퍼티를 호출하는 것은 추가적인 메모리를 할당하고 복사하며, 이 같은 비교문이 내부 반복문에 있다면 정말 나쁘게 작용한다.
  4. 오브젝트 풀은 훌륭하며, 우리는 게임이 실행되는 동안에, 레벨을 진행하고 있을 때, 어떤 것도 동적으로 할당하지 않기 위해서 동적 게임 오브젝트를 위한 풀을 만들고 사용 했다.
  5. LINQ 명령어를 사용하지 않았다. 그들은 중간 버퍼를 할당하는 경향이 있는데, 이는 가비지 컬렉터의 음식이다.
2 – High-Level 스크립트와 네이티브 엔진 C++코드간의 커뮤니케이션 오버헤드에 신경써라.

유니티3D를 사용하여 작성된 모든 게임플레이 코드는, 우리의 경우 Mono runtime을 사용하여 처리되는 C#으로된 스크립트 코드였다. 엔진 데이터와 커뮤니케이션하기 위한 모든 요구사항은 High-Level 스크립트 언어가 네이티브 엔진 코드를 호출하는 것이다.  물론 이 자체로도 오버헤드를 가지고 있고, 게임코드에서 이 같은 호출을 줄이는 것은 두번째 우선순위였다.

  1. 씬을 돌아다니는 움직이는 객체는 스크립트 코드가 엔진 코드를 호출하도록 요구하는데, 우리는 게임플레이 코드에서 한 프레임 동안 객체의 변형 요구사항을 캐싱했고, 호출 오버헤드를 줄이기 위해 이 요구사항을 엔진에 딱 한번 보냈다. 우리는 객체의 움직임과 회전이 필요한 곳 외에 다른 유사한 곳에서도 이 패턴을 사용하였다.
  2. 지역적으로, 컴포넌트의 참조를 캐싱하는 것은, 매번 게임 오브젝트의 "GetComponent"를 사용하여 컴포넌트 참조를 가져오는 것을 제거할 수 있다. 이는 위에서 봤던 네이티브 엔진 코드 사용을 줄일 수 있는 또 다른 예이다.
3 – 물리학, 물리학, 물리학 그 이상.

  1. 물리 시뮬레이션 시간간격을 가능한 최소한으로 설정해라. 우리의 경우 16밀리세컨트 이하로 설정하지 않았다.
  2. 캐릭터 컨트롤러의 Move 명령어를 호출하는 것을 줄여라. 캐릭터 컨트롤러를 움직이는 것은 동시에 발생하며, 매 호출마다 상당한 성능 비용을 불러올 수 있다. 우리가 한 것은 매 프레임마다 움직임 요구 사항을 캐시하였고 이를 그들에게 딱 한번 적용했다.
  3. "ControllerColliderHit" 콜백에 의존하지 않게 코드를 수정하라. 이들의 콜백은 매우 빠르게 처리되지 않는다는 것으로 드러났다.
  4. 좋지 않는 장비들을 위해 천 물리를 스킨드 메쉬로 교체하라. 천 파라미터는 성능에 있어서 중요한 역할을 하고, 미학적인 부분과 성능사이의 적절한 균형을 찾기 위해 많은 시간을 지불한다.
  5. 레그돌은 물리 시뮬레이션 루프의 영역이 아니기 때문에 활성화 하지 않았으며, 꼭 필요할 때만 활성화 시켰다.
  6. 트리거의 "OnInside"콜백은 신중하게 평가되어야한다. 그리고 우리의 경우, 가능한 이것을 사용하지 않고 로직을 짜기위해 노력했다.
  7. 태그 대신에 레이어! 레이어와 태그는 객체에 손쉽게 할당될 수 있고, 특정 객체를 질의하는데 사용될 수 있다. 그러나 충돌 로직에 관해서, 레이어는 적어도 성능에 있어서 확실한 장점을 가진다. 더 빠른 물리 계산과 덜 요구되는 새로운 할당 메모리가 근본적인 이유이다.
  8. 메쉬 콜라이더는 절대 해서는 안된다.
  9. 레이캐스트와 구 확인(sphere check)같은 충돌 감지 요구 사항을 최소화 하라. 그리고 각각의 확인(Check)로부터 많은 정보를 얻으려고 해라.
4 – AI 코드를 더 빠르게 만들자!

우리는 메인 닌자 영웅을 저지하고, 그와 싸우는 적에 대한 인공지능을 사용한다. 다음의 주제는 AI 성능 이슈에 관해서 다뤄져야 한다.

  1. A lot of physical queries are generated from AI logic like visibility checks. The AI update loop could be set to something much lower than the graphics update loop to reduce CPU load.
    시야 확인같이, AI 로직으로 부터 많은 물리적인 질의들이 생성된다. CPU Load를 줄이기위해서 AI 업데이트 루프는 그래픽 업데이트 루프보다 훨씬 더 낮게 설정할 수 있다.(?)
5 – 최고의 성능은 전혀 코드로부터 달성되지 않는다!

아무것도 발생하지 않을 때, 성능은 좋다. 이것은 우리가 지금 필요하지 않는 것에 벗어나게하는 기본적인 철학이었다. 우리의 게임은 횡스크롤 액션게임이고, 그래서 많은 동적 객체들은 씬에서 보이지 않을 때 꺼질 수 있다.

  1. 세부 계획된 커스텀 레벨을 사용하여, 멀어질 때 적 AI는 꺼진다.
  2. 움직이는 플래폼과 위험요소 그리고 그들의 물리적인 충돌체는 멀어졌을 때 꺼진다.
  3. 유니티에 내장된 "animation culling" 시스템은 랜더되지 않는 객체의 애니메이션을 끄는데 사용된다.
  4. 같은 비활성화 메커니즘은 모든 단계의 파티클 시스템에 사용된다.
6 – 콜백! 빈 콜백은 어때?

유니티 콜백은 되도록 많이 감소되어야 했다.  심지어 텅 빈 콜백조차 성능에 영향을 줬다. 빈 콜백을 가져야 할 이유는 없다. 하지만 단지 많은 코드 재작성과 리팩토링을 하면서 코드에 빈 콜백들을 남겨두는 경우가 있다.


7 – 도움에 강력한 아티스트.

아티스트들은 언제나 좀 더 프레임 레이트를 올리기 위해 머리를 쥐어짜는 프로그래머를 매혹적으로 도와줄 수 있다.

  1. 유니티에서 게임 오브젝트에 대해 머티리얼을 공유하는 것과 그들을 정적(static)으로 만드는 것은 그들이 함께 배치되도록 하고, 그 결과 감소된 드로우 콜은 모바일 성능에 매우 중요하다.
  2. 텍스쳐 아틀라스는 특별히 UI 요소에 대해 많은 도움을 줬다.
  3. 적절한 압축을 한 정사각형(2의 제곱승)은 필수였다.
  4. 횡 스크롤은 우리 아티스트가 모든 먼 배경 메쉬를 제거할 수 있게 했고, 대신에 그들을 간단한 2D 평면으로 변환했다.
  5. 라이트 맵은 매우 소중하다.
  6. 우리의 아티스트는 여러 경로사이의 추가적인 정점을 제거했다.
  7. 적절한 텍스처 밉 레벨은 다른 해상도를 가진 장비에서 좋은 프레임 레이트를 가지는데 좋은 선택이었다.
  8. 매쉬를 합치는 것은 아티스트가 할 수 있는 또 다른 성능 개선 방법이다.
  9. 우리의 애니메이터들은 가능한 한 각 캐릭터 사이에 애니메이션을 공유할 수 있도록 노력했다.
  10. 파티클에 대한 많은 반복은 미적인 부분과 성능적인 부분의 균형을 찾는 것이 필요했다. emitter의 수를 줄이는 것과 투명도 요구사항을 줄이는 것은 주된 도전중 하나였다. 
8 – 이제, 메모리 사용은 감소 되어야 한다!

많은 메모리를 사용하는 것은 성능에 부정적인 영향을 준다. 우리의 경우에, 메모리 초과로 인해 아이팟에서 많은 충돌을 경험했는데, 이는 매우 중요한 문제 였다. 우리의 게임에서 가장 큰 메모리 고객은 바로 텍스쳐였다.

  1. 다른 텍스처 사이즈는 각 장비에 사용되어졌는데, 특별히 UI에 사용된 텍스처와 큰 배경이 바로 그것이었다. Shadow Blade는 유니버셜 빌드를 사용하지만, 시작하는 순간에 장비 사이즈와 해상도가 감지될 때, 각 애셋들은 로드 된다.
  2. 우리는 사용하지 않는 애셋은 메모리에 올라가지 않도록 해야 했다. 우리는 프로젝트에서, 오직 프리팹 인스턴스에 의해 참조되는 애셋과, 절대 인스턴스되지 않는 애셋들이 완전하게 메모리에 로드되었는지를 확인해야만 했다.
  3. 메쉬로부터 여분의 폴리곤을 제거하는 것은 도움이 되었다.
  4. 우리는 몇몇 애셋의 수명관리를 다시 해야했다. 예를 들어, 메인 메뉴 애셋, 마지막 레벨 에셋, 게임 음악에대한 로드/언로드 시간을 수정해야 했다.
  5. 각 레벨마다 그들의 동적 객체 요구사항에 잘들어맞고, 가장 적은 메모리 사용에 최적화된, 특별한 오브젝트 풀을 가져야 했다. 오브젝트 풀은 유연하고, 개발기간 동안 많은 객체들을 담을 수 있다. 그러나 게임 오브젝트 요구사항이 알려졌을 때, 그들은 구체적이어야 한다.
  6. 메모리에 압축된 사운드 파일을 유지하는 것이 필요했다.
게임 성능 향상은 길고 도전적인 여행이며, 우리는 이 여행의 작은 부분을 경험하는 즐거운 시간을 가졌다. 게임 개발 커뮤니티에 의해 공우된 방대한 지식과 유니티에서 제공되는 매우 훌륭한 프로파일링 툴은 shaodw Blade의 목표 성능에 도달을 하게 해주었다.

여기에 우리의 게임, Shadow Blade의 트레일러가 있다.

http://youtu.be/tgSXLVAwZJs

Game website: shadowblade.deadmage.com



출처 : http://cafe.naver.com/unityhub/2246

반응형
Posted by blueasa
, |
ScriptableObject를 이용해서 Google Spreadsheet의 내용을 ScrptableObject에 serialize하는 방법이 아래에 소개되어 있습니다. 

https://github.com/kimsama/Unity-GoogleData 

새버전 링크 : https://github.com/kimsama/Unity-QuickSheet

엑셀과 유사한 구글의 스프레드시트를 Unity 클라이언트의 ScriptableObject 객체에 바로 연결, 저장하는 방법에 대한 내용입니다. 
 
클라이언트에 필요한 데이터를 엑셀처럼 구글 스프레이드시트에서 관리하고 변경사항이 생길 때마다 바로 Serialize해서 Unity 쪽의 scritableobject 데이터를 업데이트할 수 있습니다. 
 
- ScriptableObject는 바이너리 포맷이므로 다소 크기가 큰 데이터도 빠르게 읽는 것이 가능.
- 구글 스프레드시트를 이용하므로 복잡한 데이터라도 직관적이고 변경이 용이.
- 구글 스프레드시트를 이용하므로 데이터 변경의 이력 관리가 가능. 
- SQL 데이터베이스 사용시 SQL 구문에 대한 학습이 필요하지만 ScriptableObject의 동작 원리에 대한 이해 외에는 별도의 학습이 필요치 않음. 
- 구글 스프레드시트의 기획 데이터가 추가되거나  변경되는 경우에도 큰 어려움 없이 클라이언트 데이터의 업데이트가 가능. 




출처 : http://unitystudy.net/bbs/board.php?bo_table=tip&wr_id=101&page=0&sca=&sfl=&stx=&spt=0&page=0&cwin=#c_103

반응형
Posted by blueasa
, |