Обновление ресурсов в реальном времени в XNA - PullRequest
3 голосов
/ 06 сентября 2011

Я ищу способ обновления текстур и других файлов содержимого во время выполнения в XNA, чтобы, если он был изменен вне приложения, он автоматически обновлялся в игре при восстановлении фокуса.

Это представляется возможным с Texture2D и загрузкой из потока, но я не могу получить прямой путь к данному ресурсу.

Я понимаю, что это не будет работать с конвейером контента и .xnb, но для целей отладки и разработки это было бы чрезвычайно полезно.

Кто-нибудь видел что-то подобное, успешно реализованное сXNA?

1 Ответ

1 голос
/ 06 сентября 2011

Прежде всего вам нужно решить, принять ли модель двухтактного или двухтактного. В принудительной модели приложение / среда, которые изменили актив, должны будут каким-то образом уведомить запущенную игру о том, что актив изменился и его необходимо перезагрузить. Это можно сделать с помощью очень простой очереди сообщений.

В модели вытягивания игра периодически проверяет все игровые активы, чтобы увидеть, были ли они изменены, и, если они есть, перезагрузить их. Это было бы более простым, но менее эффективным решением.

Еще большее беспокойство вызывает то, сможет ли ваша игра корректно обрабатывать повторную загрузку ресурсов во время работы приложения. Возможно, вам потребуется реализовать некоторый фоновый поток, который загружает ресурсы, а затем «обменивает» их на «живые» ресурсы в игре. Кроме того, ваша игра может ненадолго останавливаться при каждой перезагрузке ресурса. В любом случае это может легко оказаться самой сложной частью процесса, в зависимости от того, как работает ваш конвейер контента (у вас уже может быть фоновый загрузчик и т. Д.).

РЕДАКТИРОВАТЬ в ответ на комментарий:

Вы можете получить полный путь к папке с содержимым, используя этот метод:)

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);
}

Теперь, я думаю, что ваша следующая проблема может быть, как вы узнаете расширение файла по названию ресурса? Или что, если имя ресурса отличается от имени файла?

...