从函数角度看ID到文件路径的内部与外部映射

Internal vs External Mapping of IDs to file paths from function perspective

本文关键字:路径 内部 映射 外部 文件 函数 ID      更新时间:2023-10-16

一个sf::Sprite可以与多个sf::Sprite对象共享相同的sf::Texture对象,所以我想将纹理管理器设计为多次不使用相同的纹理。

我正在使用一个标识符来引用纹理。TextureID将纹理映射到与包含纹理的文件相对应的文件路径:

std::filesystem::path mapIdToFilepath(TextureID id);

TextureManager中,我想要一个成员函数loadTexture(),我想:

  1. loadTexture()接受TextureID:

    sf::Texture& TextureManager::loadTexture(TextureID id);
    

    然后,函数必须内部通过调用mapIdToFilepath()将标识符TextureID转换为纹理文件路径。

  2. 或者接受纹理的文件路径作为参数:

    sf::Texture& TextureManager::loadTexture(std::filesystem::path filepath);
    

    调用此函数的客户端代码必须将标识符TextureID转换为纹理文件路径。然而,该函数不必知道mapIdToFilepath的存在,因为映射是在外部完成的。

我认为第一种方法更方便,但它将TextureManager耦合到mapIdToFilepath(),因为它在内部执行TextureID到文件路径的转换。

体系结构的角度,在考虑这两种不同的方法时,我应该记住哪些方面?

我认为,从广义上讲,您正在寻找类似资产管理器的东西,只加载一次资产(无论是纹理、声音还是字体(,并在任何地方使用它们。你可以用我很久以前用过的东西。制作一个将在贴图中包含纹理的"资源管理器"类。类似这样的东西:

class TexManager
{
public:
TexManager* tex()  //to access your assets without creating multiple instances of this class
{
static Texmanager texMan;
return &texMan;
}
void loadTexture(std::string name, std::string filepath) //to load textures
{ 
sf::Texture tmp;
tmp.loadFromFile(filepath);
texMap.insert(std::make_pair(name, tmp));
}
sf::Texture& getTexture(st::string name) //to retrieve textures
{ 
return texMap.at(name);
}
private:
std::map<std::string, sf::Texture> texMap;
}

不要按原样使用代码,因为您需要添加加载失败或映射键值不正确的条件。如果你需要其他东西,或者我的回答有误,请告诉我。谢谢。:(