首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于SDL纹理的内存高效ResourceManager

用于SDL纹理的内存高效ResourceManager
EN

Stack Overflow用户
提问于 2013-10-03 19:20:03
回答 2查看 2.2K关注 0票数 0

我正在C++11中使用几个C++11示例,并且正在为我的游戏构建一个ResourceManager。这个类将负责管理所有资源(加载、卸载、呈现等)。在我看来,它是这样运作的:

代码语言:javascript
复制
ResourceManager manager = ResourceManager();
manager.addSprite("player", "sprites/player.png");
manager.addAudio("background", "music/song.mp3");

Sprite player = manager.get("player");
player.render(0, 0);

Audio background = manager.get("background");
background.play();

我计划将资源存储在ResourceManager类中的一个数组中。这是个好做法吗?是否有更好的使用SDL资源的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-03 19:32:55

做这件事有多种不同的方法。您应该考虑使用某种类型的哈希表,将键(字符串名称)与对象关联起来。而不是管理器,它更像是一个定位器,因为管理器意味着它控制对象的生存期。研究XNA的ContentManager如何工作在一个非常好的资源管理API的例子中。这显然是C#,但是API非常干净和友好。

因此,我的建议是,对于基本资源位置,您应该使用无序映射。如果您想要添加更多的功能,例如生命周期管理或内容加载,您可以包装它。

根据您的示例,可以包装散列集并添加您自己的模板加载方法,其工作方式如下:

代码语言:javascript
复制
template <typename Type>
Type* ResourceManager::Load( char* name, char* filePath )
{
    Type* t = new Type( );
    t->Initialize( name, filePath ); // this implies that anything
                                     // to be added to your manager
                                     // will be required to have an Initialize
                                     // method with this signature.
    _resources[ name ] = t; // _resources is your hash_map<char*, void*>;

    return t;
}

这显然是资源管理的一个粗略的例子,但是对于这个主题还有很多需要学习的地方。我建议阅读一般的数据结构(如链接列表二叉树),然后研究工厂辛格尔顿构建器等设计模式。这些只是起点,但足以为这类事情指明正确的方向。祝好运!

票数 2
EN

Stack Overflow用户

发布于 2013-10-03 19:48:18

在实现细节上,不,避免数组。STL有合适的容器,这些容器的使用效率和安全性都很高。特别是,mapunordered_map将精确地完成名称和资源之间的映射。

关于一般设计,我强烈建议您了解现有框架的功能。食人魔3D有一个为游戏量身定制的资源管理类的很好的实现。特别是,它包括预加载资源的能力,这样您就不会在按需加载资源时慢下来。您还可以指定“内存预算”,这样资源就可以自动卸载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19167486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档