GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

'프로그래밍'에 해당되는 글 27건

  1. 2013.01.29
    ttf 관련 문서
  2. 2013.01.18
    Google Expansion File 설명. 2
  3. 2012.11.15
    AI 엔진 만들기. 1
  4. 2012.11.01
    AI PPT
  5. 2012.10.25
    볼만한 슬라이드들
  6. 2012.10.25
    VTF 관련 글.
  7. 2012.10.23
    [Unity] C# Delegate 그리고 Event 3
  8. 2012.10.17
    C# Delegate
  9. 2012.10.16
    C# Delegate
  10. 2012.10.16
    TCP / UDP

https://developer.apple.com/fonts/TTRefMan/

'프로그래밍' 카테고리의 다른 글

한글 파싱...  (0) 2013.02.08
C# Flag 사용하는 방법.  (1) 2013.02.01
Google Expansion File 설명.  (2) 2013.01.18
AI 엔진 만들기.  (1) 2012.11.15
AI PPT  (0) 2012.11.01
AND

http://developer.android.com/google/play/expansion-files.html

구글은 다른 곳과는 달리 apk 에 50MB라는 제한이 걸려있는데
이를 해결하는 방법으로는 

1. 어플리케이션에서 우리가 만든 서버에 접속해서 데이터 파일들을 읽거나
2. Google에서 제공하는 Expansion을 사용한다.

로 나뉠 수 있다.

지금 여기서 설명할 것은 2번이다.

Overview

- 개발자가 apk를 업로드할 떄 추가적인 2개의 expansion file을 각각 2GB씩 추가로 올릴 수 있다.(즉, 총 4GB 사용 가능)
첫번째 expansion file은 Main expansion file이라 부르는데, 여기에 중요한 데이터들을 넣어주면 된다.
두번째 expansion file은 patch expansion file이라 부르고, 여기에는 사소한 업데이트에 사용되는 이미지들을 넣어주는 용도로 사용된다.

물론 두개는 엄격한 기준이 아니지만, 위 사이트에서는 다음과 같은 것을 지켜주라고 언급한다.
Main Expansion File은 중요한 데이터들을 넣고, 아주 가끔씩 업데이트된느 파일들을 넣어주고,
Patch Expansion FIle은 ...? 뭐지;;; patching이 자동적으로 안된다는데....

주의할 것은 따로 expansion file만 올릴 수 있는게 아니라, expansion file을 다시 올리기 위해서는 새로운 APK를 같이 업데이트 해줘야 된다는 것이다. (?)

File name format

- 각각의 expansion file은 아무 포맷이나 사용 가능하다(ZIP, PDF, MP4, etc) 
파일 타입에 따라 상관 없이 Google Play는 다음과 같은 방식(?)으로 파일을 바꾼다.
[main | patch].<expansion-version>.<package-name>.obb

ex) main expansion file의 버젼이 314159이고 앱의 package-name이 com.example.app이라면 main expansion의 이름은
main.314159.com.example.app.obb

Storage location

