欢迎光临散文网 会员登陆 & 注册

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

2020-03-05 16:51 作者:有木乘舟  | 我要投稿

本系列为笔者初学c/c++和游戏AI开发的学习经历,练习为主,不涉及到具体的游戏开发软件学习(如unity,虚幻4等),适合刚入门的小伙伴一起学习探讨,欢迎在评论区留下意见。

  •  开发语言:c/c++ (11及以上) 

  • 开发平台:macOS mojave / Linux 

  • 编译器:vs Code / g++

二、项目的设计模式

2.2 单例模式

确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

----《设计模式》 GoF

  即一个类只能创建一个实例,并且这个实例必须得由类本身提供。

  表现在c++里,便是其构造函数是私有的、外界无法访问同时,提供一个公有Instance()方法来返回一个例,且这个实例是全局唯一的

2.2.1 结构

  

图6 单例模式UML图

2.2.1 例子

  我们以“Bob的一天”这个项目为例,在状态模式下,我们为Bob这个实例对象分配了四个状态类,且这四个类继承了State类,同时他们的数据是共享的。

  假如我们没有使用单例模式来设计状态类,那么在游戏的开发过程中,可能会发生开发人员不小心在一个状态过程中实例化了多个对象,造成内存浪费,甚至是数据错乱等情况(由于Bob的数据是共享的)。

  因此,每个具体的状态被简化为一个Singleton对象,在这种情况下是十分有效的。

图7 “进入矿场挖矿”状态类的单例实现
图7.1 Instance()方法

  与书中提供的代码不同的是,笔者将书中的单例模式改为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


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

分享到微博请遵守国家法律