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

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
05-03 00:02

[파일]

Dvornik-Unity-Distortion.zip



Unity 3D Anoxemia Heat Distort Tutorial



Hello. It is a part of Anoxemia tutorials. Here I want to share some experience of creating 2D game with Unity

What we going to do here:



DOWNLOAD:
https://dl.dropboxusercontent.com/u/106482752/Dvornik-Unity-Distortion.zip

Root tutorial: http://kostiantyn-dvornik.blogspot.com/2014/07/anoxemia-unity-2d-tutorial.html


If you ever want to create cool effects like hot air waving or thick glass refraction or some underwater streams you will came to Detonator package and HeatDistort shader.But as for me it looks very complicated, so write my own and use it well with latest Unity 2D system.

NOTE: it works only with Unity Pro and Deffered lighting on. It works the same way how Detonator'a works. It tooks image and project it correctly on a plane with texture distortion.

We will split tutorial into 2 steps.
1.Explain shader
2. How to use it.

1.
Lets take a look at the shader:

Shader "Dvornik/Distort" {
Properties {
_Refraction ("Refraction", Range (0.00, 100.0)) = 1.0
_DistortTex ("Base (RGB)", 2D) = "white" {}
}

SubShader {

Tags { "RenderType"="Transparent" "Queue"="Overlay" }
LOD 100

GrabPass
{

}

CGPROGRAM
#pragma surface surf NoLighting
#pragma vertex vert

fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten){
        fixed4 c;
        c.rgb = s.Albedo;
        c.a = s.Alpha;
        return c;
  }

sampler2D _GrabTexture : register(s0);
sampler2D _DistortTex : register(s2);
float _Refraction;

float4 _GrabTexture_TexelSize;

struct Input {
float2 uv_DistortTex;
float3 color;
float3 worldRefl;
float4 screenPos;
INTERNAL_DATA
};

void vert (inout appdata_full v, out Input o) {
  UNITY_INITIALIZE_OUTPUT(Input,o);
  o.color = v.color;
}

void surf (Input IN, inout SurfaceOutput o) {

    float3 distort = tex2D(_DistortTex, IN.uv_DistortTex) * float3(IN.color.r,IN.color.g,IN.color.b );
    float2 offset = distort * _Refraction * _GrabTexture_TexelSize.xy;
    IN.screenPos.xy = offset * IN.screenPos.z + IN.screenPos.xy;
    float4 refrColor = tex2Dproj(_GrabTexture, IN.screenPos);
    o.Alpha = refrColor.a;
    o.Emission = refrColor.rgb;
}
ENDCG
}
}

We have just 2 properties. It is

_Refraction -amount of distortion
_DistortText - texture according to what we gonna distort our environment. You can use any colored texture. To make distortion. But in fact only Red and Green channels are working as distortion vector.

Tags { "RenderType"="Transparent" "Queue"="Overlay" } - We set Queue to Overlay because we want to render this effect after everything.

#pragma surface surf NoLighting
#pragma vertex vert

We used custom NoLigthing model and custom vertex shader to have deal with vertex color that used in particle system. There is a little chunk, cuz we write only Emission to have absolutely No Lighting shader.

 float3 distort = tex2D(_DistortTex, IN.uv_DistortTex) * float3(IN.color.r,IN.color.g,IN.color.b );
 float2 offset = distort * _Refraction * _GrabTexture_TexelSize.xy;
 IN.screenPos.xy = offset * IN.screenPos.z + IN.screenPos.xy;
 float4 refrColor = tex2Dproj(_GrabTexture, IN.screenPos);

Here we read distort texture, calculate offset of the screen and project on the model correctly. That's it.

2. 
Create a simple material and apply that shader. Next if you use particle system apply particle render order script to that. Other way some object will be rendered after distortion so it will looks weird. You can use particle Color or Color Over LifeTime to make distortion more/less. I often setup it thats way:

to make distortion fade in and fade out. Thats probabbly all that you need to know about.

Know bugs:
1.

How to resolve:
Add particle order script to PS and set order to  bigger then foreground sprite.
Effect is not working with orthographic camera

2. To much distortion on large distance to camera

How to resolve: add script that decreasing material property distortion with distance to camera.




[출처] http://kostiantyn-dvornik.blogspot.kr/2014/10/unity-3d-anoxemia-heat-distort-tutorial.html

반응형
Posted by blueasa
, |

[출처]

http://geekcoders.tistory.com/entry/Unity-%EC%9C%A0%EB%8B%88%ED%8B%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EA%B0%80-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EC%BD%94%EB%93%9C%EC%9E%91%EC%84%B1%EB%B2%95



댓글에 개인적인 문의가 작성되면 삭제하고 있습니다.
개인적인 문의는 페이스북이나 메일로 부탁드립니다.

email : master@geekdev-korea.com

출처표기는 삭제하지 말아주세요.

- 령호 -


계속 업데이트 됩니다.

마지막업데이트 15.05.29
- String병합 내용 제거 - 


하나하나 내용에 대해서 깊고 자세하게 작성할 수 없습니다.
자세한 내용에 대해서는 직접 검색해보시길 권합니다.


개인블로그에서 그룹블로그로 전환하면서 많은 글들을 삭제했습니다.
천천히 다시 정리합니다. 테스트는 모바일 기준입니다.

