XNA中的实时资源更新

我正在寻找一种在运行时在XNA中更新纹理和其他内容文件的方法,这样如果它在应用程序之外被修改,它将在游戏重新获得焦点时自动更新。

这似乎可以使用Texture2D并从Stream加载,但我无法获得给定资源的直接路径。

我意识到这不适用于内容管道和.xnb,但是出于调试和开发目的,它将非常有用。

有没有人看到像XNA这样成功实现的东西?

首先,你们所有人都需要决定是采用推模型还是拉模型。 在推送模型中,更改资产的应用程序/环境将需要以某种方式通知正在运行的游戏资产已更改并需要重新加载。 这可以通过非常简单的消息队列来完成。

在拉模型中,游戏会定期检查所有游戏资产以查看它们是否已被修改,如果有,则重新加载它们。 如果性能较差,这将是一个更简单的解决方案。

一个更大的问题是,在应用程序运行时,您的游戏是否可以优雅地处理重新加载资产。 您可能需要实现某种加载资产的后台线程,然后在游戏中使用“实时”资产“交换”它们。 或者,每次重新加载资产时,您的游戏都会暂停。 在任何一种情况下,这很容易成为流程中最复杂的部分,具体取决于您的内容管道当前的工作方式(您可能已经有后台加载程序线程等)。

编辑回应评论:

您可以使用此方法获取内容文件夹的完全限定路径:)

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

现在,我认为你的下一个问题可能是,你怎么知道资产名称的文件扩展名? 或者,如果资产名称与文件名不同,该怎么办?