• [rcssserver] 高速化のためのメモ. (akiyama) 00:46:34

4/24のプロファイルで,AudioSenderPlayerv8::Unfocused::getMsg() がボトルネックになっていることは分かった.しかし,この関数の中身は大したものではない.では,なぜ重くなるのか?

よくよく読んだ結果,全プレイヤのメッセージに対してループを回していることが原因と突き止めた.つまり,サーバが受信した全メッセージの数だけgetMsg()を呼び出しているということ. じゃあそのループを止めれば良いのかというと,そうもいかない. 仕様上,hear_capacitiyの許す限りメッセージを受信できなければならないので,ループを回さざるを得ないわけだ.

ループを回すのは仕方ないので,hear_capacityを越えればループを終了するようにすれば,すなわち,ループ内でgetMsg()を必要な回数だけ呼ぶようにすれば,飛躍的に改善されるだろうと思う. ただ,今は,全プレイヤのメッセージがひとつのコンテナにまとめられていてチームの区別がつかないので,チームごとにメッセージを保持するように変更しなければならない.

他にも,例えば以下のような条件式が書かれているが,

   if ( generalPredicate() )
   {
       if ( player.pos.distance( M_listener.pos )
            <= ServerParam::instance().audio_dist )
       {
           if ( M_listener.team == player.team )
           {
               return ( M_listener.hear_capacity_from_teammate
                        >= (int)ServerParam::instance().hearDecay() );
           }
           else
           {
               return ( M_listener.hear_capacity_from_opponent
                        >= (int)ServerParam::instance().hearDecay() );
           }
       }
  }

↓のように書いた方が効率が良いはず.

   if ( generalPredicate() )
   {
       if ( ( M_listener.team == player.team
              && M_listener.hear_capacity_from_teammate
                   >= (int)ServerParam::instance().hearDecay() )
            || ( M_listener.team != player.team
                 && M_listener.hear_capacity_from_opponent
                      >= (int)ServerParam::instance().hearDecay() )
            )
        {
              return ( player.pos.distance( M_listener.pos )
                       <= ServerParam::instance().audio_dist )
        }
   }

目処が立ったので,明日にでも直そう

  • [rcssserver] 高速化のためのメモ その2 (akiyama) 01:01:53

プロファイルの結果によると,boost::uniform_int が結構リソースを食っているらしい. 確かに,boost::uniform_intは重たいと聞いたことがある. 実用的には,boost::uniform_smallint で充分なので,入れ替えるべきだろう.

しかし,boost::uniform_int が使われているのは rcss::random::UniformRNG の基底クラスである boost::random_number_generator. これでは手を出すことができない. boost::random_number_generator と同等のものを新たに作るのが手っ取り早いだろうから,ちょっと作ってみよう.

でも,rcss::random::UniformRNGが使われているのは std::random_shuffleに対してだけなので,乱数生成器を指定しない std::random_shuffle にするだけでも充分な気もする.

  • [rcssserver] Known Bug Fix (akiyama) 13:57:27

トレーナのsayメッセージの長さが,プレイヤと同じ長さに制限されていた間違いを修正.

バージョン7以降のトレーナに送られるhearメッセージのフォーマットが誤っていたのを修正.

× (hear <Name> <Time> <Message>)
○ (hear <Time> <Name> <Message>)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-03-14 (月) 14:51:37 (1254d)
SourceForge.JP
Creative Commons License
RoboCup tools by Hidehisa Akiyama is licensed under a Creative Commons 表示-非営利 2.1 日本 License.