멍멍이네 블로그

프로파일러로 돌렸을 경우 GC.--- 에서 오래 걸리더라구요..
지금 확인하고 검색돌려보니 가비지컬렉션이라더라구요..
= new 를 많이써서.. 가비지 컬렉션이 많이 쌓여서 끊김이나 툭툭 튀는데요..
이거 없애기위해서 중간중간 정리를 해줘야되는데
언제.. 어디에서.. 어떻게 정리해야될지..
처음 사용하는 부분이라서.. 간단하게나마 조언을 얻고자 합니다 ㅜㅜ

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

[답변]

http://www.unitystudy.net/bbs/board.php?bo_table=dustin&wr_id=55 참고 하셔도 좋을 것 같습니다^^
유니티 스터디 펌~~

처음 앱 실행하면 다른 앱처럼 리소스를 처음 읽어오고싶은데 잘 모르겠네요 ㅜㅜ
asset[0] = AssetDatabase.LoadMainAssetAtPath("Assets/Resources");
BuildPipeline.BuildAssetBundle(asset[0], null, "Resources.unity3d", options);
해서 Assets폴더 안에 Resources 폴더를 Resources.unity3d로 Asset을 만들고 그걸 불러와서 쓰고싶은데...
저렇게 썻는데
1kb밖에 안되네요 ;;
 

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

[답변]

안드로이드
BuildPipeline.BuildAssetBundle(Selection.activeObject, 오브젝트배열, 배포파일 Path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android);

1. 로고 화면 띄운다.

 

2. 회원가입을 한다.

회원가입시 유니크코드를 준다. 그 유니크코드를 기준으로 서버에서 DB를 호출할생각.

회원가입시 유니크코드에 관련해서 AssetBundle을 각각 다르게 준다(Resource와 각 유저 고유의 AssetBundle.. 두개를 가진다)

 

3. 로그인을 한다.

로그인 시 로그인 데이터 중 유니크코드를 가져와서 AssetBundle이 있는지 체크(Resource와 유저 고유의 AssetBundle을 체크)한 후 Load한다.

 

4. Loading화면을 띄운다.

로그인에 성공 시 로딩화면을 띄우면서 AssetBundle을 호출해서 로드한다.

 

5. 메인 Scene 띄우기.(진행)

 고유 AssetBundle을 Instantiate하고, 데이터 연동 후 화면에 출력한다.

 

6. 시작 전(플레이 전)

아이템을 사거나 할 경우 서버에 비동기로 연동시켜서 값을 저장,

 

7. 게임시작 후(플레이 후)

시작시 아이템 체크(자동사용 아이템 감소, 사용가능아이템 체크 등) 후 로딩

로딩이 끝나고 나서 게임 플레이.

 

8. 게임 끝

게임이 끝나고 나서 게임 정보를 보내줌(획득 돈, 경험치 등) -> 5번으로 되돌아간다.

 

9. 종료

고유 AssetBundle만 저장

Destroy와 DestroyImmediate는 오브젝트 삭제할때 사용됨.

 

Destroy - Actual object destruction is always delayed until after the current Update loop, but will always be done before rendering.(Unity3D Reference 참조) / UpdateLoop가 끝난 후 삭제됨.

 

DestroyImmediate - 바로 삭제됨.

http://cafe.naver.com/unityhub/3410      << 글 삭제됨 ㅜㅜ

http://hyunity3d.tistory.com/195

 

MemoryPool을 이용해서 사용하자!

 

오브젝트를 일반적으로 생성 - 삭제를 반복할 경우 Memory 사용량이 많아지기 때문에 MemoryPool을 이용하여 최소한의 오브젝트를 생성해놓고 사용하고 비활성화 되도록 사용하면 부담이 적어진다(불필요할만큼 많이 만들면 손해!)

 

MemoryPool - 메모리 공간을 미리 할당하고, 호출하게 되면 미리 할당된 공간을 반환하여 사용함

코루틴(Coroutine)이 뭔가요?

C 언어등에서 일반적으로 사용하는 함수는 시작할 때 진입하는 지점이 하나 존재하고 함수가 모두 실행되거나, return 구문에 의해서 종료되는 지점을 설정할 수 있습니다. 이러한 함수를 서브루틴(Subroutine)이라 부르는데, 코루틴은 이를 더 일반화한 개념으로 진입하는 지점까지 여러 개를 가질 수 있는 함수를 의미합니다. 개념적으로만 본다면 서브루틴도 코루틴의 한 종류라고 볼 수 있겠지요.

 

Coroutine 선언

IEnumerator 함수이름(){

}

void Start(){

  StartCoroutine("함수이름");

  //StartCoroutine(함수이름());

}


 

코루틴용 데이터

엔진이 수행하는 기능

yield return null

다음 프레임까지 대기

yield return new WaitForSeconds(float)

지정된 초 만큼 대기

yield return new WaitForFixedUpdate()

다음 물리 프레임까지 대기

yield return new WaitForEndOfFrame()

모든 렌더링작업이 끝날 때까지 대기

yield return StartCoRoutine(string)

다른 코루틴이 끝날 때까지 대기

yield return new WWW(string)

웹 통신 작업이 끝날 때까지 대기

yield return new AsyncOperation

비동기 작업이 끝날 때까지 대기 ( 씬로딩 )

 

일반 메소드처럼 사용 할 수 있지만, Update()와 적절히 섞어서 쓰면 프로그램 성능을 높일 수 있다.

void Update(){

  time += Time.deltaTime;

  if(time > 3)

    // 할일

}

// 성능에 따라서 3초간 수십번을 호출을 하고 if문에서 체크를 한다.

 

void Start(){

  StartCoroutine("TimeCheck");

}

IEnumerator TimeCheck(){

  yield return new WaitForSeconds(3f);

  //할일

}

// 1번 호출 후 yield return new WaitForSeconds(3f);에 의해 3초간 대기 후 할일을 한다.

 

내가 생각하는 주로 하는 역활

Update() : 지속적이며 불규칙한 호출이 필요한 경우

Coroutine() : 일정 규칙적으로 호출이 필요한 경우

 

Tip.

StartCoroutine의 사용방법은

1. StartCoroutine( " MethodName " );

2. StartCoroutine( MethodName() );

이 있는데, 1번과 같이 사용할 경우 다른 위치에서 StopCoroutine( " MethodName " ); 으로 Stop이 가능함.

 

참조 사이트 : http://www.unitystudy.net/bbs/board.php?bo_table=writings&wr_id=43