유니티 버전은 4.6.1 기준으로 테스트됩니다.



1. Loop


C# 자료구조에는 여러가지 루프문이 제공된다.
for, foreach, enumerator
어느 루프문을 사용해야 할까?
보통 본인에게 편한 루프문을 택한다.
하지만 성능이 다르다면?


- 테스트과정
각각루프를 도는 스크립트를 만들고, 하나의 스크립트에서 컴포넌트로 통합한다.
모바일로 빌드, 프로파일러를 확인한다.

테스트모바일은 갤럭시 노트3다.


-- 소스코드 --






-- 결과 --



- 정리 

Foreach는 속도도 가장 느리고, GC도 24Byte를 남겼다.

Enumerator는 Foreach보다 빠르게 동작했으며,

For는 Enumerator의 2배나 빠르게 동작한다.


가끔 프로파일러의 변동이 있을 때도 있지만 평균적으론 위 성능을 보인다.



- 추가

Dictionary<int, string>


-- 소스코드 --




--  결과 --



foreach

enumerator



이 부분을 보이는게 더 명확할듯 하다.

foreach문의 경우 그래프가 깨지는 구간이 더 많이 존재 한다. (프레임이 끊길 수 있다)

enumerator는 foreach에 비해 안정적이다.



- 결론

For문으로 루프문을 작성하지 못할 경우, enumerator

For문으로 루프문을 작성할 수 있을 경우, for






2. Parse


C#에서 지원하는 Parse는 여러가지가 존재한다.

그 중에서 가장 많이 사용하는 자료형은 string을 다른자료형으로 변환하거나 그 반대로 다른자료형을 string으로 변환하는 일이 잦다.

이번 테스트는 변환방법에 따른 성능을 테스트해본다.

string은 특수한 자료형이지만

그 외 기본자료형들은 비슷한 속도를 낼 거라고 생각한다.



- 테스트과정

string -> int, int -> string 각각루프를 도는 스크립트를 만들고, 하나의 스크립트에서 컴포넌트로 통합한다.
모바일로 빌드, 프로파일러를 확인한다.

테스트모바일은 갤럭시 노트3다.

(루프 10만번 돌렸다가 폰이 죽었다...)




-- 소스코드 --







-- 결과 --




- 정리

int -> string은 사실 이 결과를 믿을 수 없다.

최대한 평균값을 뽑으려고 노력했으나 그냥 뒤죽박죽이다.

코드로 평균값을 뽑아도 오르락 내리락한다.

그냥 입맛에 따라 쓰면 될 것 같다.


string -> int는 의외의 결과다.

tryParse가 눈에 띄게 느리지 않다.

코드로 평균값을 뽑아보면 1000회당 0.01ms정도 느리다.

안전한 코드를 위해 tryParse를 쓰는게 좋을 듯 하다.



- 결론

int -> string은 작성자의 입맛에 따라, string -> int는 tryParse를 사용한다.







3. callback


c#은 간단한 방법의 callback을 제공한다.

그 중에 System.Action, System.Func<T>를 성능 테스트를 해본다.



- 테스트과정

System.Action을 인자로 받는 함수는 두가지 케이스로 나눈다.

인자가 null이면 실행하지 않는 함수

인자를 빈 delegate로 채우는 함수


System.Func는 그냥 콜하고 처리시간 정도만 알아본다.


모바일로 빌드, 프로파일러를 확인한다.
테스트모바일은 갤럭시 노트3다.


-- 소스코드 --





-- 결과




- 정리

UseDelegateEmpty와 UseFunction은 순서가 자주 뒤바뀐다.

평균적으로 비슷한 속도를 뽑아낸다.

null 체크의 경우 약 3배 빠르다.




- 결론

빈 delegate를 작성하지 말자.

소스코드의 안정성과 속도를 위해 callback을 받는 부분에선 무조건 null체크를 하고, null을 인자로 작성한다.







4. transform caching


우리는 유니티에서 transform에 접근 하는 경우가 잦다.

하지만 transform에 접근하는 게 성능에 부담된다는 사실은 잘 모른다.

그리고, 이 성능의 부담은 caching으로 해결 할 수 있다.



- 테스트 과정

루프를 돌며 this.transform.localPosition을 가져오는 두개의 스크립트 작성

하나의 스크립트는 transform을 재정의한다.


모바일로 빌드, 프로파일러를 확인한다.
테스트모바일은 갤럭시 노트3다.


-- 소스코드 --






-- 결과 --





- 정리

이 전에 정리된 사례들을 보면 어느정도 부담되는 지 감이 온다.

caching된 transform이 non-caching trnasform보다 2배정도 빠르다.




- 결론

transform에 자주 접근하게 되는 객체에선 caching은 선택이 아닌 필수다.





5. string compare


개발하다보면 유니티 뿐만 아니라 많은 어플리케이션에서 string을 비교할 일이 많다.

string을 비교하는 방법은 여러가지가 존재한다.

string 비교 방법이 많은 건 이유가 있으니, 찾아보길 권장한다.

현재 테스트는 길이가 1000~1999까지의 문자열을 비교한다.