- Google Play가 Expansion file을 기기에 다운로드할 때 그 위치는 시스템에서 공유되는 저장 공간에 저장이 된다(system's shared storage). 정상적으로 작동하기 위해서는 expansion file을 강제적으로 움직이거나, 기우거나, 이름을 변경해서는 안되며,
여러분의 앱이 expansion fiile을 google play 에서 수동적으로 다운로드를 해야하는 일이 발생하면, 다음과 같은 위치에 저장해야 된다.

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

<shared-storage>는 getExternalStorageDirectory()로 부터 받아올 수 있다.

<package-name>은 여러분이 만든 application의 package-name이고, getPackageName()으로 불러올 수 있다.

위의 경로에는 항상 2개의 expansion file만 존재한다. Main과 Patch이고, 이것들은 apk를 새로 다운받으면 자동적으로 업데이트가 된다.
expansion file에 들어있는 데이터들을 unpack해야 된다면, .obb파일은 절대로 지워서는 안된고, unpack 된 데이터들을 같은 폴더에 넣어놓지 말고, 다른 위치에다 저장을 시켜야 된다. getExternalFilesDir()을 통해 unpacked된 데이터들을 저장해야 되는데, 가능하다면 unpack을 안하고 데이터를 읽는 형태를 권장한다. 가령 .zip파일에서 데이터를 바로 읽을 수 있는 라이브러리를 제공하니 걱정하지 않아도 됩니다.

주의: apk파일과는 다르게 shared storage에 있는 데이터들은 다른 application에서 읽기가 가능합니다.

팁: 위에서 언급한 zip 파일을 unpack하지 않고 읽기 위해서는 compression을 이용한 압축을 사용하면 안됩니다. compression을 사용하지 않는 압축은 zip -n 을 앞에 붙여 압축해야합니다.

Download process

- 대부분은 Google Play가 apk를 다운로드할떄 expansion file들을 함께 다운로드 해줍니다. 그러나 가끔씩 google play에서 다운로드 하지 못하는 경우가 생기는데, 이러한 경우에는 개발자가 직접 이전파일을 지우고 새로운 expansion file들을 다운로드 해 줘야됩니다. Expansion file의 다운로드는 Google Play에서 제공되는 URL에서 다운받을 수 있습니다.

다운로드의 과정은 다음과 같습니다:
1. 사용자는 google play에서 앱을 설치.
2. Google Play에서 expansion file을 다운로드 가능한 상태라면 apk와 함꼐 자동으로 다운로드가 실행. 아니라면 apk만 다운로드
3. 사용자가 앱을 실행시키면 앱이 expansion file들이 device에 존재하는지 확인을 해주고, 
3-1. 있다면, 앱을 실행
3-2. 없다면, expansion file들을 구글플레이에서 다운로드 받아야 됩니다. 앱에서 Google Play에 Google Play's application licensing service를 이용해서 요청을 보내는데, 받아오는 자료는 파일 이름, 사이즈, url을 얻어옵니다. 해당 정보들로 expansion file을 다운받으면 됩니다.

Development checklist

- 여러분이 개발을 해야할때 확인해야 할 사항들을 나열해 보도록 하죠
1. 여러분의 앱이 50MB를 꼭 넘어야 되는지 확인해 봅시다. 다양한 사이즈에 맞춰야되는 경우, 더 좋은 그래픽 리소스를 사용하는 경우 등은 새로운 apk를 만들어서 여러 apk를 등록시키는 방법이 존재하니 알아두시면 되겠습니다.
2. 어떤 데이터들을 apk에서 분리시킬지 정하십시오. 보통은 patch expansion file을 main expansion file을 업데이트 하기 위해 사용하는 것이 좋지만, main expansion 파일이 2gb가 넘어간다면 path expansion file을 main expansion file처럼 사용해도 문제 없습니다.
3. 어플리케이션을 개발할때 외부의 리소스를 사용하도록 개발하십시오. 그리고 웬만하면 .zip을 사용하세요.
4. 앱의 실행부분에 expansion file이 존재하는 코드를 꼭 만들어 두십시오. 다운로드는 해당 라이브러리를 사용하는 것을 권장합니다.

앱 개발이 끝나셨으면 Testing Your Expansion Files로 가서 테스트 해보세요!

Rules and Limitations

- 다음 것들을 주의하세요
1. expansion file은 2gb를 넘을 수 없습니다.
2. 유저가 expansion file을 다운로드 하기 위해서는, 해당 어플리케이션을 google play에서 다운로드 받은 상태여야 합니다. 만을 다른 방법으로 다운로드 받았다면, google play에서는 url을 제공해주지 않습니다.
3. 앱에서 다운로드를 실행할때, 얻는 url을 임시로 생성되는 것이며, application의 다운로드가 다 완료되면 해당 url은 사라집니다.
4. 만일 새로운 apk를 올리거나, 여러개의 apk를 올린다면, 이전에 올린 expansion file을 선택할 수 있습니다. expansion file 이름은 바뀌지 않고, 원래 apk와 같이 올라갔더너 버젼으로 매치 됩니다.
5. 만을 여러개의 apk를 올리고 expansion file도 기기에 맞게 존재한다면, 각각의 기기를 위한 apk를 올려서 유일한 versionCode를 얻어야되고, 각가그이 apk에 filter를 설정해줘야 됩니다.
6. expansion file만 바꾸는 것으로 당신의 어플리케이션이 업데이트 된 버젼이라고 알릴 수는 없습니다. 어플리케이션의 버젼을 올리기 위해서는 apk를 변경해야 합니다. 
7. obb 폴더 안에는 아무것도 저장하지 마십시오. 다른 저장할 파일들이 존재한다면 getExternalFilesDir()을 이용하여 저장하세요.
8. .obb파일의 이름을 바꾸거나 지우지 마십시오.(업데이트를 제외한). 이는 google play에서 지속적으로 expansion file을 다운로드 하게 만드는 현상을 만듭니다.
9. expansion file을 수동으로 업데이트를 해준다면, 이전 expansion file또한 수동으로 지워준 상태여야 합니다.

Downloading the Expansion Files

- 대부분의 경우에는 google play에서 expansion file을 받아줍니다. 그러나 가끔 받지 못하는 경우에는 직접 다운로드를 받아야 합니다. 이럴때는 Google Play's Application Licensing service에서 제공되는 url을 통해서 받습니다.

다운로드를 받기 위해서는 다음과 같은 절차를 거칩니다.
1. 어플리케이션이 실행되면 shared storage location(Android/obb/<package-name>/ )에 expansion file이 존재하는지 검색합니다. 
2. 있다면 어플리케이션이 실행되고 없다면 다음 과정을 거칩니다.
3. Google Play's Application Licensing service 에 요청을하여 expansion file의 이름, 사이즈, url을 가져옵니다.
4. 얻어온 url을 사용하여 expansion file을 다운로드 합니다. 

만일 여러분의 어플리케이션이 무료버전이라면 아마 Applciation Licensing service를 사용하지 않았을 것입니다. 이 서비스는 유저가 올바르게 구매했다는 것을 확신하기 위한 정책(?) 입니다. 따라서 만일 여러분의 어플리케이션이 무료라고 하더라도, expansion file을 이용하기 위해서는 License Verification Library(LVL)을 포함시켜야 합니다. 라이선스 인증을 위해서가 아니라, google play에 url을 얻기위해 포함시켜야 되는 것입니다.

다운로드를 시작하기 이전에 다음과 같은 사항들을 체크해 주십시오.
1. 기기에 충분한 공간이 있는지 확인해 주세요.
2. 파일 다운로드를 background service에 등록시켜야 합니다. 
3. 다양한 에러가 발생할 수 있으니 주의해 주십시오(..... ㅡ.ㅡ;;)
4. 네트워크 연결 문제에 의한 다운로드 중지도 고려해야 합니다. (다시 다운로드나, resume과 같은것들

위의 문제는 저희가 제공하는 Library를 사용하면 해결 가능합니다. 그렇지 않고 직접 만드시겠다면...... Application Licensing을 참고하시고, APKExpansionPolicy class를 사용하셔야 합니다.

About the Downloader Library

'프로그래밍' 카테고리의 다른 글

C# Flag 사용하는 방법.  (1) 2013.02.01
ttf 관련 문서  (0) 2013.01.29
AI 엔진 만들기.  (1) 2012.11.15
AI PPT  (0) 2012.11.01
볼만한 슬라이드들  (0) 2012.10.25
AND

전제할 것들.

1. 상태를 객체화 시켜서 관리를 한다.

2. 1 : 1 매치. 한 상태는 한가지 행동만 실항한다. (ex. 가령 슈팅게임에서 이동 + 공격이라면 이동이라는 상태와 공격이라는 상태를 동시에 실행 가능하게 하되, 한 상태에서 이동 + 공격이라는 행동을 하지 않도록 한다)

3. 위의 전제에 따라 상태는 여러 상태가 동시에 실행 될 수 있다.(Layer화를 통해)

4. 특정 상태에서 새로운 FSM을 다중적으로 실행 할 수 있다.

5. 상태에서 상태로 전환하는 Transition이라는 것을 객체화 시킨다.

6. 한 상태는 입력받을 수치들을 어떤 형태로든 가지고 있어야 하며, 특정 입력에서 어떤 출력을 하게 될지도 존재해야 한다.(?)

7. 상태를 전환할때는 다음과 같은 기능이 가능하도록 한다.
[1. 현재 상태를 없애버리고 완전히 새로운 상태로 전환]
[2. 현재 상태를 stack에 넣고 새로운 상태로 전환]
[3. 현재 상태와 동시적으로 실행될 새로운 상태를 실행]

8. 인스턴스화된 상태 객체들은 자신이 언제 파괴되는지를 알고 있어야 한다(파괴보단 OFF와 가까울 듯). 

9. 인풋들은 크게 int, float, double, bool, vector 등등의 기본 자료형으로 표현이 되며, input이라는 클래스를 상속한 새로운 클래스를 통해 정보를 수집하여 input으로 변환하는 과정을 거쳐야 한다.


문제점. 
사용자가 직접 구현한 클래스를 그래프 형식으로 표현하여 추가/제거와 링크를 하는 기능을 만들고 싶은데... 방법을 모른다. -> 이게 없으면 만든 의미가 없다.

'프로그래밍' 카테고리의 다른 글

ttf 관련 문서  (0) 2013.01.29
Google Expansion File 설명.  (2) 2013.01.18
AI PPT  (0) 2012.11.01
볼만한 슬라이드들  (0) 2012.10.25
VTF 관련 글.  (0) 2012.10.25
AND

'프로그래밍' 카테고리의 다른 글

Google Expansion File 설명.  (2) 2013.01.18
AI 엔진 만들기.  (1) 2012.11.15
볼만한 슬라이드들  (0) 2012.10.25
VTF 관련 글.  (0) 2012.10.25
[Unity] C# Delegate 그리고 Event  (3) 2012.10.23
AND

'프로그래밍' 카테고리의 다른 글

AI 엔진 만들기.  (1) 2012.11.15
AI PPT  (0) 2012.11.01
VTF 관련 글.  (0) 2012.10.25
[Unity] C# Delegate 그리고 Event  (3) 2012.10.23
C# Delegate  (0) 2012.10.17
AND

'프로그래밍' 카테고리의 다른 글

AI PPT  (0) 2012.11.01
볼만한 슬라이드들  (0) 2012.10.25
[Unity] C# Delegate 그리고 Event  (3) 2012.10.23
C# Delegate  (0) 2012.10.17
C# Delegate  (0) 2012.10.16
AND

Delegate

Delegate는 한글말로 대리자라 해석한다. 대신 해주는 사람을 뜻하는데, 이와 같은 의미로 특정 일을 대신 해주는 변수(field 에 속함)라 생각하면 된다.
특정 일을 해준다는 것은 특정 형식의 Method를 대신 실행해준다는 것을 의미한다.
변수라 하면 특정 Type의 클래스와 그 클래스가 실체화한 Instance가 존재하는데 이는 Delegate에서도 마찬가지다.

public delegate void DelegateMemberVariable(int a);

해당 코드를 보면 void라는 리턴 타입에 int형의 인자를 받는 함수를 선언하면  Delegate Type 정의 한것이 되고

DelegateMemberVariable delFunc;

를 함으로써 한개의 변수로서의 역할을 하게 된다.
원래 변수를 사용하기 위해서는 그 변수 클래스의 instance 만들어 줘야 하는데 이는 delegate을 사용하기 위해서도 동일하다.

먼저 대리자가 대신 해줄 일을 정의한다

void Function1(int a) 
{
	print("I'm Function1");	
}

그 뒤 대리자의 Instance 만들어서 멤버 변수에 등록을 시켜준다.

delFunc = new DelegateMemberVariable(Function1);

위의 코드와 같이 등록을 시켜주면 함수와 같이 실행 할 수 있게된다.

delFunc(1);

인자는 자동으로 Function1의 a로 넘어가게 되며, Function1이 실행이되어 콘솔창에 I'm Function1이라는 글자가 출력되게 된다.


Multicast Delegate

MulticastDelegate이라는 클래스가 존재하긴 하지만, 사실상 delegate과 같은 기능을 한다.(아마도...?)

이 기능이 무엇인가 하면, 한개의 대리자가 여러개의 일을 처리하는 것으로 생각하면 된다.

마치 사람에게 일1, 일2, 일3을 주는 것과 같은 원리로, 한 대리자 변수에 여러개의 instance를 등록하여, 여러 Method를 한번에 실행하여 관리하는 것이다.

코드는 다음과 같다.

delegate void DelegateFunction(int a);
DelegateFunction delFunc;
	
void Function1(int a)
{
	print("I'm Function1");	
}
void Function2(int b)
{
	print("I'm function2");
}	
	
void Function3(int c)
{
	print("I'm funcion3");	
}
delFunc = new DelegateFunction(Function1); 
delFunc += new DelegateFunction(Function2);// + 연산자로 추가 등록한다.
delFunc += new DelegateFunction(Function3);
delFunc -= new DelegateFunction(Function1);// - 연산자로 기존에 등록되어있는 일을 취소한다.
delFunc(2);

현재는 반환형이 void라 적절하지 못한 예지만..
만일, 함수를 여러개 등록한 상태에서 반환 되는 값이 필요하다 하면 가장 마지막으로 등록된 함수의 return 값이 받아져 온다는 것을 염두해 두자.

Invoke, BeginInvoke, EndInvoke와 비동기 실행.

Event

Event라는 것은 그러면 무엇일까?
많은 자료들은 delegate과 event의 차이점을 Field이냐 Property냐 로서 구분한다.

햇갈리기 전에 짚고 넘어가야겠다... 일반 수준으로 보면 두개는 기능의 차이가 거의 없다.......(물론 내가 프로그램을 깊에 안짜봐서 일지도 모르지만..)

event라는 것이 한개의 대리자의 그릇(?)으로써 행동하기 때문이다.

C#에서 Property는 멤버 변수같지만 실제로는 함수로써 작동하는 놈들을 뜻한다.  

class TimePeriod
{
    private double seconds;

    public double Hours
    {
        get { return seconds / 3600; }
        set { seconds = value * 3600; }
    }
}


class Program
{
    static void Main()
    {
        TimePeriod t = new TimePeriod();

        // Assigning the Hours property causes the 'set' accessor to be called.
        t.Hours = 24;

        // Evaluating the Hours property causes the 'get' accessor to be called.
        System.Console.WriteLine("Time in hours: " + t.Hours);
    }
}

위의 코드를 보면 Hours라는 Property는 내부적으로 get set을 선언해 주는데 이를 컴파일하면
get_Hours, set_Hours와 같이 자동적으로 변환되고, 
우리가 Hours를 호출하는 부분에 get_Hours 혹은 set_Hours중 하나의 함수가 불린다고 한다.(여러 사람이 그렇데요)

이렇게 보면 Property는 Field에 속한것이 아닌 멤버 함수에 속하기 때문에 
Interface에서 선언이 가능해진다.

참고로 선언된 event 는 외부에서 Event()와 같이 못쓰기 때문에, 해당 이벤트를 가지고 있는 클래스가 사용해야 한다.

밑에 코드를 참고하자.

public class EventTEst : MonoBehaviour {
	CustomEvent ev;	
	
	void Awake(){
		ev = new CustomEvent();
		ev.myEvent += new CustomEvent.CustomEventDelegate(e_myEvent);
		ev.myEvent += new CustomEvent.CustomEventDelegate(e_MyEvent2);		
	}
	
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.anyKeyDown){
			ev.ActivateEvent("ASDASD",2);//키 입력이 발생하면 특정 함수 실행.	
		}
	}
	
	void e_myEvent(string s)		
	{
		//approach to sender's field and we can manipulate.
		print("DUDE: " + "   " + s);
	}
	
	void e_MyEvent2(string s){
		print("IM EVENT 2");
	}
}

