我是一名正在研究游戏引擎结构的学生
我在创建游戏引擎时一直通过 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;
};
问题:请问编程高手这个想法是好是坏。
当我在问问题之前先用谷歌搜索时,我发现大多数答案都将静态变量视为邪恶。然而,旧的方法使得理解程序结构变得困难,因为它离你实际使用资源和初始化它们的地方太远了......
您的方法对于单例设计模式非常好,但有一个问题 您还应该注意并发性。 使用适当的并发处理技术来确保您的共享资源是线程安全的。
资源锁定