테스트 조건을 명확히 알아야한다. 무조건 이게 빠르다. 라고 가정해버리면 안된다.

문자열의 성능은 여러가지 변수에 의해 좌우될 수 있다. 사실 이 이유로 인해 문자열 비교는 포스팅하지 않으려 했다.

모든 문자열이 길이가 4이고 비교했을때 이 방법이 가장 빨랐구나. 정도로 이해하면 된다.

조건에 대해서는 계속 명시한다.



- 테스트 과정

루프를 돌며 문자열을 비교하는 다섯가지의 스크립트 작성

1. string.Compare

2. string.CompareTo

3. Equals

4. Operator

5. Hash Operator


모바일로 빌드, 프로파일러를 확인한다.
테스트모바일은 갤럭시 노트3다.


-- 소스코드 --









-- 결과 -- 





- 정리

위와 같은 조건일 때, 빠른 속도로 나열하자면

Operator, HashOperator, Equals, CompareTo, Compare

순이 된다.




- 결론

여러가지 경험을 비추어 봤을 때 문자열을 연산자 이용해서 비교하는 건 사실 권장하지 않는다.

bool string.Equals(string a, string b) 함수를 사용한다.






6. Debug.Log


개발하면서 많은 Debug.Log, Debug.LogWarning, Debug.LogError로 로그들을 남기면서 개발 했을거라고 예상된다.

프로파일링을 할때마다 Debug.Log가 눈에 거슬렸고, 그에 대한 성능 측정 결과 엄청난 비용을 차지하고 있었다.

그에 따른 이유는 검색으로 많은 이유들을 찾아 볼 수 있다.

내가 진행하던 프로젝트에서 Debug. 으로 검색하니 결과는 약 3천개

빌드전에 모든 로그들을 검색해서 지우기엔 시간이 오래걸릴 수 있다.

개발기간 1년, 2년간 쌓인 로그들 한번에 정리해보자.

그리고, 로그를 정리된 성능과 정리되지 않은 성능을 비교한다.



- 로그정리 구현과정

참조 : https://gist.github.com/kimsama/4123043


위 깃허브에 접속해보면 소스코드가 있다. 해당 소스코드를 수정해서 사용한다.

약 2년 전에 처음으로 깃허브에서 이 소스코드를 찾았다.

그 후, 깃허브에 올라오는 유니티 프로젝트에서 이 코드가 간간히 보이기 시작했다.

아직 로그를 그대로 노출시키는 프로젝트도 많다.


기존 소스코드는 유니티 에디터면 로그를 출력하고, 빌드버전에선 로그를 출력하지 않는다.

하지만 난 문제점 확인과 잘 돌아가는지 확인을 위해 로그를 출력하기 원하면 빌드버전에서도 보고 싶다.

그럼 소스코드를 편하게 사용할 수 있도록 수정해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#if UNITY_EDITOR
#define ENABLE_LOG
#endif
 
using UnityEngine;
 
