Unity Sprite, Performance etc

About Unity Performance … 

Draw calls indicate how many texture draws your gpu has to display.
Alpha Overdraw :

 

Advertisements

OpenGL, iOS 의 대가.. Jeff Lamarche. SceneKit ..

바로가기는 여기   외국사람인데, kr ??  암튼..

씬 킷은 현재까지는 맥앱에만 해당되는 기술인데 되게 좋더라..

개념적으로 뭘 하느냐.

OpenGL 위에, 앱킷 같은 상위 레벨 아래에 위치함. 씬킷 뷰는 완전히 ‘레이어-감지’ 하여 코어 애니메이션으로 애니메이션 가능하다.
뷰 자체가 아니마 가능할 뿐더러, 뷰의 상수를 아니마 할 수 있음.

씬 킷은 주로 ‘scene graph management’ 라이브러리로 알려진 것이다. 이놈은 하나 이상의 3차원객체와 광원, 카메라를 매니지한다. 이 아이템들이 합쳐져서 스크린에 보여진다. 씬킷은 마야, 모도, 블레더 등으로부터 콜라다 형식으로 데이터를 받을 수 있다. 컬라다는 3차원 객체 외에 광원, 카메라, 애니매이션 정보까지 포함한다.

씬킷은 앱킷과 잘 어우러져 NSView 에 이미 있는 힛 테스트를 통해 터치, 마우스 클릭 등의 프로젝션 등을 다룰 수 있다.

씬킷에서 모든 렌더링이 편하게 가능하며 필요할 때는 렌더 딜리깃을 통해 직접 제어가능하다. 편하게 구현 가능하면서 세세한 조정도 가능하다는 얘기.
이것을 보면 얼마나 이 프레임 워크에 공이 들어갔는지 알 수 있다.

결론적으로 씬킷은 어려운 걸 쉽제 해준다. 하지만, 아직 문서도 완전하지 않고….

셋업

Xcode 4.4 or 4.5 ..  산사자 필요…

ARC 를 켜라.

쿼츠코어 추가.

씬뷰 추가

파일 추가..  닙파일… 씬뷰 객체를 윈도우에 드래그..  레이아웃 할 필요 없다…  블라블라.. HTFSceneView 로 명명해라.

헤더에  씬킷.h 추가..  이제 컴파일 가능.

씬 배경 색 지정

간단한 씬 만들기

씬을 코드로 만들어보자.  씬킷에 대한 기본 툴과 용어를 익힐 것이다.

기본은 카메라, 광원, 객체이다. 이것 없이는 별볼일 없다.

빈 SCNScene 객체 생성. 이 객체를 갖으면 씬에 아이템을 추가하기 위해서 “노드”라 불리는 객체를 생성한다. SCNNode 클래스로 대표되는 노드는 다른 종류의 객체를 붙들어 매기 위해 만들어졌다. 위계가 있어 자식, 부모 관계 로 붙일 수 있다.

모든 씬은 ‘루트 노드’ 가 있고 rootNode 로 불리며 씬의 톱 위상의 객체를 붙인다. 노드를 만들고 거기에 카메라, 3차원객체 등을 붙고 그 노드를 루트노드 혹은 그 자식에 붙여서 씬에 객체를 추가한다. 꽤 직관적이지 않은가?

한번 붙이면 리무브 할 때까지 남아있는다.  awakeFromNib 에 코드를 붙이자.

씬 만들기

// Create an empty scene
SCNScene *scene = [SCNScene scene];
self.scene = scene;

카메라 추가.

// Create a camera
SCNCamera *camera = [SCNCamera camera];
camera.xFov = 45; // Degrees, not radians
camera.yFov = 45;
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = camera;
cameraNode.position = SCNVector3Make(0, 0, 30);
[scene.rootNode addChildNode:cameraNode];

카메라에 라디언 대신 ‘도’ 로 표시. 카메라 클래스를 보면 오픈쥐엘 뷰포트와 유사하다는 것을 알 것이다. 우연이 아니고. 씬킷의 ‘카메라’는 GL 뷰포트 … 이 다가 아니다. ?? 카메라가 {0, 0, 30} 에 있으면 카메라의 위치에 따라 렌더하기 전에 씬의 모든 노드는 Z 방향으로 -30 물러날 것이다. 카메라는 회전가능. 씬은 카메라의 시점으로 렌더 된다.

이제 객체. 빌트인 객체를 제공. 실린더, 큐브, 공, 콘, 평면, 튜브, 토러스, 피라미드, 텍스트.. SCNGeometry 에서 상속.  생성한 후 속성 부여, 노드에 할당, 노드를 씬에 추가.. 예제.

// Create a torus
SCNTorus *torus = [SCNTorus torusWithRingRadius:8 pipeRadius:3];
SCNNode *torusNode = [SCNNode nodeWithGeometry:torus];
CATransform3D rot = CATransform3DMakeRotation(MCP_DEGREES_TO_RADIANS(45), 1, 0, 0);
torusNode.transform = rot;
[scene.rootNode addChildNode:torusNode];