public class CustomEvent
{
	public delegate void CustomEventDelegate(string s);
	public event CustomEventDelegate myEvent;
		
	public void ActivateEvent(string s)
	{		
		myEvent(s);//이벤트 실행 -> myEvent에 등록된 함수들이 s라는 변수를 가지고 실행. 외부에서 실행 못함.
	}                                    
}


참조 자료들
1. http://scripter.egloos.com/2256741
2. http://www.switchonthecode.com/tutorials/csharp-snippet-tutorial-custom-event-handlers
3. http://csharpindepth.com/Articles/Chapter2/Events.aspx
4. Delgate 와 Event의 차이점 - http://www.gpgstudy.com/forum/viewtopic.php?topic=18988

'프로그래밍' 카테고리의 다른 글

볼만한 슬라이드들  (0) 2012.10.25
VTF 관련 글.  (0) 2012.10.25
C# Delegate  (0) 2012.10.17
C# Delegate  (0) 2012.10.16
TCP / UDP  (0) 2012.10.16
AND

'프로그래밍' 카테고리의 다른 글

VTF 관련 글.  (0) 2012.10.25
[Unity] C# Delegate 그리고 Event  (3) 2012.10.23
C# Delegate  (0) 2012.10.16
TCP / UDP  (0) 2012.10.16
문자 출력하기 구현.  (1) 2012.10.11
AND