/// 
/// It overrides UnityEngine.Debug to mute debug messages completely on a platform-specific basis.
/// 
/// Putting this inside of 'Plugins' foloder is ok.
/// 
/// Important:
///     Other preprocessor directives than 'UNITY_EDITOR' does not correctly work.
/// 
/// Note:
///     [Conditional] attribute indicates to compilers that a method call or attribute should be 
///     ignored unless a specified conditional compilation symbol is defined.
/// 
/// See Also: 
///     http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx
/// 
/// 2012.11. @kimsama
/// 
public static class Debug
{
    public static bool isDebugBuild
    {
        get { return UnityEngine.Debug.isDebugBuild; }
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void Log(object message)
    {
        UnityEngine.Debug.Log(message);
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void Log(object message, UnityEngine.Object context)
    {
        UnityEngine.Debug.Log(message, context);
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void LogError(object message)
    {
        UnityEngine.Debug.LogError(message);
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void LogError(object message, UnityEngine.Object context)
    {
        UnityEngine.Debug.LogError(message, context);
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void LogWarning(object message)
    {
        UnityEngine.Debug.LogWarning(message.ToString());
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void LogWarning(object message, UnityEngine.Object context)
    {
        UnityEngine.Debug.LogWarning(message.ToString(), context);
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void DrawLine(Vector3 start, Vector3 end, Color color = default(Color), float duration = 0.0f, bool depthTest = true)
    {
        UnityEngine.Debug.DrawLine(start, end, color, duration, depthTest);
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void DrawRay(Vector3 start, Vector3 dir, Color color = default(Color), float duration = 0.0f, bool depthTest = true)
    {
        UnityEngine.Debug.DrawRay(start, dir, color, duration, depthTest);
    }
 
    [System.Diagnostics.Conditional("ENABLE_LOG")]
    public static void Assert(bool condition)
    {
        if (!condition) throw new System.Exception();
    }
}
cs


이렇게.


유니티에디터에선 무조건 로그를 출력한다.

빌드시에는 ENABLE_LOG를 정의했을 경우에 출력한다.


빌드세팅에서 Player Settings -> Other Settings -> Scripting Define Symbols 에 정의하면 된다.






- 테스트 과정

루프를 돌며 100번의 로그를 찍는 스크립트 작성

1. 로그를 출력하지 않는 빌드 프로그램으로 프로파일링 한다.

2. 로그를 출력하는 빌드 프로그램으로 프로파일링 한다.


테스트모바일은 갤럭시 노트3다.



-- 소스코드 --






-- 결과 --


(로그 출력O)



(로그 출력X)






- 정리

로그는 여러면에서 엄청난 비용을 차지한다.

GC, time ms...



- 결론

왠만한 소스코드들은 따라가지 못할 성능을 잡아먹는다.

아무리 소스코드를 최적화 신경써서 작성했다고 하더라도 로그를 많이 찍을 경우 다 무용지물일 것 이다.


그리고 다른 얘기를 해볼까 한다.

현재 마켓에서 다운받을 수 있는 프로젝트들도 몇몇개도 로그를 노출시키고 있다.

중요해 보이는 로그도 찍히는 경우가 있다.


보안상  노출시키지 않아야 하고,

프로그램 성능상 출력하지 말아야 한다.


배포되는 빌드에선 필수로 막아야한다. 


로그를 삭제 시키는 일은 선택이 아닌 필수다.



반응형
Posted by blueasa
, |


※ 본 문서는 NDC 2015 띵소프트의 이득규님의 강연을 바탕으로 정리한 문서입니다.


삼국지조조전 Online의 unity3D 아트 리소스 최적화 기법들 : 링크

Unity 성능개션옵션(출처불명인데 엄청 좋은내용) : 링크 

게임 개발 포에버 : http://www.gamedevforever.com/333 / http://www.gamedevforever.com/332


1. 외국 시장의 용량과 메모리 문제


- WIFI가 원활하게 사용 가능한 나라는 생각보다 많지 않다. 게임의 용량이 진입장벽이 될 수 있다.

- 일부 중국 퍼블리셔는 200MB 초과게임은 심사거부

- 저가 안드로이드 폰의 저장용량 160MB~4GB에 불과함. (2015년 기준 안드로이드 ONE)

- 실제 가용 메모리는 256MB~400MB 정도라고 보면 된다.


결론 : 중국시장을 노린다면 200MB이내, 메모리 400MB 이내로 해결하자.



2. 최적화 요소 점검


- 유니티로 빌드할때 생성된 로그파일에서 용량별 퍼센트를 볼 수 있다. (콘솔 화면에서 open Editor Log)

- 용량이 큰 파일부터 최적화요소를 점검하자



3. 폴더 필더링


- 유니티는 Assets 폴더 내의 폴더명으로 빌드에 반드시 포함할 것을 구분한다. 폴더의 네이밍이 특히 중요하다.


폴더명

 기능

 Resources

 - 여기에 들어있는 파일은 사용 여부와 무관하게 모두 빌드에 포함된다.

 Assets\

 Editor Default Resources

 - Resources와 유사하지만, 에디터에서만 접근 가능.

 - 편집엔 필요해도 빌드에 불필요한 아틀라스 원본텍스쳐나 에디터 리소스를 보관

 Gizmos

 - Gizmos.DrawIcon을 위한 아이콘과 텍스쳐 모음 폴더. 에디터 전용 폴더로 빌드 제외.

 .으로 시작하는 폴더

 - .으로 시작하는 폴더는 무시

 Editor

 - Unity Editor Scription API만 접근할 수 있는 폴더. 

 - UnityEditor 네임 스페이스를 사용하는 스크립트는 이 폴더에 있어야 함.

 - 빌드에 포함되지 않고 에디터 상에서만 동작

 - 동명의 폴더가 여기저기 있어도 모두 동일하게 동작

 Standard Assets

 - 이 폴더 하위의 스크립트는 최우선 컴파일 

 Plugins

 - Native 플러그인은 이 폴더에 있어야 함

 - 이 폴더의 파일은 모두 빌드에 포함

 - 이 폴더 내의 스크립트는 먼저 컴파일




4. 텍스쳐 최적화


[ size ]

- 모바일에서 최대 사이즈는 4K를 지원하지만, 저가 안드로이드는 2K 까지 지원한다. 언제나 2K를 유지하자!

- 축소 시 원본 훼손이 안되도록 항상 2배 수로 축소

- 소스 자체는 언제나 크게만들고 유니티 자체로 크기를 축소하면 된다! 이 방법이면 고사양 버전 제작시 재작업 불필요


[ Alpha ]

- 알파를 쓰느니 폴리곤 갯수를 늘리는게 훨씬 좋다.

- ETC1 등을 사용할 경우 아티펙트로 경계 노이즈가 발생


[ Atlas ] 

- 호출 빈도 등에 따라서 쓸모없는 메모리를 들고 있어야 하는 경우가 있다.


#. 유니티 Quality Setting에서 메모리상 텍스쳐 해상도를 전체 1/2로 하는 기능도 있다. 이를 기기 성능에 맞춰서 원활한 플레이를 하는 방법!



5. 소스 최적화


[ POT ]

- 가능한 모든 텍스쳐를 POT 규격으로 제작. POT가 불가능한 리소스는 텍스쳐 아틀라스로 패킹.

- NPOT 리소스는 압축 텍스쳐가 불가능하다 = 용량 증가


[ Alpha ]

- ETC1은 alpha가 없는 텍스쳐 포멧이다. 알파가 존재할경우 유니티는 RGBA16으로 변환한다.

- ETC1을 두 장 사용해서 alpha문제를 해결 (로딩빠르고, 용량적고, 메모리도 적게먹는다!)

- 하지만 쉐이더/로딩 코드를 수정해야 된다. 드로우 콜 증가. (직접 쉐이더 코드를 수정하지 못하면 사용 못함!)



6. 텍스쳐 포멧(유형)


[ 어떤 포멧으로 import 할까? ]

- 유니티 엔진은 어떤 텍스쳐라도 넣을 수 있고, 어떤 텍스쳐포멧을 넣던 유니티에서 한번 더 변환한다.

- PNG 압축사이트에서 압축해서 쓰세요! 이러는건 PNG를 유니티 변환하지않고 우회해서 사용할 때의 얘기다.

- 어차피 압축을 다시 하기때문에 무조건 가장 품질 좋은 것을 넣으면 된다! (프로젝트파일 용량걱정만 없다면!)


[ Format 설정 ]

- Format 쪽에 가보면 Compressed, 16 bits, Truecolor 3가지가 있다. 이 외의 것을 하면 안돌아가는 기기가 있다!

- 만약 사용자 앱이지원되지않는 텍스쳐압축을 사용할 경우 그 텍스쳐는 RGBA32무압축(엄청난용량!)으로 메모리손실


설정 값 

설명 

 Compressed 

 기본 설정 값. 압축효과 가성비 높음. 알파가 있을 때는 차라리 알파없는 텍스쳐 한장을 더 쓴다.

 16Bit

 압축하지 않고 색상만 줄어든다. TA가 없다면 사용하지 말 것.

 TrueColor

 압축을 전혀 하지않음. UI에만 사용해야한다. 알파가 있다면 어쩔 수 없는 선택.


[ 세부 Format 설정]

- 알파 필요없는데 PNG등으로 들여오면 RGBA로 임포트가 되버린다.

- 아 물론 알파채널을 스펙큘러등으로 쓰는경우 (Toony Pro의 스펙큘러 등)은 그냥 RGBA로 써야된다!

- Texture가 아니라 Advanced를 선택하면 세부 설정을 지정할 수 있다.


종류

 사용해야하는 포멧

 POT전용 - 직사각형O 

 RGB Compressed ETC 4 bits

 POT전용 - 직사각형O

 RGB Compressed PVRTC 2 bits 

 RGBA Compressed PVRTC 2 bits 

 RGB Compressed PVRTC 4 bits 

 RGBA Compressed PVRTC 4 bits 

 NPOT

 RGB 16 bit

 RGB 24 bit

 RGBA 16 bit

 RGBA 32 bit 



   

- Texture가 아니라 Advanced로 선택한 뒤, RGB Compressed ETC 4 bits를 선택하자. ( 무려 2배차이 ! )

- Quality는 100으로 하면 약간의 딜레이가 발생하지만 더 품질이 손상없어짐!


[ 결론 ]

- 알파가 없다면 일단 Compressed를 사용하자!

- 알파가 존재하는 UI라면 TrueColor를, 그 외의 것이라면 차라리 알파 없는 것을 하나 더 써서 마스킹을 하시길.



7. UGUI 최적화


[ Draw Call ]

- 유니티 UI의 드로우 콜은 캔버스 단위로 이루어진다. 

- 하나의 캔버스 하위에 쓰이는 이미지들이 Sprite Packing이 되어있다면, 모두 하나의 드로우콜로 처리가 가능하다.

- 동적으로 반응하는 버튼이나 Fill Image를 처리할 때 매번 갱신비용이 발생하기 때문에, UI요소들을 하나의 Canvas에 몰아넣는 것만이 좋은 것이 아니다.


[ Text ]

- 텍스트는 Font 종류당 하나씩 드로우 콜이 발생한다.




8. FBX 최적화


[ Model ]


       


- Mesh Compression은 기본적으로 꺼져있는 상태지만, 모양이 뭉개지지 않는 범위내에서 최대값을 선택한다.

  (왼쪽이 OFF, 오른쪽이 High 상태인데... 사실 뭔가 인지못할정도로! 바뀐다)

- Materials의 Import Material은 체크해제한다.


[ Animations ]

- 애니메이션이 포함되어 있지 않다면 체크해제한다.




9. 사운드 최적화


- 사운드는 디폴드 값으로 3D 스테레오 사운드로 설정되는데, 사실 모바일 게임에서는 스테레오는 의미없음.

- Force to Mono를 체크함

- Load Type은 메모리에 영향을 주는데 사운드 유형에 따라서 설정한다.


 유형

사용처 

 Decompress on load

 짧은 효과음

 Compressed in memory

 성우 대사 정도의 음성 

 Stream

 계속 플레이되는 긴 배경음악 






[출처] http://mentum.tistory.com/55

반응형
Posted by blueasa
, |

OS : Win7 x64

Version : Unity5 5.4.0


[에러메시지]

OdbcException: ERROR [IM002] [Microsoft][ODBC 드라이버 관리자] 데이터 원본 이름이 없고 기본 드라이버를 지정하지 않았습니다.


유니티4에서 잘 사용하던 odbc가 유니티5에서 실행하니 위와 같은 에러를 뱉어서 확인해보니 64bit용 재배포 패키지를 깔라고 한다.


[재배포 패키지 다운로드]

https://www.microsoft.com/ko-KR/download/details.aspx?id=13255

(링크에서 64bit용 재배포 패키지를 깔아 주면 된다.)


[참조]

I had the same issue and this Q&A was very helpful to narrow down my problem.
On a Windows 7 64 bit machine with Unity 64 bit, the Unity's Mono System.Data.Odbc class relies on the odbc32.dll that is located in Windows\System32 and not the one in Windows\SysWOW64. I found out the driver wasn't listed in the odbcad32.exe administration tool located in Windows\System32.
Installing the 64 bit version of Microsoft Access Database Engine 2010 Redistributable solved my issues as I now have the correct 64 bit driver listed in the odbcad32.exe application.
The drivers can be downloaded from here: https://www.microsoft.com/en-us/download/details.aspx?id=13255
The driver name in all the connection strings in the code must be updated with the new driver's name (that can be seen with the odbc administration tool).
I am now using Unity 5.3 64 bit and connecting successfully to the data source, in my case a dbf file.
I am sure this doesn't cover all the error IM002 cases but if you have this issue, this is one thing you want to exclude anyway.



[참조출처]

http://forum.unity3d.com/threads/odbc-connections-impossible-with-unity5.342846/

반응형
Posted by blueasa
, |


[링크] http://gusrealworld.tistory.com/239

반응형
Posted by blueasa
, |



[링크] https://www.assetstore.unity3d.com/kr/#!/content/35295



Unity's audio system is powerful, but on Android that power sometimes comes at a cost: latency! If you're finding a delay between when you expect a sound and when you hear it, Android Native Audio (ANA) can help.

반응형

'Unity3D > Plugins' 카테고리의 다른 글

[펌] Excel 읽기 (unity XLS importer maker)  (0) 2016.11.03
[Link] Simple Disk Utils  (0) 2016.09.19
[링크] Low-latency_Sound_for_UnityAndroid  (0) 2016.08.18
[펌] TexturePacker  (0) 2016.05.10
[펌] GPGS  (1) 2016.03.08
Posted by blueasa
, |





Low-latency_Sound_for_UnityAndroid

Unity5アプリ上で低遅延な音を再生するAndroid向けアセットです。

以下のフォーラムの内容をベースにして作成されています。
http://forum.unity3d.com/threads/android-sound-latency-fix.319943/

使い方についてはこちら。
http://tsubakit1.hateblo.jp/entry/2015/05/19/011835

반응형

'Unity3D > Plugins' 카테고리의 다른 글

[Link] Simple Disk Utils  (0) 2016.09.19
[링크] [유료] Android Native Audio(Android Latency 관련)  (0) 2016.08.18
[펌] TexturePacker  (0) 2016.05.10
[펌] GPGS  (1) 2016.03.08
[펌] AWS Cognito + Unity3d  (0) 2016.02.14
Posted by blueasa
, |

일반적으로 랜선이라고 하면 그냥 단순하게 한종류만 있는 줄 알고 계실텐데, 실제로는 몇가지 골라야 하는 사항이 있습니다.

아래 각 항목분야에 대해서 알아보겠습니다.

 

1. 카테고리(CAT)

2. 단선과 연선

3. UTP/STP/FTP 케이블

 

[ 랜선의 종류 - 1. 카테고리 ]

q1
카테고리, CAT., Category 라는 구분법은 간단히 말하면 대역폭(최고 주파수와 최저 주파수의 차이)으로 UTP 케이블의 성능을 구분한 구분법입니다.

대역폭에 따라 전송 속도 차이가 나서 같은 시간동안 전송하는 데이터 량이 많고 적음의 차이로 나타나며

일반 가정에는 100Mbps의 회선이 들어가기 때문에 전송속도 1Gbps 이상(CAT.5E 이상)을 지원하는 랜선을 사용하시면 최대 속도만큼 이용할 수 있습니다.

그래서 높은 카테고리의 케이블은 가정이나 공장, 사무실등의 내부 네트워크(내부 컴퓨터간의 연결)를 구축할 때 많이 사용되고 있습니다.

기가비트를 지원하는 랜선을 사용한다 하더라도 랜카드, 허브 등의 관련 장비가 기가비트를 지원하지 않으면 기가비트 속도를 사용할 수 없습니다. (당연히 구성장치 중 최저 성능을 발휘하는 장치에 속도가 고정됩니다.)

 

 

>>랜선피복에 자세히 보면 쓰여 있습니다.
q2
일반적으로 많이 쓰이는 것은 CAT.5E 이고요, 일부 CAT6를 사용하기도 합니다.

CAT.5E가 1Gbps를 지원하고 가정에는 100Mbps 회선이 들어가니까 이 정도 랜선이면 거의 최대속도를 사용할 수 있습니다.
TIP : 요즘(2016년)은 기가 인터넷이라고 가정/사무실에도 1Gbps 망이 들어가기도 합니다.

 

저는 서버 작업을 할 때 40MB/s ~ 80MB/s 의 속도가 나오면 1Gbps 의 라인이 연결되었고 문제가 없다고 가정합니다. (1GB 다운로드에 12초 ~ 24초 소요)

svc_speed_16.04.12

< 16/04/12 속도측정 예제. 노란색은 inbound traffic, 빨간색은 outbound traffic 을 나타냅니다 >

실제 인터넷 속도는 하드디스크의 속도에 고정이 됩니다. (SSD 파일복사 인 경우 최대 200MB/s, SATA 인 경우 최대 120MB/s 정도 됩니다.)

 

서버작업을 할때 이 이상의 속도를 원할 때는 FC케이블 (Fiber Channel Cable) 이라는 광케이블을 사용합니다.
q3

[ 랜선의 종류 - 2. 단선과 연선의 차이 ]

q4
랜선 안에 있는 심선의 단선과 연선의 차이점도 짚고 넘어가겠습니다.
q5
UTP 케이블(랜선) 속의 심선(구리선)이 한 가닥으로 이루어져있으면 단선, 여러가닥이 뭉쳐져서 되어있으면 연선입니다.

 

단선 - 한가닥의 구리선, 연선보다 유연성이 떨어짐. 1가닥이라 작업하기 편리하고 연선에 비해 저렴하다. 작업용으로 판매되는 케이블은 주로 단선이 많다.

 

연선 - 여러가닥(대략 7가닥)의 구리선, 단선보다 유연하여 휘거나 변형하기 좋아 엘리베이터 내부 같이 움직이는 장치에 사용하기 좋음.

여러 가닥이라 작업하기 어렵다. 그래서 완제품으로 판매되는 케이블이 많다.

 

>>시중의 대부분은 단선입니다. 둘의 성능의 차이는 없습니다. 성능의 단위는 CAT(카테고리)임.

 

 

[ 랜선의 종류 - 3. UTP 케이블/STP 케이블/FTP 케이블이란? ]

 

랜선의 각 명칭은 케이블 속의 심선(구리선)을 어떤 식으로 감싸고 있는지 실드 구조에 대한 명칭입니다.

공통적으로 들어가는 TP 라는 단어는 Twisted pair의 준말이며 두 가닥의 케이블이 꼬여있다는 의미입니다.

(참조: http://en.wikipedia.org/wiki/Twisted_pair)

 

 

* UTP 케이블 (일반적으로 랜선 잘라서 보면 아래와 같습니다. UTP 단선 cat.5e)
q6
UTP는 언실디드 트위스티드 페어(unshielded twisted pair cable)의 준말이며,

 

‘실드가 없다’는 의미와, 두 선이 한 쌍으로 꼬여있다는 의미 입니다.

 

위의 사진은 넷메이트사의 UTP 케이블(CAT5e)의 사진입니다.

 

넷메이트사의 CAT5e 케이블은 안쪽에 차폐역할을 하는 명주실(있는 케이블도 있고 없는 케이블도 있음)이 들어있습니다.

 

* STP 케이블

 

STP(쉴드 꼬임케이블)는 FTP(호일 쉴드)와 S-STP(스크린 쉴드)의 종류가 있습니다.

 

STP는 실디드 트위스티드 페어(shielded twisted pair cable)의 약어이며,

FTP(foiled twisted pair) 또는 S-STP(Screened-shielded twisted pair) 등의 차폐가 되어있는

케이블들을 지칭하는 말인데

차폐의 종류는 알루미늄 호일 FTP, 편조쉴드 등 여러가지 종류가 있습니다.

 

* FTP 케이블
q7
FTP 케이블은 (foiled twisted pair)의 약어입니다.

 

UTP 케이블과 달리 8가닥의 케이블 말고도 어스선(접지선)이라고 하는 선이 있고

 

외부의 전선 피복 안에 호일로 한번 감싸져 있는 구조입니다.

 

위의 사진은 Cat5e FTP 케이블입니다.

 

 

좀 자세히 보기 위해 큰 사진을 구글에서 찾았습니다.

 

* S/FTP(S-STP) 케이블
q8
S-FTP, S/FTP 케이블은 (Screened shielded twisted pair) 의 약어입니다.

 

안쪽에 꼬여있는 트위스트 페어 케이블에도 각각 실드가 되어있고 전부 모아서 한번 더 실드한 뒤 피복이 있는 형태입니다.

 

특히 피복아래 있는 실드는 편조실드로서, 실선이 그물처럼 촘촘히 짜여있는 구조입니다.

 


가정용으로 많이 사용되는 케이블은 저렴한 CAT.5나 CAT.6 사양의 UTP 케이블이며

 

편조쉴드나 은박쉴드가 추가된 FTP, STP 케이블은 노이즈를 방지하는 기능이 UTP 케이블보다 뛰어나기 때문에

 

케이블 간의 신호 간섭현상이나 누전으로부터 안전합니다.

 

참조 : (http://blog.naver.com/kwshop88/100186208206)

 


위는 랜선의 종류에 다해서 설명한 것이고
아래는 같은 약어인(FTP, STP) 의 통신규약 종류에 대해서 설명한 것입니다.

 

올해(2014년) LG U+ 면접 질문으로 FTP와 STP가 동작하는 통신모델 계층을 설명하라 라는것이 나왔다고 합니다.

 

FTP(File Transfer Protocol)는 응용규약이기때문에 Application Layer에서 동작하고요.

STP(Spanning Tree Protocol)는 Datalink Layer에서 동작하는 것이고 router 장비의 loop를 막기위해 한쪽방향을 블락시키는 프로토콜입니다.
Spanning Tree를 만들면 Cycle이 없기 때문에 장비간 루프가 차단됩니다.

U+ 면접 볼 건 아니지만 궁금해서 찾아봤음.

참조 : http://ko.wikipedia.org/wiki/Ftp (FTP;파일 전송 프로토콜)

참조 : http://ko.wikipedia.org/wiki/%EC%8B%A0%EC%9E%A5_%ED%8A%B8%EB%A6%AC_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C (STP;신장 트리 프로토콜)



[출처] https://blog.lael.be/post/50

반응형
Posted by blueasa
, |

UnityAds에는 보상형광고와 일반형광고 두가지가 있습니다.

일반형과 보상형의 차이는 스킵버튼이 활성화되어 사용자가 광고를 스킵할수 있는지 없는지의 차이 입니다.

일반형으로 설정시(아무런 설정하지 않으면 일반형이 기본값입니다) 사용자는 5초후 광고 스킵 버튼이 활성화 되어5초후 부터 광고를 스킵할수 있습니다.
(5초 이외에 원하는 시간으로 설정 가능)

하지만 보상형으로 설정시 스킵버튼이 나오지 않아 사용자는 무조건 광고를 끝까지 보아야 합니다.사용자가 무조건 광고를 끝까지 보게 되므로 수익을 얻을 가능성이 좀 더 높일 수 있습니다.

따라서 보상형 광고로 설정하는 것을 추천 드립니다.

게임을 추가하여 게임ID가 생성되면, 하기와 같이, 해당 게임ID에 기본적으로 일반형광고 ID와 보상형 광고 ID가 2가지가 추가되어 있습니다.
(PictureZone은 현재 지원하지 않는 기능입니다)

스크린샷 2015-07-21 오후 1.28.27

이 아이디를 사용하여 보상형 광고로 설정할 수 있습니다.

보상형 비디오로 설정하는 방법 가이드 입니다.

1. Code examples for Unity Ads package

Show 의 Parameter로 zoneid를 주면 됩니다.

Advertisement.Show(“rewardedVideoZone”);

만약 일반형광고를 원한다면, 다음과 같이 zoneid를 설정하지 않거나 null을 넘기면 일반형 광고로 설정됩니다.

Advertisement.Show();

2. Code examples for native iOS

IOS NATIVE SDK로 할때는, A) 항상 기본형을 사용하거나 B) 항상 show를 보여주기 전에 setZone(“”)을 합니다.

if ([[UnityAds sharedInstance] canShow]) {   
               [[UnityAds sharedInstance] setZone:@”rewardedVideoZone”];
        [[UnityAds sharedInstance] show:….];

}

3. Code examples for Android

Andorid NATIVE SDK로 할때는, A) 항상 기본형을 사용하거나 B) 항상 show를 보여주기 전에 setZone(“”)을 합니다.

if(UnityAds.canShow()){   
   UnityAds.setZone(“rewardedVideoZone”);   
   UnityAds.show(options); 
}

만약 광고를 보여주는 곳 마다 ad placement id를 다르게 설정하여 광고별로 성과를 알고 싶다면,하기와 같이 ad placement id를 생성한 후 사용하면됩니다.
unityads.unity3d.com/admin 페이지의에서   게임 > 게임 선택 > 수익화 설정> 고급설정 광고 게재 위치 옆 +새 광고 게재 위치 추가 버튼 클릭

+새광고 위치 추가 버튼을 클릭하면 다음화면이 나옵니다.

스크린샷 2015-07-21 오전 10.07.54

보상형 광고로 선택합니다.
보상형 광고로 선택하게 되면 사용자가 광고를 스킵할 수 없습니다. 혹시 추가적으로 원하시는 옵션이 있으시면 선택후 저장하시면 됩니다.

저장 후 다음과 같이 추가된 것을 확인 할 수 있습니다.

rewardedvideozone

그리고 개발하시는 게임의 코드상에서 해당 ZONE ID를 사용하시면 됩니다
즉 위의 캡쳐화면의 예제에서는 “199981428975268” 를 사용하시면 됩니다.

Advertisement.Show(“199981428975268″);

또한 참고로, 현재 인터넷 익스플로러에서 추가된 zone id 목록이 보이지 않는 경우가 있습니다.
따라서 zoneid를 추가하였는데도 목록에서 보이지 않는 경우, 크롬으로 확인해주세요.



[출처] http://www.unityads.co.kr/?p=1285

반응형

'Unity3D > Ad' 카테고리의 다른 글

[링크] [Unity3D] Google AdMob 연동하기  (0) 2018.01.08
Unity에서 ADID・IDFA 얻기  (0) 2017.11.28
[Unity] Vungle Plugin 설치  (0) 2016.07.26
[Unity] Google AdMob Plugin 설치하기  (0) 2016.07.26
Unity Ads 연동  (0) 2016.07.26
Posted by blueasa
, |


[링크] http://www.badayak.com/entry/Snology-NAS-DS213j-Photo-Station

반응형
Posted by blueasa
, |