3

각 장면의 시작 부분에서 다음 "제거"메서드를 호출하는 것이 좋습니다. 그리고 언제 전화해야합니까? 각 통화를 언제 사용하는지 설명하는 데 필요한 자습서가 있습니까? 내가 놓친 게 있니?Cocos2d 2.0 : 캐시를 "제거"하는 것이 좋은 습관입니까?

[CCTextureCache purgeSharedTextureCache]; 
    [CCSpriteFrameCache purgeSharedSpriteFrameCache]; 
    [CCAnimationCache purgeSharedAnimationCache]; 
    [CCShaderCache purgeSharedShaderCache]; 
    [[CCFileUtils sharedFileUtils] purgeCachedEntries]; 

(나는적인 Cocos2D 2.0을 사용하고 있고 ARC가 활성화되어, 그것이 관련되어 있다고 생각하지만, 여전히 그 언급 할 가치라고 생각하지 않습니다)

답변

5

IMO 전혀적인 Cocos2D의 캐시를 제거하는 나쁜 관행입니다! 퍼지 캐시는 해머가 전자 장치를 수리하는 데 유용한 도구입니다.

다음 프레임에서 캐릭터가 제거 된 애니메이션과 텍스처를 다시로드하기 위해서만 모든 것을 제거하는 것이 반발력입니다. 무조건 캐시를 제거하면 자산 관리 작업 (잘)을 수행하지 않은 것입니다.

여전히있을 수 있습니다 사용하는 모든 것을 제거 할 수 있지만 (A UIKit 응용 프로그램에서 완전히적인 Cocos2D 종료 등) 극소수해야한다 - 왜 당신이 이제까지 캐시 된 자원의 모든 을 제거 할 것이기 때문? 당신은 당신이 추가 한 것을 제거하고, 그것이 충분하지 않다면, 당신은 할 수있는 한 많이 해냈습니다.

앱 개발자는 앱의 총 메모리 사용량과 사용중인 애셋 및 사용되지 않은 애셋을 알고 있어야합니다. cocos2d가 처리하는 리소스를 포함합니다. 현재 사용 중이 아니며 가까운 장래에 필요하지 않은 자산 만 릴리스하십시오. 정말 간단합니다. 그러나 단순히 캐시를 제거하는 것보다 더 많은 작업을 수행합니다. 작업을 수행하는 것처럼 보이지만 실제로는 끔찍한 일입니다.

메모리 경고 중 특히 캐시를 제거 할 때의 한 가지 문제점은 현재 자산을 미리로드 할 때 메모리 경고가 발생할 수 있다는 것입니다. 이제 애셋을로드하는 동안 캐시를 제거하면 이미 미리로드 된 애셋이 제거 된 다음 필요에 따라 다시로드해야하기 때문에 자신을 촬영 중입니다. 최악의 경우, 처음에 자산을로드하는 데 필요한 추가 메모리로 인해 즉석에서 리로드가 발생하면 복구 할 수없는 메모리 경고가 발생할 수 있습니다 (즉, 텍스처는 단기간 동안로드하는 동안 2x 메모리를 사용합니다!).

대부분의 경우 퍼지 캐시는 메모리 경고 관련 종료를 지연시키고 그 동안 게임에 지연을 추가합니다. 나머지 경우에는 게임이 더듬 거리는 것처럼 나쁜 경험을하기 만하면 오랜 기간 동안 복구 할 수 있습니다.

Cocos2D는 메모리 경고 중 캐시를 제거하기위한 수단으로 만 사용되며 주로 메모리 사용과 같은 넌센스에 신경 쓰지 않는 개발자를 대상으로합니다. 처음 몇 가지 앱 개발 단계를 수행하는 데 적합한 솔루션이지만 개발자의 첫 번째 앱을위한 솔루션 일 수도 있지만 심각한/야심있는 노력을하는 데는 거의 쓸모가 없습니다.

