2009-06-29 6 views
2

Im은 Zune의 특정 그림 앨범에서 그림을 표시하는 XNA 프로그램을 작성합니다. 문제는 앨범의 모든 그림에서 텍스처를로드하면 프로그램이 메모리가 부족한 경우입니다. 내가 하나씩 로딩을 시도하고 사용자가 다음 그림으로 이동하면 이전 그림 텍스처에 Dispose를 호출합니다. 이것은 작동하지만 그때 나는 사용자가 프로그램을 다시 시작하지 않고도 과거의 그림을 볼 수 없도록 삭제되면 이전 그림에서 텍스처를 되 찾을 수 없습니다!메모리가 부족한 상태에서 Zune XNA에서 사진을로드하는 방법은 무엇입니까?

+0

동일한 논리를 사용하여 왜 다시로드하지 않는 것이 좋습니까? – GalacticCowboy

+0

음 그림 모음집에는 그림을 모두 가져와야하므로 그림을 순서대로 정렬해야 사용자에게 보여줄 수 있습니다. 사용자가 과거 단추를 눌러 과거 사진을 볼 때마다이 작업을 수행하는 것이 좋습니다. 확실히 더 나은 해결책이 있습니까? – anonymous

답변

1

앨범의 항목 당 텍스처 핸들을 저장하지 마십시오. 대신 사용자가 앨범을 탐색 할 때 필요한대로 처 리하고로드하는 단일 프로그램 수준 핸들을 사용하십시오.

+0

그래, 뭐하는거야. 나는 언제나 하나의 그림 텍스처를 참조하는 텍스처 핸들이 하나 밖에 없다. 그러나 그림에서 텍스처에 액세스하면 다른 텍스처를 핸들에 할당하더라도 텍스처가 사라지지 않습니다. 어딘가에 캐싱 된 것 같습니다. 텍스처에 Dispose를 호출하면 그림에서 텍스처를 다시 가져올 수 없습니다. 그것은 GetTexture를 호출 할 때마다 null을 반환합니다. – anonymous

+0

몇 가지 코드를 게시 할 수 있습니까? 텍스처에 문제가 있습니까? 나는. 다음 파일을로드 할 때 파일 잠금을 지우지 않고 이전 파일을 다시로드하지 못하도록합니까? – GalacticCowboy

+0

Thx가 너무 유용합니다! 사진을 XNA 프로젝트에 첨부해야하고 XNB 파일로 함께 컴파일해야하므로 실제로 코드를 변경했습니다. 이제 ContentManagers를 사용하여 사진을로드하거나 언로드 할 수 있기 때문에 작동합니다. 그러나 그림을 추가, 제거 또는 변경해야 할 경우 전체 프로그램을 다시 컴파일하고 배포해야하기 때문에 이것은 좋은 해결책이 아닙니다! 지금은 시간이 없지만 주말에는 문제를 재현하고 코드를 게시하는 작은 프로그램을 작성합니다. – anonymous

0

모든 데이터 처리를 한 번하고 파일 이름을 저장하면 모든 계층 구조/정렬을 한 번만 수행하면됩니다. 그런 다음 원하는 때에 사진을로드하십시오 (정확하게 이전 게시물이 제안한 것).

Content.Load (string)가 텍스처를로드하지만 텍스처에 대한 모든 포인터가 손실되는 경우 ContentManager는 메모리에 텍스처를 유지하므로 다시로드하면 즉시로드됩니다. . 이러한 캐시 아이템을 드롭하는 방법 Content.Unload()가있다, 참조 :

이 주제에 대한 포럼 토론 :
http://forums.xna.com/forums/p/25978/141761.aspx
숀 하그리브스는 설명 :
http://blogs.msdn.com/shawnhar/archive/2006/09/06/743437.aspx

방법 I을 이 기능은 그림을 사용하지 않을 때마다 언로드를 호출하거나 빠른 로딩을 원할 경우 구현됩니다 (사용자가 그림을 변경하는 빈도에 따라 다름). 나쁜 생각) 메모리 예외를 잡으려고 시도하고 언로드 만 호출 en.

+0

도움을 요청한 Thx! 네, 각 텍스쳐마다 별도의 ContentManager를 사용합니다. 그렇게해야만 언로드 할 수 있습니다. 그러나 Zune Picture API는 ContentManager를 사용하거나 노출하지 않아서로드 및 언로드를 제어 할 수 없습니다. GetTexture라는 메서드가 하나뿐입니다. 그것은 일반적인 Content.Load 패턴을 사용하지 않습니다! 그것이 내가 너무 좌절 한 이유입니다! :-( – anonymous

+0

아, 나는 그것이 zune에서 상당히 달랐다는 것을 깨닫지 못했습니다.MSDN을 약간 읽으면 (그림은 완전한 추측입니다.) 그림 (텍스처가 아니라 GetTexture라고하는 그림)에서 처리를 호출 할 수 있고 그림이 사용하는 모든 관리되지 않는 리소스가 해제되어야합니다. 그 질감) – Martin

관련 문제