[底层导读1-1]底层阅读顺序和actionImpl函数阅读

Posted rootchu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[底层导读1-1]底层阅读顺序和actionImpl函数阅读相关的知识,希望对你有一定的参考价值。

阅读底层代码的顺序如下:
./src/main_player.cpp -> main()
./rcsc/common/basic_client.cpp -> run()
./rcsc/common/basic_client.cpp -> runOnline()
./rcsc/common/soccer_agent.cpp -> handleMessage()
./rcsc/player/play_agent.cpp -> action()
./rcsc/player/play_agent.cpp -> actionImpl()
./src/sample_player.cpp

然后开始看sample_player里的actionImpl()函数。

    //
    // update strategy and analyzer
    //
    Strategy::instance().update( world() );
    FieldAnalyzer::instance().update( world() );

    //
    // prepare action chain
    //
    M_field_evaluator = createFieldEvaluator();
    M_action_generator = createActionGenerator();

    ActionChainHolder::instance().setFieldEvaluator( M_field_evaluator );
    ActionChainHolder::instance().setActionGenerator( M_action_generator );

    //
    // special situations (tackle, objects accuracy, intention...)
    //
    if ( doPreprocess() )
    {
        dlog.addText( Logger::TEAM,
                      __FILE__": preprocess done" );
        return;
    }

    //
    // update action chain
    //
    ActionChainHolder::instance().update( world() );


    //
    // create current role
    //
    SoccerRole::Ptr role_ptr;
    {
        role_ptr = Strategy::i().createRole( world().self().unum(), world() );

        if ( ! role_ptr )
        {
            std::cerr << config().teamName() << ": "
                      << world().self().unum()
                      << " Error. Role is not registerd.
Exit ..."
                      << std::endl;
            M_client->setServerAlive( false );
            return;
        }
    }


    //
    // override execute if role accept
    //
    if ( role_ptr->acceptExecution( world() ) )
    {
        role_ptr->execute( this );
        return;
    }


    //
    // play_on mode
    //
    if ( world().gameMode().type() == GameMode::PlayOn )
    {
        role_ptr->execute( this );
        return;
    }


    //
    // penalty kick mode
    //
    if ( world().gameMode().isPenaltyKickMode() )
    {
        dlog.addText( Logger::TEAM,
                      __FILE__": penalty kick" );
        Bhv_PenaltyKick().execute( this );
        return;
    }

    //
    // other set play mode
    //
    Bhv_SetPlay().execute( this );

sample_play的actionImpl函数分为以下几个部分:
1.update strategy and analyzer
更新策略和分析器
2.prepare action chain
准备动作链
3.special situations (tackle, objects accuracy, intention...)
特殊的情况(铲球,对象的准确性,意图...)
4.update action chain
更新动作链
5.create current role
创建当前角色
6.override execute if role accept
覆盖执行,如果角色接收
7.play_on mode
play_on 模式
8.penalty kick mode
点球模式
9.other set play mode
其他的模式

详细来看每个过程。

1.update strategy and analyzer
这里更新了Strategy和FieldAnalyzer。
对Strategy主要是对当前的Situation和位置进行更新。更新Situation的话,首先判断当前是否为play on模式。如果不是的话有PenaltyKick_Situation(点球)、OurSetPlay_Situation(我方拿球)、OppSetPlay_Situation(对方拿球)三种情况。如果是play on模式的话,先找到我方离球最近的球员,然后判断我方和对方谁能先拿到球,选择进攻或防守,Defense_Situation(防守)、Offense_Situation(进攻)。如果都不是即为Normal_Situation

2.prepare action chain
创建当前评估和推理机,并将他们存入动作链保存器中。

3.special situations (tackle, objects accuracy, intention...)
这部分可以暂时忽略不看。

4.update action chain
根据当前状况对动作链进行更新。
在更新中,读入了评估和推理机,并根据评估和推理机创建动作链图,并进行计算和排序。

5.create current role
创建当前的角色。

6.override execute if role accept
角色执行。

7.play_on mode
角色执行。这部分在后面重点细看。

8.penalty kick mode
执行点球的组合动作。

9.other set play mode
执行。





































以上是关于[底层导读1-1]底层阅读顺序和actionImpl函数阅读的主要内容,如果未能解决你的问题,请参考以下文章

JAVA——底层源码阅读——集合ArrayList的实现底层源码分析

JAVA——底层源码阅读——包装数据类型Integer.valueOf()自动装箱方法底层源码分析

顺序容器1(总体)

2021年大数据Spark(五十四):扩展阅读  SparkSQL底层如何执行

Boost Asio 访问 asio::ip::address 底层数据和字节顺序

Apache Druid 底层存储设计(列存储与全文检索)