품질에 대한 관심이있는 야심 찬 앱 개발자는 메모리 경고에보다 효과적으로 대응해야합니다. 모두 메모리 경고를 최소화하기 위해 열심히 맨 먼저 일 (here are some tips)을 의미하고이 발생 할 때, 당신은 두 가지로 확인해야합니다

    앱이 곧 종료 될 수
  1. - 응용 프로그램의의를 저장해야합니다을 상태.
  2. 이 시점에서 절대적으로 필요하지 않은 메모리를 해제합니다.

# 2 : 가장자리 가까이에서 프로그래밍하는 경우 일부 메모리 안전 모드로 되돌아 가서 응용 프로그램의 메모리 사용량을 모두 줄이는 것이 좋습니다 스프라이트, 파티클, 두 텍스처의 결합, 추가 로딩 시간을 희생시키면서 특정 텍스처 제거 등등.

# 2 단계에서 충분한 메모리를 확보 할 수 없다면 # 1은 거의 필연적으로 발생합니다 cocos2d의 캐시를 제거할지 여부를 결정합니다. CCTextureCache의 "사용되지 않는"텍스처를 제거하면 스프라이트 프레임이 텍스처를 유지하므로 먼저 해당 스프라이트 프레임을 해제하지 않고 텍스처 아트 레이어를 사용하는 경우 텍스처를 유지하지 않아도됩니다. 그것을 명심하십시오.

  1. 자산을 사용 무엇인지, 단순히 로딩 시간을 줄이기 위해 캐시되는 :

    따라서 메모리 경고를 처리하기위한 과정입니다.

  2. "현재 필요하지 않은"스프라이트 프레임을 제거한 다음 CCTextureCache의 removeUnusedTextures를 호출하십시오. 이것은 앱이 사용하고있는 대부분의 메모리를 공개 할 수있는 가장 좋은 기회입니다.
  3. 코드에 할당되었지만 현재 사용 중이 아닌 다른 메모리를 제거하십시오. 그렇지 않으면 "메모리 안전"모드로 전환됩니다.
  4. 최고가 되길 바랍니다.

cocos2d의 캐시를 무조건적으로 제거하지 마십시오! 그것은 도움이되지 않습니다. 아마도 상황이 악화 될 것입니다.

모든 cocos2d 캐시를 고려하면 99 %의 메모리가 CCTextureCache에 보관됩니다. 어쨌든 다른 캐시를 제거하는 것은 거의 무의미합니다. 무시하십시오.

현재 사용하고있는 텍스처 아트라스와 스프라이트 프레임과 텍스처를 제거하지 않은 것만 보시면됩니다.

처음에는 .pvr.ccz 텍스처를 사용하는 경우 "로드 시간을 줄이기 위해 캐싱"을 무시하고 사용을 중지 할 때마다 모든 텍스처지도를 메모리에서 제거 할 수도 있습니다. 왜냐하면 .pvr.ccz가로드하기 때문에 빨리 장면 전환과 관련하여 간신히 차이를 만듭니다. 이것은 또한 메모리 경고를 피하는 데 도움이됩니다.

+2

많은 정보를 얻으셔서 반갑습니다. 그러나이 답변은 나를위한 TLDR입니다. 1) 무조건 cocos2d 캐시를 제거하면 자산을 다시로드 할 때 지연이 발생할 수 있습니다. 2) 다른 캐시를 제거하는 경우 CCTextureCache를 제거해야합니다. – user1021430

+0

요약을 보내 주셔서 감사 드리며 동시에 TLDR의 의미를 찾아야했습니다.) TSDK (너무 짧다, 몰랐다.) – LearnCocos2D

+0

하하, 이제 StackOverflow에서 다른 사람들의 답변을 격추시킬 수 있습니다. P 저는 cocos2d 관련 메모리 관리를 통해이 해답을 찾았습니다. 일반적으로, 내 기억 공간을 적게 유지하는 것은 텍스처 캐시의 해당 스프라이트 시트에 대한 removeTexture뿐만 아니라 스프라이트 프레임 캐시에서 removeSpriteFramesFromFile을 호출해야한다는 것을 알게됩니다. 나는 전형적으로 장면 전환시 이것을한다. 캐시를 무조건적으로 비우기는하지만 앱의 애니메이션 세트를 열었을 때만 특수한 경우에만 해당 스프라이트는 나중에 다시 사용되지 않습니다. – user1021430