c++ - 用于 SDL 纹理的内存高效 ResourceManager

标签 c++ c++11 sdl

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

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 资源?

最佳答案

有多种不同的方法可以做到这一点。您应该考虑使用某种哈希表将您的键(字符串名称)与您的对象相关联。这个想法更像是一个定位器,而不是一个管理器,因为管理器意味着它控制着对象的生命周期。调查 XNA 的 ContentManager适用于一个非常好的资源管理 API 示例。很明显,这是 C#,但 API 非常干净和友好。

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

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

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

这显然是资源管理的粗略示例,但总体而言,关于该主题还有很多东西需要学习。我建议阅读一般的数据结构(例如 linked listsbinary trees ),然后研究像 factory 这样的设计模式。 , singleton , 和 builder .这些只是起点,但足以为您指明此类内容的正确方向。祝你好运!

关于c++ - 用于 SDL 纹理的内存高效 ResourceManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19167486/

相关文章:

C++11 - 模板 std::enable_if 和 std::result_of

c++ - 删除 std::vector 中的最后 n 项时是否进行了优化

c++ - 将 SDL 应用程序移植到 iOS

c++ - 如何清除 wxListBox 中的所有选择(使用 wxLB_MULTIPLE)?

c++ -/是否/memmove 使用中间缓冲区?

c++ - C++中的复制构造函数

c++ SDL 一起绘制文本和图形

c++ - 在 C++ 中为 iOS 开发(有/没有 Xcode)

c++ - 从(std::function)输出lambda中的引用传递值?

c++ - 命名空间之前的预期初始化器