Transform3D .. 매트릭스.. GLKMatrix4 와 유사. 위치, 스케일, 회전 등에 대한 정보를 담는다.

다음은 조명. 지금 상태에서 프로그램을 돌리면, 토러스가 그려지지만 완전한 평면 흰색일 것임.

OpenGL from the ground.. 를 상기한다면 3디 그래픽의 기본은 디퓨즈, 앰비언트, 스펙큘러 .. 설명..

스펙큘러 : 밝은 점.. 스팟.. 직광..
앰비언트 광원 : 분명한 소스가 없는 광원.. 여러곳에서 반사된 광원. 세이드 부분.. 어두운 곳..
디퓨즈 : 밝은 부분 ?? 아마도..

씬킷의 라이팅은 더 진보된 것. 씬킷에서 스펙큘러 하이라잇은 광원 세팅보다는 재료 로 부터 온다. 나중에 살펴보자. 하지만 디퓨즈와 앰비언트는 씬에 빛을 추가함으로 얻을수 있다.

씬킷에서 광원은 여러가지 타잎. 앰비언트. 직광.

앰비언트 추가해보자. 일반적으로 하나의 앰비언트 광원. 더 드라마틱한 경우 없을 수도 있음.  앰비언트의 위치와 변위는 상관없음.

// Create ambient light
SCNLight *ambientLight = [SCNLight light];
SCNNode *ambientLightNode = [SCNNode node];
ambientLight.type = SCNLightTypeAmbient;
ambientLight.color = [NSColor colorWithDeviceWhite:0.1 alpha:1.0];
ambientLightNode.light = ambientLight;
[scene.rootNode addChildNode:ambientLightNode];

// Create a diffuse light
SCNLight *diffuseLight = [SCNLight light];
SCNNode *diffuseLightNode = [SCNNode node];
diffuseLight.type = SCNLightTypeOmni;
diffuseLightNode.light = diffuseLight;
diffuseLightNode.position = SCNVector3Make(-30, 30, 50);
[scene.rootNode addChildNode:diffuseLightNode];

 

// Create a torus

안드로이드 구글 플레이어 올리기..

안드로이드는 50메가 제한이 있음..

.. 어떻게 유니티에서 파일을 나눠서 apk 파일을 만들 것인가 ?  ==> 애셋 번들을 만들라.  방법 잘 정리된 블로그 글.

.. 어떻게 나눠진 파일을 올리는가 ?

zip 으로 압축해서 올림.  android\obb\패키지명\main.버전코드.패키지명.obb 이런식으로 된다고?..  파일명은 신경 꺼라.  바로가기

안드로이드 개발자 사이트 번역

APK Expansion Files (확장파일)

구글 플레이는 현재 50메가 이하의 파일을 요구한다. 대부분의 어플에게 이 용량은  코드와 애셋을 합쳐 충분할 것이다. 하지만 고퀄리티 그래픽이나 미디어 파일, 큰 애셋을 갖는 어플은 더 많은 공간을 요구한다. 이전에는 50메가 이상의 경우 사용자가 앱을 오픈할 때  개발자가 추가적인 리소스를 호스팅하고 다운로드를 제공해야 했다.  추가적인 파일을 호스팅하는 것은 비용이 들고 UX 도 이상적이지 않다. 이 과정을 쉽게하기 위해 구글 플레이는 2개의 대용량 파일을 붙일 수 있게 했다.

구글 플레이는 확장파일을 비용 없이 제공한다.  확장파일은 기기의 공유 스토리지 위치 (SD 카드 또는 USB-마운터블 파티션 – 즉 “외장” 공간) 에 저장된다. 대부분의 기기에서 구글 플레이는 확장 파일을 APK 파일 다운로드와 동시에 받아 사용자가 처음 열었을 때 모든 것이 다 준비되도록 한다.  하지만, 어떤 경우에는 어플이 구글 플레이로부터 어플 시작 시 파일을 다운로드 해야 한다.

Overview

구글 플레이 안드로이드 개발 콘솔을 통해서 APK를 올릴 때 마다 하나 또는 두개의 확장파일을 추가하는 옵션이 주어진다. 각 파일은 2기가 까지이며 어떤 포맷이든 허용되나 다운로드 시 bandwidth 를 유지할 수 있는 압축된 파일을 추천한다. 개념적으로 각 확장파일은 다른 역할을 한다.

# ‘main’ 확장파일은 추가적인 리소스에 대한 주된 확장파일이다.

# ‘patch’ 확장파일은 메인 파일에 대한 부가적인 파일로 작은 업데이트 용도의 파일이다.

두 확장 파일을 어떤 방법으로든 쓸 수 있지만, 메인 파일이 중요한 애셋을 포함하고 업데이트는 가끔 하도록 권장한다. 패치 파일은 더 작고 패치를 위한 파일..

하지만, 어플이 새 패치 파일만을 업데이트 했더라도, 개발자는 매니패스트 의 versionCode 를 업데이트 해서 새로운 APK 를 올려야 한다.

