游戏逻辑底层,MainLoop&&FSM&&MSG(一)

MainLoop–游戏主循环

简单的程序主要分为两个线程,一个线程负责处理界面刷新(一般需要较高FPS),另一个线程负责处理程序逻辑(刷新频率较低),此篇文章主要介绍游戏的逻辑线程,我称之为GameMainLoop(以下简称ML)。
基本的ML很简单,定义逻辑刷新频率,定义刷新执行事件,我们直接来看代码

MainLoop.h

//headers...

typedef std::function<void()> MainLoopFunc;
class MainLoop: public Singleton<MainLoop>
{
public:
#define MAIN_LOOP_FPS 1
    MainLoop();
    ~MainLoop();
protected:
    MainLoopFunc _loopfuncCallBack;
public:
    void loopFunc();
    void beginLoop();
    bool bindfunc(MainLoopFunc);
private:
    static unsigned int _currentTimeTick;
    static unsigned int _begainTimeTick;
    vector<MainLoopFunc> _taskArg;
};

#define mainLoop MainLoop::instance()

以及实现

MainLoop.cpp

unsigned int MainLoop::_currentTimeTick = clock();
unsigned int MainLoop::_begainTimeTick = clock();

MainLoop::MainLoop()
{
    _loopfuncCallBack = std::bind(&MainLoop::loopFunc, this);
}

MainLoop::~MainLoop()
{

}

void MainLoop::loopFunc()
{
    while (1)
    {
        unsigned int time = clock();
        if (time > _currentTimeTick + 1 / MAIN_LOOP_FPS*CLOCKS_PER_SEC)
        {
            for_each(_taskArg.cbegin(), _taskArg.cend(), [](MainLoopFunc func)
            {
                func();
            });
            _currentTimeTick = time;
        }
    }
}

bool MainLoop::bindfunc(MainLoopFunc func)
{
    if (func)
    {
        _taskArg.push_back(func);
        return true;
    }
    else
        return false;
}

void MainLoop::beginLoop()
{
    std::thread th(_loopfuncCallBack);
    th.join();
    return;
}

基本的主循环很简单,无非就是添加一个线程,然后每隔一段时间去执行逻辑更新函数,此处使用了bindfunc()函数来绑定新的回调事件,我们可以在后续制作中把新的逻辑都添加到函数数组中,而不用改变类破坏其封装。(如果对c++11不了解,推荐搜索关键字:threadfunction回调函数

此处Singleton类模板为单例设计,所有的单例类都将继承此类,网络上关于单例的讲解非常多,我在此不加赘述,这里有一个优秀的单例模板:

Singleton.h

template <class T>
class Singleton
{
public:
    //获取类的唯一实例
    static T* instance();
    //释放类的唯一实例
    void release();
protected:
    Singleton(void){}
    ~Singleton(void){}
    static T* _instance;
};
template<class T>
T* Singleton<T>::_instance = NULL;

template <class T>
T* Singleton<T>::instance()
{
    if (NULL == _instance){
        _instance = new T;
    }
    return _instance;
}

template <class T>
void Singleton<T>::release()
{
    if (!_instance)
        return;
    delete _instance;
    _instance = 0;
}
//cpp文件中需要先声明静态变量
#define DECLARE_SINGLETON_MEMBER(_Ty) \
    template <> _Ty* Singleton<_Ty>::_instance = NULL;

准备写一个有关游戏底层算法,物理算法,以及AI(重点是机器学习在游戏中的应用)的长篇博客,欢迎大家指正交流╰( ̄▽ ̄)╯

你可能感兴趣的:(游戏)