아래 문서에서 일부 번역

Unity tips
http://www.slideshare.net/MakotoItoh/unity-tips

 

 

저작자 표시
신고
by 흥배 2016.09.23 08:00

unity의 메모리 최적화 관련 글을 보면 foreach를 사용하지 마라는 것을 자주 볼 수 있다.

이유는 foreach에서 메모리 할당을 발생시켜서 GC를 유발하기 때문이다.

 

이것은 C# 언어 자체의 문제가 아니고 mono쪽의 구현 문제이다.

C# 스펙 문서에도 foreach 최적화에 대해 언급이 있는데 mono에서 제대로 구현하지 않았다.

MS의 닷넷프레임워크에서는 이런 문제가 없다. 그리고 근래의 mono에도 없다.

 

unity는 오래된 버전의 mono를 사용해서 foreach가 문제가 된다.

 

다행히 얼마 전에 unity mono를 업그레이드 하겠다는 계획을 발표했다. 현재 개발자들이 테스트할 수 있는 버전이 나왔고 지금은 컴파일러 부분만 개선되었다(즉 라이브러리 업그레이드는 아직이다).

 

http://forum.unity3d.com/forums/experimental-scripting-previews.107/

이것을 설치해서 foreach를 사용해보면 문제가 해결된 것을 볼 수 있다.

 

장래에 unity를 공부할 때 오래된 글만 보면 실수 할 수 있으니 unity가 새 버전이 나올 때마다 잘 살펴보기 바란다.

 

 

출처: http://neue.cc/2016/08/05_537.html

번역 http://sitetrans.naver.net/?rel=http://neue.cc/2016/08/05_537.html&srcLang=ja&tarLang=ko

 

 

저작자 표시
신고
by 흥배 2016.08.25 08:00

성능을 중요시 하는 프로그램을 만들 때(특히 Unity를 사용한 게임) GC를 조심해야 하므로 불필요한 new를 사용하지 않아야 한다.

그러니 일부 눈에 보이는 코드에는 new를 사용하지 않지만 내부에서 사용되는 경우가 있다.

 

1. 박싱화

var x = (object)10;

 

void Test(object o)

{

}

 

Test(10);

 

 

2. 제너릭을 사용할 때 Object를 사용하는 메소드 사용

bool IsSame<T>(T t1, T t2)

{

    return t1.Equals(t2);

}

위의 IsSame은 제너릭 함수라서 박싱화가 일어나지 않을 것이라고 생각하지만 Equals 메소드가 Object를 사용해서 박싱화가 일어난다.

public virtual bool Equals(Object obj);

 

이 문제를 회피하기 위해서는 아래처럼 사용해야 한다.

public interface IEquatable<T>

{

    bool Equals(T other);

}

 

bool IsSame<T>(T t1, T t2) where T : IEquatable<T>

{

    return t1.Equals(t2);

}

 

혹은

bool IsSame<T>(T t1, T t2)

{

    return EqualityComparer<T>.Default.Equals(t1, t2);

}

 

 

3. 람다식의 보이지 않는 new

static int DoubleStatic(int x)

{

    return x * 2;

}

 

int DoubleInstance(int x)

{

    return x * 2;

}

 

void Run()

{

    var two = int.Parse("2");

 

    Enumerable.Range(1, 1).Select(DoubleStatic);           // 1

    Enumerable.Range(1, 2).Select(DoubleInstance);         // 2

    Enumerable.Range(1, 3).Select(x => x * 2);             // 3

    Enumerable.Range(1, 4).Select(x => x * two);           // 4

    Enumerable.Range(1, 5).Select(x => DoubleStatic(x));   // 5

    Enumerable.Range(1, 6).Select(x => DoubleInstance(x)); // 6

}

 

패턴 1, 2는 메소드를 직접 넣은 경우로 델리게이트를 사용하므로 new를 사용한다.

패턴 3은 일반적으로 자주 사용하는 패턴으로 new를 사용하지 않는다.

패턴 4도 자주 사용되는 패턴으로 로컬 변수를 사용해서 클래스가 만들어지므로 new를 사용한다.

패턴 5static 메소드를 사용해서 첫 호출 이외에는 캐시된 것을 사용하므로 별 문제 되지 않는다.

패턴 6은 델리게이트를 사용하므로 new를 사용한다.

 

위의 코드의 안 보이는 코드를 표현하면 아래와 비슷해진다.

static Func<int, int> cacheA;

static Func<int, int> cacheB;

 

internal static int LambdaA(int x)

{

           return x * 2;

}

 

class Closure

{

    internal int two;

 

    internal int LambdaB(int x)

    {

        return x * two;

    }

}

 

internal static int LambdaC(int x)

{

           return DoubleStatic(x);

}

 

internal static int LambdaD(int x)