\/\/ Note : 패치 확장파일은 실질적으론 메인 확장 파일과 동일함. 어떻게 사용해도 무방. 시스템은 앱의 패칭을 위해 패치 확장파일을 사용하지 않음. 패치는 스스로 해야 함.

File name format

각 확장 파일은 zip, pdf, mp4 등 어떤 포맷도 가능하다. 파일 타입에 관계 없이 구글 플레이는 opaque binary blobs 로 간주하고 다음과 같은 기준으로 리네임한다.

[main|patch].<expansion-version>.<package-name>.obb

세가지 콤포넌트.

main  or  patch
파일이 메인인지 패치인지 구별. 각 APK 에 하나의 메인과 하나의 패치만 가능.

<expansion-version>
확장이 ‘첫번째’ 참조되는 정수의 버전 코드  . (어플의 android:versionCode 값과 일치)
‘첫번째’ 는 개발자 콘솔이 업로드된 확장 파일을 재사용하는 것(새로운 APK 파일과 함께)을 허용하기 때문에 강조되었음.  이것은 처음 파일을 올렸을 때의 버전을 유지한다.

<package-name>
어플의 자바-스타일 패키지 이름.

예>   main.314159.com.example.app.obb  이렇게 됨.

Storage location

구글 플레이가 확장파일을 다운로드 할 때, 시스템의 공유 공간에 저장한다. 제대로 작동되기 위해서 파일을 지우거나, 옮기거나, 이름을 바꾸지 말것. 어플이 구글 플레이에서 다운로드 해야 할 때, 사용자는 바로 같은 곳에 저장해야 한다.

정해진 위치는 다음과 같다.

<shared-storage>/Android/obb/<package-name>/

# <shared-storage> 는 공유 공간이며 getExternalStorageDirectory() 로 받는다.

# <package-name>  은 getPackageName() 으로 얻음.

각 어플에는 메인/패치 파일이 가능. 이전 버전은 새로운 확장 파일로 업데이트하면 overwrite 됨.

파일을 언-팩 해야하면 .obb 파일을 지우지 말고 같은 디렉토리에 풀린 데이터를 저장하지 말라.  압축 해제된 파일은 getExternalFilesDir() 에 지정된 곳에 저장해야 한다. 하지만, 가능하면 해제 과정 없이 확장 파일을 바로 사용하는 것이 제일 좋다. 예를 들면 집 파일을 바로 읽는 라이브러리 같은 경우..

/\/\ Note : APK 파일과는 다르게 어떤 파일이라도 저장 가능하다.

/\/\ Tip : 미디어 파일을 집 압축 한다면 미디어 플레이백 콜을 오프셋, 길이 조절로 부를 수 있다. (MediaPlayer.setDataSource() &  SoundPool.load() ) 압축 해재 없이. 이 과정을 통해 부가적인 압축을 하지 않아도 된다. 예를 들어 집 툴을 쓸 때 -n 옵션을 써서 압축을 안 할 수 있다.

Download process

대부분의 경우 확장 파일은 APK 파일과 함께 다운로드, 저장 된다. 하지만, 어떤 경우에은 구글 플레이는 확장 파일을 다운로드 하지 못하거나 사용자가 이전에 내려받은 파일을 지울 수 있다. 이러한 경우에 대비하여 어플은 파일 자체를 다운로드할 수 있어야 한다.  구글 플레이가 제공하는 URL 을 통해서.

다운로드 프로세스

1. 사용자가 구글 플레이에서 앱 선택.
2. 구글 플레이가 확장파일을 다운로드 할 수 있으면 (대부분의 경우) APK 와 함께 파일 다운로드. 확장 파일을 다운로드 할 수 없을 때는 APK 만 한다.
3. 사용자가 앱을 런칭할 때, 앱은 확장 파일이 있는 지 확인해야 함.  있으면 레디 투 고. 없으면 구글 플레이의 HTTP 에서 다운로드 해야 함. 앱은 구글 플레이 클라이언트에 Application Licensing 서비스를 이용하여 요청해야 한다. 이것은 이름, 파일 크기, URL 에 대응함. 이 정보로 파일을 다운로드 하고 정당한 위치에 저장한다.

주의 : 파일 다운로드 코드를 포함하는 것이 중요하다. 라이브러리 제공했으니 최소의 작업량으로 가능할 것.

Development checklist

내용 요약

1. 50메가 이상이 필요한 지 판단. 가능한 한 작게.. 여러 기기를 위해서라면 복수의 APK  를 고려하라.
2. 메인 확장 파일로 뭘 뺄 지 결정.
3. 기기의 ‘공유 저장 위치’ 로부터 읽어 들이도록 개발. 파일 포맷이 무관하면 ‘집’ 해서 APK Expansion Zip Library 를 이용하도록.
4. 초기에 확장 파일 유무 검사. 없으면 다운로드 받도록. Downloader Library  를 사용하면 간단하다.
테스팅.

Rules and Limitations