我目前正在做几个windows phone项目(尽管这个问题可能也适合iphone/android),这让我开始思考,什么时候是从内容管理器加载纹理的最佳时机。
一开始,我从我的Game基类加载它们,并根据需要传递它们。我很快就厌倦了这一点,我创建了一个小的资源管理器类,我将它传递给任何需要它的人。
所以我在想,也许最好的做法是,当一个类需要纹理时,我实际加载它,然后将它赋给一个变量,这样当我再次需要它时,它就会准备就绪……这是最好的方法吗(高效?最快?)来处理资源加载?如果没有,你会建议我怎么做呢?
发布于 2010-10-08 12:35:17
不要创建任何类型的“资源管理器”类。只需传递XNA ContentManager类(从Game.Content获得的实例)。
默认的内容管理器将自动为您处理已加载对象的重用。因此,您可以从多个地方Content.Load<Texture2D>("something"),您将始终返回相同的纹理实例。
因此,如果你有一堆游戏对象的类,标准设计是给每个类一个Update和一个Draw方法,你可以从Game中的相应方法调用它们-只需向这些类添加另一个方法:LoadContent,它接受ContentManager的参数。
您可以从游戏的LoadContent方法中调用该方法。
如果您稍后想要实现某种延迟加载的系统(例如:在更改关卡时加载内容),您也可以从游戏的Update方法调用游戏类的LoadContent方法(但请记住,加载内容很慢-因此您可能想要抛出一个“加载”屏幕)。
卸载内容要稍微棘手一些。您自己创建的任何内容都必须卸载。但是,从ContentManager加载的任何内容(因为实例是共享的)应该只由该内容管理器卸载(Game将在需要时处理卸载其Content成员)。你可能会发现this blog post值得一读。
https://stackoverflow.com/questions/3887556
复制相似问题