【问题标题】:Realtime Resource Updating in XNAXNA 中的实时资源更新
【发布时间】:2011-09-12 16:31:16
【问题描述】:

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

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

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

有没有人看到用 XNA 成功实现了类似的东西?

【问题讨论】:

  • 不确定您是否还在寻找这个,但如果您还在寻找,我们有一个在大多数情况下都可以使用的定制解决方案。

标签: c# xna xna-4.0 content-pipeline


【解决方案1】:

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

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

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

编辑回应评论:

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

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

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

【讨论】:

  • 目前我正在订阅窗口的 focusgained 事件,并且只是让我想要更新的资产检查它们的路径以查看自上次加载以来文件是否已被修改。唯一的困难是我无法访问 xna 中给定资源的完整系统路径,这使得打开流变得困难)。
  • 你的意思是你不能访问完整的系统路径?你有错误吗?
  • XNA 使用仅包含相对于工作目录的文件名的路径来存储和加载内容。但是,我还没有找到使用 xna 4.0 访问此目录路径的方法。
  • @Guy 内容管理器中有根目录属性。您可以将其覆盖到您的资源所在的任何目录。完成此操作后,您就知道它们的存储位置,并且可以使用您想要的所有路径代数。
  • 想一想,如果您使用内容管道来加载资产,那么当它们更改时重新加载它们将非常困难,因为修改源资产(例如 .png)不是除非您再次调用内容管道构建过程,否则将更改关联的 .xnb。如果要实现此目的,您可能必须恢复为直接从文件流加载资产...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
相关资源
最近更新 更多