2015-01-22 3 views
3

처분 패턴을 구현하는 방법과시기에 대한 조언을 찾고 있습니다.
Dispose() 패턴을 구현하는 방법에 대한 MSDN 문서를 읽었습니다. 말된다. 내 수업에서 그것을 구현했지만 메모리 사용에 차이를 만드는 것 같지 않습니다.클래스에서 Dispose()를 올바르게 구현하는 방법은 무엇입니까?

배경 비트, 2 차원 탑 다운 게임 엔진을 구축 중입니다. 저는 액터 그리기 (Sprite 그리기 및 뷰 평면 추적을위한 기본 클래스)로부터 상속받은 Gatherer라는 단위를 가지고 있으며, 이들은 나가서 일을하는 간단한 스프라이트입니다. 그들은 5 경기 라운드 후에 사라집니다.

나는 이런 식으로 구현 채집을 추적 할 목록을 사용

List<Gatherer> gatherList = new List<Gatherer>(); 

는 그럼 난 게임 엔진 내부에 다음과 같은 목록을 치다 :

public void pruneDeadFollowers() 
{ 
for (int i = gatherList.Count-1; i> -1; i--)    
    { 
     if (gatherList[i].timeToDie) //Bool to check if unit needs to be removed this round. 
     {      
      this.dropActor(gatherList[i]); //Calls method that unsubscribes the object from triggered events. 
      gatherList[i].Dispose(); //Is this needed? 
      gatherList.RemoveAt(i); //Remove from list. 
     } 
    } 
} 

수집기 개체는 매우 간단하다. 대부분 객체를 관리합니다.
Int 필드, List 두 개, Point (Monogame에서), Bool 객체 두 개 및 Static Int가 많이 있습니다. 나는 또한 임의의 r을 가졌다; 런타임에 생성되었지만 Dispose 메서드가없는 것 같습니다. 내가 관리하는 유일한 개체는 2 개의 Texture2D 개체입니다. public Texture2D 광선 텍스처; public Texture2D texImage;

내 처분으로는 텍스처 만 처리해야한다고 생각합니다.
한 가지 문제는 실제로 texImage.Dispose(); 그것은 여전히 ​​살아있는 다른 유닛의 텍스처를 파괴합니다. 대신 Null 텍스처를 만들면 기존 유닛에 영향을주지 않습니다.

나는 이것을 처분한다 : 이것으로 충분합니까? 그렇지 않은 경우 필요에 따라 작동하는지 어떻게 확인할 수 있습니까?

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

// Protected implementation of Dispose pattern. 
protected virtual void Dispose(bool disposing) 
{ 
    if (disposed) 
     return; 

    if (disposing) 
    {       
     glowTexture = null; 
     texImage = null; 
    } 

    disposed = true; 
} 
+0

사이드 노트에서 실제로 객체에 finalizer가 없으면'GC.SuppressFinalize (this); '는 필요 없습니다. 이것은 ~ MyObject() {Dispose (false); }'. 만약 당신이 그것을 구현한다면 (그것은 당신이 따르는 패턴의 전체적인 부분이다.),'if (disposing) {}'부분은 ** 관리되는 ** 자원에서만 수행되어야하고 관리되지 않는 부분에서는 수행되어서는 안된다. 'Dispose()'를 부르는 것을 잊었을 때 finalizer). 관리되지 않는 리소스는 항상 매개 변수를 무시하고 해제해야합니다. – Jcl

+0

'disposing' 매개 변수는 실제로'amIBeingCalledDeterministically'라고해야합니다 :-) – Jcl

답변

4

구현이 유효하지만 실제로 충분하지 않습니다.

Dispose은 발견 한대로 관리되지 않는 리소스를 해제하는 데 사용됩니다. 초기 구현 (텍스처를 사용한 후에 배치 한 경우)은 정확했습니다.

을 제외하면 여러 개의 개체간에 이러한 리소스를 공유하기 때문에 텍스처를 사용하는 개체의 수명을 제어하지 않아도됩니다.

나는 XNA의 패턴을 따를 것이다. 누구든지 콘텐츠를로드하면 언로드해야합니다. 귀하의 경우, 누구든 을 만들면 텍스처 (따라서 자식 개체)가 삭제 될 때 처분해야합니다. 텍스처를 사용하는 자식 객체는 실제로 내가 볼 수있는 것에서 IDisposable을 전혀 구현할 필요가 없습니다.

관련 문제