何时加载纹理?

3

我目前正在开发几个Windows Phone项目(虽然这个问题也适用于iPhone/Android),这让我想到了一个问题:什么时候从内容管理器中加载纹理最好。

起初,我从我的游戏基类中加载所有纹理,并根据需要传递它们。但很快我就厌倦了这种做法,于是我创建了一个小型资源管理器类,将其分配给任何需要它的东西。

所以我认为,也许最好在一个类需要时实际加载纹理,然后将其分配给一个变量,这样当我再次需要它时,它就已经准备好了... 这是处理加载资源的最佳方式(效率高?速度快?)吗?如果不是,你会如何建议我处理呢?

1个回答

7
不要创建任何类型的“资源管理器”类。只需传递XNA的ContentManager类(从Game.Content获取的实例)即可。
默认的内容管理器将自动处理重用已加载的对象。因此,您可以从多个位置调用Content.Load<Texture2D>("something"),并且始终会得到相同的纹理实例。
因此,如果您有一堆用于游戏对象的类,并具有将每个类分配给一个Update和一个Draw方法的标准设计,以便从Game中的相应方法调用它们 - 只需向这些类添加另一个方法:LoadContent,该方法接受一个ContentManager参数。
您可以从游戏的LoadContent方法中调用该方法。
如果以后想要实现某种延迟加载内容的系统(例如:在更改级别时加载内容),还可以从游戏类的Update方法调用游戏类的LoadContent方法(但请记住,加载内容很慢 - 因此您可能需要显示“加载”屏幕)。
卸载内容稍微麻烦一点。您必须卸载自己创建的任何内容。但是,从ContentManager加载的任何内容(因为实例是共享的)应该由该内容管理器卸载(Game将在需要时处理卸载其Content成员)。您可能会发现这篇博客文章值得一读。

将contentManager类传递是否比调用GameState.Instance.LoadTexture2D("Texture")更好? - Tim
我认为GameState是一个单例模式吗?虽然这不是太糟糕,但从长期来看,我发现传递ContentManager更加灵活。此外,如果你想走这条路,我甚至不会费心处理单例模式——只需将其设置为“public static”,并在你的Game类中进行初始化管理即可。(这是我的游戏开发答案——正规软件工程答案就是:“是的!”) - Andrew Russell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接