{

           return DoubleInstance(x);

}

 

void Run()

{

    var two = int.Parse("2");

 

    // 1 - Select(DoubleStatic)

    Enumerable.Range(1, 1).Select(new Func<int, int>(DoubleStatic));

 

    // 2 - Select(DoubleInstance)

    Enumerable.Range(1, 2).Select(new Func<int, int>(DoubleInstance));

 

    // 3 - Select(x => x * 2)

    if(cacheA != null)

    {

        cacheA = new Func<int, int>(LambdaA);

    }

    Enumerable.Range(1, 3).Select(cacheA);

 

    // 4 - Select(x => x * two)

    var closure = new Closure();

    closure.two = two;

    Enumerable.Range(1, 4).Select(new Func<int, int>(closure.LambdaB));

 

    // 5 - Select(x => DoubleStatic(x))

    if(cacheB != null)

    {

        cacheB = new Func<int, int>(LambdaC);

    }

    Enumerable.Range(1, 5).Select(cacheB);

 

    // 6 - Select(x => DoubleInstance(x))

    Enumerable.Range(1, 6).Select(new Func<int, int>(LambdaD));

}

 

 

 

출처: http://neue.cc/2016/01/06_525.html

 

저작자 표시
신고
by 흥배 2016.02.03 07:52

세이더/렌더링

Shader Forge

https://www.assetstore.unity3d.com/en/#!/content/14147

노드 베이스 세이더 편집 에디터. 간편하게 세이더를 만들 수 있어서 편리하다. 이것과 Substance Designer를 조합하면 마테리얼 작성은 문제가 없을 것 같다.(유료)

 

Skyshop: Image-Based Lighting Tools & Shaders 1.12.2

https://www.assetstore.unity3d.com/jp/#!/content/8880

모바일에서 미려한 렌더링을 싼 가격으로 하고 싶을 때 좋을 세이더 시스템.(유료)

 

UBER - Standard Shader Ultra

https://www.assetstore.unity3d.com/en/#!/content/39959

Unity 5 Standard 세이더 확장판. SSS를 쓰거나 DX11용 세이더가 있다면 퀄리티 높은 표현을 간단하게 할 수 있다.(유료)

 

SE Natural Bloom & Dirty Lens

https://www.assetstore.unity3d.com/en/#!/content/17324

블룸 효과라면 이것. 아주 간단하게 예쁘게 빛나는 효과를 표현할 수 있다.(유료)

 

Vectrosity

https://www.assetstore.unity3d.com/en/#!/content/82

라인 렌더링이 필요하다면 이것. 와이어 프레임 표현 등에 쓸 수 있다.(유료)

 

Global Illumination Proxy

https://www.assetstore.unity3d.com/en/#!/content/21197

런타임에서 사용할 수 있는 실시간 GI을 실현하는 에셋. 모바일에서도 사용할 수 있고, 프로시저 모델에도 사용할 수 있는 뛰어난 물건.(유료)

 

 

 

모델링

Mega-Fiers

https://www.assetstore.unity3d.com/en/#!/content/644

모델의 디포 메이션을 할 수 있다. 특히 편리한 것은 Point Cache 데이터 임포트 기능. 3D 모델에서 디 포맷을 사용한 애니메이션의 임포트가 가능하다.(유료)

 

Procedural Toolkit

https://www.assetstore.unity3d.com/en/#!/content/16508

런타임에 메쉬를 만들 필요가 있을 때 편리한 라이브러리. 편리한 도우미 클래스가 몇 가지 있다.(무료)

 

ObjReader

https://www.assetstore.unity3d.com/en/#!/content/152

스탠드얼론 플랫폼에서 사용할 수 있다. OBJ 데이터를 런타임에서 읽을 수 있는 에셋.(유료)

 

 

 

네트워크

Best HTTP (Pro Edition)

https://www.assetstore.unity3d.com/en/#!/content/10872

Unity에서 REST 통신을 하고 싶을 때 이것을 택했다. 간단하고, 현재 오류 없음.(유료)

 

Bundle Manager

https://www.assetstore.unity3d.com/en/#!/content/14035

에셋 번들 작성·관리에 사용하고 있다. 코드가 필요 없으므로 편리.(유료)

 

Parse

https://www.assetstore.unity3d.com/en/#!/content/11119

mBaaS Parse.com Unity용 플러그 인. 편리하지만 Twitter 연휴 등 원하는 기능이 없기도 한다.(무료)

 

 

UI

Easy Touch : Touchscreen & Virtual Controls

https://www.assetstore.unity3d.com/en/#!/content/3322

특히 모바일 프로젝트에서 유용. 제스추어 기능이나 콘트롤러 등의 작성·이벤트 관리가 간단하다.(유료)

 

iTween

https://www.assetstore.unity3d.com/en/#!/content/84

