渲染引擎开发笔记5.2

单例模式

Posted Kongouuu's Blog on December 26, 2021

正文

一个引擎内部一般都会有很多管理类吧。拿我这个来说无论是引擎侧还是渲染器侧都需要很多管理类去统一的管理不同的数据。为了更好的去使用这些类我们需要用到单例模式的设计模式。

为什么使用单例

抛开基础的什么减少内存开支和避免不必要的创建销毁来说,使用单例还有一些额外的好处,个人感觉。

增加一个管理类的可调用范围

不使用单例的话那么我们会在需要使用到管理类的的类中去定义一个管理类的实例,比如说:

1
2
3
4
5
6
7
8
9
10
11
12
class Foo
{
 public:
 	void Bar();
 private:
 	TestManager tm;
};

void Foo::Bar()
{
	tm.xxxx;
}

但这时候如果我们要在其他类使用这同一个实例会非常的困难

代码好看

代码好看是真的,使用单例类之后大部分情况我们都可以把管理类的对外接口写成静态函数。这样的话比如说创建物体就可以通过这样调用:

SceneManager::CreateRenderObject(n)

虽然内部的代码会频繁的去找单例的实例来找实际数据,不过曝露出来的接口好看就可以了。

使用哪种单例

单例基本上就两个做法嘛,一个是检查静态指针是不是nullptr,是就new一个实例出来。这种方式是比较节省空间的,不过如果没做额外调整可能会有线程安全问题,加上每次调用还需要确认是不是nullptr

我这里反正所有的管理类他一定是会被我使用的,我敢肯定,所以就是下面这样的单例模式。