我有一个关于使用一些共享资源作为静态变量的问题

问题描述 投票:0回答:1

我是一名正在研究游戏引擎结构的学生

我在创建游戏引擎时一直通过 Singleton Patterns Manager 类管理共享资源。 然而,随着代码变长,代码的可读性就变得太差了。所以,我修改了代码,认为变量声明应该在使用变量的位置进行。

首先需要共享两个类:

class Mesh {
public:
    Mesh() {}
    ~Mesh() {}
};
class Material {
public:
    Material() {}
    ~Material() {}
};

下面的代码就是之前使用的单例模式方法。(单例模式)

class SomeManager {
public:
    static SomeManager& GetInst() {
        static SomeManager inst{};
        return inst;
    }

    Mesh* get_shared_msh() { return s_msh; }
    Material* get_shared_mtrl() { return s_mtrl; }

private:
    SomeManager()
        : s_msh()
        , s_mtrl()
    {
        s_msh = new Mesh;
        s_mtrl = new Material;

        //And another huge amount of init codes...
    }
    ~SomeManager() {
        delete s_msh;
        delete s_mtrl;

        //And another huge amount of release codes...
    }

    Mesh* s_msh;
    Material* s_mtrl;

    //... other variables
};

下面的代码,是我想出的代码。

很难看到代码混在一处,所以我把每个类中使用的共享资源改为在每个类中初始化。

//Class that actually use these variables
class light {
public:
    light() {
        if (0 == s_instance_count) {
            init_static();
        }
        ++s_instance_count;
    }
    ~light() {
        --s_instance_count;
        if (0 == s_instance_count) {
            release_static();
        }
    }
private:
    static void init_static() {
        s_msh = new Mesh;
        s_mtrl = new Material;
    }
    static void release_static() {
        delete s_msh; s_msh = nullptr;
        delete s_mtrl; s_mtrl = nullptr;
    }

    static inline int s_instance_count = 0;
    static inline Mesh* s_msh = nullptr;
    static inline Material* s_mtrl = nullptr;
};

问题:请问编程高手这个想法是好是坏。

当我在问问题之前先用谷歌搜索时,我发现大多数答案都将静态变量视为邪恶。然而,旧的方法使得理解程序结构变得困难,因为它离你实际使用资源和初始化它们的地方太远了......

c++ singleton static-variables
1个回答
0
投票

您的方法对于单例设计模式非常好,但有一个问题 您还应该注意并发性。 使用适当的并发处理技术来确保您的共享资源是线程安全的。

资源锁定

  • 互斥体
  • 读/写锁定
  • 引用计数等
© www.soinside.com 2019 - 2024. All rights reserved.