【问题标题】:Memory-efficient ResourceManager for SDL textures用于 SDL 纹理的高效内存资源管理器
【发布时间】:2013-10-08 17:08:02
【问题描述】:

我正在使用 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 资源?

【问题讨论】:

    标签: c++ c++11 sdl


    【解决方案1】:

    有多种不同的方法可以做到这一点。您应该考虑使用某种将您的键(字符串名称)与您的对象相关联的哈希表。这个想法更多的是定位器,而不是管理器,因为管理器意味着它控制对象的生命周期。研究 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),然后研究factorysingletonbuilder等设计模式。这些只是起点,但足以为您指明此类事情的正确方向。祝你好运!

    【讨论】:

    • 正如我所说,这确实取决于您在做什么。对于资源定位,我总是使用地图/字典,因为它们具有出色的透明 API:我提供了一个密钥,该密钥用于快速查找我的数据。
    【解决方案2】:

    关于实现细节,不,避免使用数组。 STL 具有适当的容器,这些容器同样高效且使用起来更安全。特别是,maps 和 unordered_maps 将准确地完成名称和资源之间的映射。

    关于一般设计,我强烈建议您研究现有框架的功能。 OGRE 3D 很好地实现了为游戏量身定制的资源管理类。特别是,它包括预加载资源的能力,因此您不会因按需加载资源而减慢速度。您还可以指定“内存预算”,以便自动卸载资源。

    【讨论】:

    • 地图可以有变量类型吗?像 std::map<:string sprite or audio> 资源;
    • 如果SpriteAudio 共享同一个基类(例如Resource),是的,存储一个指向基类型的指针,并在需要时向下转换。一般来说,每种资源类型都会消耗不同的(实际)资源,因此最好有一个 TextureManagerAudioManager 等,每个都独立工作,即使它们可能共享一个共同的 ResourceManager 类作为基地。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多