2011-08-14 6 views
1

메모리 및 가비지 수집과 관련하여 스프라이트/영화 클립에서 아이들을 제거하는 가장 효과적인 방법은 무엇입니까?as3에서 DisplayObject에서 하위 항목을 제거하는 가장 효율적인 방법은 무엇입니까? (메모리)

나는 적어도 세 가지 방법을 보았습니다.

간단한 재의 할당은

sprite = new Sprite(); 

널하고 새로운

sprite = null 
sprite = new Sprite(); 

또는 그냥 청소에 대해 배우고 (내가 좋아입니다) 그동안 제거

while(sprite.numChildren > 0){ 
    sprite.removeChildAt(0); 
} 

좋은 메모리 관리, 모든 유효 입력은 감사하겠습니다, 감사합니다.

답변

5

로 removeChild 또는 removeChildAt 실제로는 DisplayList가에서 제거, 메모리에서 스프라이트 또는 다른 DisplayObject를 제거하지 않습니다. 즉, 1000 개의 스프라이트를 만들어 스테이지 (표시 목록)에 추가 한 다음 1000 개의 스프라이트 모두에서 removeChild를 사용하면 메모리에 영원히 존재할 수 있습니다.

메모리에서 제거하려면 모든 참조 객체에서 null로 설정해야합니다.

당신이 정말로 그것을 제거하려면

, 그냥이 일을 그것을 null로 체크 :

  • 클립에 연결된 모든 이벤트 리스너를 제거에서 removeChild 또는 removeChildAt
  • 를 사용하여 DisplayList가에서 제거합니다.
  • 당신이 배열에 대한 참조를 사용하는 경우, 벡터, 사전 또는 기타 객체, 널 (null)
  • 개체를 설정() Array.splice를 = null 또는 사용하여 스플 라이스하도록 설정, 개체에서 제거

EventManagedSprite과 같은 솔루션을 사용하면 EventRemover을 사용하여 개체를 완전히 쉽게 제거 할 수 있습니다. 이것은 또한 더 큰 프로젝트에서 도움이 될 수 있습니다.

스프라이트/오브젝트를 재사용하지만 재활용하려는 경우 휴지통을 사용하려면 오브젝트 풀링을 사용해야합니다. object pooling with AS3에 대한 추가 정보 :

+0

while (sprite.numChildren> 0) { var obj = sprite.getChildAt (0); sprite.removeChild (obj); obj = null; }이 방법이 안전한 대안이 될 수 있습니까? – SimpleRookie

+0

참조가 null로 설정되었지만 표시 목록에서 제거되지 않으면 개체가 가비지 수집됩니까? – Pup

+0

@Pup 아니요, 그들은 더 이상 참조가 없을 때까지 메모리에 보관 될 것입니다. 디스플레이 "목록"도 배열을 사용한다고 가정 할 수 있습니다. –

1

removeChild/removeChildAt는 부모로부터 DisplayObject를 제거합니다. 그것은 여전히 ​​메모리에 남아 있기 때문에 원하는 경우 나중에 추가 할 수 있습니다 (참조가있는 한).

제 경험상, removeChild + null 할당은 DisplayObject를 제거하고 메모리에 저장하는 가장 좋은 방법입니다.

건배,

관련 문제