+= 연산자로 작동 할 함수를 여러개 설정 가능.

-= 연산자로 작동에서 제외할 함수 설정 가능...

신기방기.

'프로그래밍' 카테고리의 다른 글

[Unity] C# Delegate 그리고 Event  (3) 2012.10.23
C# Delegate  (0) 2012.10.17
TCP / UDP  (0) 2012.10.16
문자 출력하기 구현.  (1) 2012.10.11
RTTI에 대한 글.  (1) 2012.07.20
AND

TCP - 신뢰 가능, 지속적인 연결 확인을 통한 통신. 보내는 패킷마다 추가적은 확인 데이터인 ACK가 붙어서 가기 때문에, 너무 빈번한 통신이 성능저하를 가져옴.

UDP - 신뢰 불가, 일방적으로 메세지를 보내기 때문에 속도가 빠르다. 내 주소와 받을사람의 주소를 입력하여 내용물을 첨부하여 보내기 때문에 추가적인 확인과정이 불가능하지만(상대방이 받았나의 여부) 속도는 빠르다.

'프로그래밍' 카테고리의 다른 글

C# Delegate  (0) 2012.10.17
C# Delegate  (0) 2012.10.16
문자 출력하기 구현.  (1) 2012.10.11
RTTI에 대한 글.  (1) 2012.07.20
DX 우리에게 그려지기까지...  (1) 2012.07.05
AND

ARTICLE CATEGORY

목록들 (118)
[Unity3D] (39)
그래픽관련 (13)
잉여잉여 (25)
프로그래밍 (27)
노래♬ (3)
Game_Design(기획) (3)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2024/05   »
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

ARCHIVE