2010-10-08 61 views
3

我目前正在研究几个windows手机项目(虽然这个问题也可能适合iphone/android),它让我想到了什么时候是从内容管理器加载纹理的最佳时机。什么时候加载纹理?

起初,我是从我的游戏基类中加载它们,然后根据需要传递它们。我很快厌倦了这一点,我创建了一个小型资源管理器课程,我将其分发给任何需要它的东西。

所以我想,也许这是最好的,我实际上加载纹理,当一个类需要它,然后将其分配给一个变量,所以当我再次需要它 - 这将是所有准备去...这是处理加载资源的最好方法(高效?,最快?)?如果没有,你会如何推荐我去做呢?

回答

7

不要创建任何类型的“资源管理器”类。只需通过XNA ContentManager类(您从Game.Content获得的实例)。

默认的内容管理器会自动为您处理重用加载的对象。所以你可以从多个地方Content.Load<Texture2D>("something"),你总是会得到相同的纹理实例。

所以,如果你有一堆类的游戏对象,用给每个的Update标准设计和Draw方法,你从Game各自的方法调用 - 只需添加另一种方法:LoadContent这些类,接受ContentManager的参数。

您可以从游戏的LoadContent方法调用该方法。如果您以后希望实现某种延迟加载系统(例如:在更改关卡时加载内容),您还可以从游戏的Update方法中调用您的游戏类的方法(但保留记住加载内容很慢 - 所以你可能想抛出一个“加载”屏幕)。

卸载内容有点棘手。你自己创造的任何东西都必须卸载。但是从ContentManager加载的任何内容(因为实例已共享)只能由该内容管理器卸载(Game将在需要时处理其卸载Content成员)。您可能会发现this blog post值得阅读。

+0

传递contentManager类会比调用GameState.Instance.LoadTexture2D(“Texture”)更好吗? – Tim 2010-10-09 00:12:42

+0

我在想GameState是单身吗?它不是*糟糕的*,但我发现传递一个ContentManager在长期内更加灵活。此外,我甚至不会打扰单身 - 如果你想要走这条路线 - 只需将其设置为“public static”,并在Game类中进行初始化。 (这是我的游戏开发答案 - 正确的软件工程答案很简单:“是!”) – 2010-10-09 16:06:23