基础 | 简单的智能体----有限状态机(四)

本系列为笔者初学c/c++和游戏AI开发的学习经历,练习为主,不涉及到具体的游戏开发软件学习(如unity,虚幻4等),适合刚入门的小伙伴一起学习探讨,欢迎在评论区留下意见。
开发语言:c/c++ (11及以上)
开发平台:macOS mojave / Linux
编译器:vs Code / g++

二、项目的设计模式
2.2 单例模式
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。
----《设计模式》 GoF
即一个类只能创建一个实例,并且这个实例必须得由类本身提供。
表现在c++里,便是其构造函数是私有的、外界无法访问;同时,提供一个公有Instance()方法来返回一个实例,且这个实例是全局唯一的。
2.2.1 结构

2.2.1 例子
我们以“Bob的一天”这个项目为例,在状态模式下,我们为Bob这个实例对象分配了四个状态类,且这四个类继承了State类,同时他们的数据是共享的。
假如我们没有使用单例模式来设计状态类,那么在游戏的开发过程中,可能会发生开发人员不小心在一个状态过程中实例化了多个对象,造成内存浪费,甚至是数据错乱等情况(由于Bob的数据是共享的)。
因此,每个具体的状态被简化为一个Singleton对象,在这种情况下是十分有效的。


与书中提供的代码不同的是,笔者将书中的单例模式改为Meyers' Singleton,用到了C++11标准中的Magic Static特性,来自《Effective C++》。
如果当变量在初始化的时,并发同时进入声明语句,并发线程将会阻塞等待初始化结束。
----《Effective C++》 Meyers
这是最为推荐的一种单例模式实现方式,保证了线程安全,代码也足够简洁:
通过局部静态变量的特性保证了线程安全 (C++11, GCC > 4.3, VS2015支持该特性);
不需要使用共享指针,代码简洁;
注意在使用的时候需要声明单例的引用
Single&
才能获取对象。

参考:
《游戏人工智能编程案例精粹》
《设计模式》 GoF
《Effective C++》 Meyers
c++单例模式总结与剖析, 行者孙,https://www.cnblogs.com/sunchaothu/p/10389842.html
相关代码下载:https://github.com/linpeijie/GameToy/tree/master/GameAI/FSM