2011-09-06 5 views
3

XNA에서 런타임에 텍스처 및 기타 콘텐츠 파일을 업데이트하는 방법을 찾고 있습니다. 예를 들어, 응용 프로그램 외부에서 수정 된 경우 텍스처가 다시 ​​포커스 될 때 게임에서 자동으로 업데이트됩니다.XNA에서 실시간 리소스 업데이트

이것은 Texture2D에서 가능하며 스트림에서로드하는 것 같지만 주어진 리소스에 대한 직접 경로를 가져올 수 없습니다.

이 기능은 콘텐츠 파이프 라인 및 .xnb와 함께 작동하지 않지만 디버깅 및 개발 목적으로는 매우 유용하다는 것을 알고 있습니다.

XNA를 사용하여 성공적으로 구현 된 사람이 있습니까?

+0

아직 찾고 계신지 확실하지 않지만 현재있는 경우 대부분의 경우 작동하는 맞춤형 솔루션이 제공됩니다. – roundcrisis

답변

1

먼저 푸시 또는 풀 모델을 채택할지 여부를 결정해야합니다. 푸시 모델에서 자산을 변경 한 응용 프로그램/환경은 자산이 변경되어 다시로드해야한다는 것을 실행중인 게임에 어떻게 든 알릴 필요가 있습니다. 이는 매우 간단한 메시지 대기열을 사용하여 수행 할 수 있습니다.

풀 모델에서 게임은 주기적으로 모든 게임 애셋을 확인하여 수정되었는지 확인한 다음 수정 된 경우 다시로드합니다. 덜 효과적이라면 이것은 더 간단합니다.

더 큰 관심사는 앱이 실행되는 동안 게임에서 정상적으로 애셋을 다시로드 할 수 있는지 여부입니다. 아마도 자산을로드 한 다음 백그라운드에서 백그라운드 스레드를 구현 한 다음 게임에서 "라이브"자산으로 "스왑"해야 할 것입니다. 또는 자산을 다시로드 할 때마다 게임이 일시 중지 될 수 있습니다. 두 경우 모두 콘텐츠 파이프 라인이 현재 작동하는 방식 (백그라운드 로더 스레드 등)에 따라 프로세스의 가장 복잡한 부분이 될 수 있습니다 (배경 로더 스레드 등이 이미있을 수 있습니다).

EDIT :

당신은 내가 어떻게 자산 이름에서 파일 확장자를 알고, 다음 문제가있을 것 같아요 이제이 방법 :

static public String FullContentDirectory(this ContentManager content) 
{ 
    var appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 

    return System.IO.Path.Combine(appPath, content.RootDirectory); 
} 

를 사용하여 콘텐츠 폴더의 전체 경로를 얻을 수 있나요? 또는 저작물 이름이 파일 이름과 다른 경우 어떻게해야합니까?

+0

현재 창에 대해 focusgained 이벤트를 구독 중이며 단순히 업데이트하려는 애셋이 마지막로드 이후 파일이 수정되었는지 확인하기 위해 경로를 확인해야합니다. 유일한 어려움은 스트림을 열지 못하게하는 xna의 주어진 리소스에 대한 전체 시스템 경로에 액세스 할 수 없다는 것입니다. – GuyNoir

+0

어떻게 전체 시스템 경로에 액세스 할 수 없다는 것을 의미합니까? 오류가 있습니까? – MattDavey

+0

XNA는 작업 디렉터리를 기준으로 파일 이름 만 가진 경로를 사용하여 콘텐츠를 저장하고로드합니다. 그러나 xna 4.0을 사용하여이 디렉토리 경로에 액세스하는 방법을 찾지 못했습니다. – GuyNoir

관련 문제