UI나 오브젝트 애니메이션 할 때 쓸 수 있다. 문서는 적지만 편리하다. 샘플집(https://www.assetstore.unity3d.com/en/#!/content/18388 유료)도 있으므로, 이것과 함께 있다고 활용법이 알기 쉽다.(무료)

 

Picker for uGUI

https://www.assetstore.unity3d.com/en/#!/content/31412

Unity 기본 GUI Picker를 재현하고 있다. 매우 편리하다.(유료)

 

Unity Sample: UI

https://www.assetstore.unity3d.com/en/#!/content/25468

Unity UI의 샘플집. 여러 가지 사용법을 알 수 있어서 편리하다. 가져올 때는 패키지에 프로젝트 설정 파일 등도 포함되어 있으므로 주의.(무료)

 

New UI Widgets

https://www.assetstore.unity3d.com/en/#!/content/27226

아코디온이나 콤보 박스와 같은 기본 uGUI에는 없는 GUI 위젯이 많이 들어 있다. 모두 다루기 쉽고 디자인도 바꾸기 쉬워서 편리하다.(유료)

 

UBlur

https://www.assetstore.unity3d.com/en/#!/content/37840

모바일에서도 사용할 수 있는 UI 패널의 배경을 흐릿하게 하기 위한 플러그 인. IOS에서 자주 볼 수 있는 배경이 흐릿해진 UI을 쉽게 만들 수 있다.(유료)

 

 

 

에디터

Playmaker

https://www.assetstore.unity3d.com/en/#!/content/368

노드 기준으로 게임 객체의 컨트롤이 가능하다. Git에서 관리하지 못하는 등의 단점이 있지만 신속하게 프로토 타입을 만들고 싶은 경우에는 빼놓을 수 없다.(유료)

 

The Cinema Suite

https://www.assetstore.unity3d.com/en/#!/content/22171

리얼한 카메라 셋팅을 그대로 쓰거나(F 값 등) 시네마틱 장면을 컨트롤하기 위한 타임 라인 컨트롤이 가능. 영화적 표현을 하려면 필수적이라고 말할 수 있다.(유료)

 

 

 

유틸리티

JSON .NET For Unity

https://www.assetstore.unity3d.com/en/#!/content/11347

JSON.NET Unity로 쓰도록 하기 위한 에셋 데이터 관리에 자주 쓴다.(유료)

 

Runtime Serialization for Unity

https://www.assetstore.unity3d.com/en/#!/content/36879

클래스의 인스턴스는 당연하고 씬을 통째로 시리얼라이즈 해서 저장할 수 있는 에셋. 비동기로 시리얼라이즈 할 수 없는 것이 아쉬운 점이지만 편리하다.(유료)

 

Easy Save - The Complete Save & Load Asset for Unity

https://www.assetstore.unity3d.com/en/#!/content/768

Unity에서 세이브·로드를 쉽게 하기 위한 에셋.(유료)

 

Math Library for Unity

https://www.assetstore.unity3d.com/en/#!/content/14912

게임에서 흔히 쓰이는 기하 학계의 메소드(인터 섹트 등)이 많이 들어 있다(유료)

 

 

 

네이티브 기능

Mobile Social Plugin

https://www.assetstore.unity3d.com/en/#!/content/15066

IOS Android에서 트위터나 페이스북 등 소셜계 기능을 추가하고 싶을 때에 편리. 업데이트도 자주 행해지고 있고, 서포트도 빠르다.(유료)

 

Mobile Native PopUps

https://www.assetstore.unity3d.com/en/#!/content/18479 

모바일 네이티브 팝업을 사용하기 위해서 도입. IOS, Android 동시에 사용할 수 있어서 편리하다.(무료)

 

UniRate

https://www.assetstore.unity3d.com/en/#!/content/10116

모바일 앱에 평가 독촉 기능을 넣기 위한 에셋. 쉽다.(유료)

 

Gallery Screenshot

https://www.assetstore.unity3d.com/en/#!/content/7827

IOS/Android용 스크린 캡처+화상 앨범에 저장 기능. 깔끔하고 편리하다.(유료)

 

 

 

출처: http://qiita.com/jhorikawa/items/410ecdc1addd04201fbf

 

저작자 표시
신고
by 흥배 2015.09.24 08:00

Unity3D과 Mono를 사용하고 있는데 Unity3D 4.0은 Mono 버전을 어디까지 지원하고, 그럼 그 Mono 버전은 .NET Framework 버전을 얼마까지 지원하는지 아주 간단하게 정리합니다



 Mono

.NET Framework 

 

 2.6

 3.5

 Unity3D 4 버전

 2.10

Xamarin 2.0 

3.0 

 4.5

 



저작자 표시
신고
by 흥배 2013.06.20 08:00
| 1 |

티스토리 툴바