• 注册
欢迎加入behaviac Q&A网站。behaviac是腾讯开源组件https://github.com/TencentOpen/behaviac 官方网站:http://www.behaviac.com/,提供各种文档和教程及手册 为了您及时的获得您最新问题的评论或者回答,请提供并验证您的邮箱
欢迎来到 behaviac Q&A。 您在bbs里的问题,管理员会当下就收到通知,不要担心管理员看不到您的问题。也请在bbs里提供您的email,这样就可以第一时间收到关于回答,评论的email的通知了。 为了节省大家的时间,请表达好你的问题,提供必要上下文,版本号,平台信息,重现步骤等。

如何分析哪些节点开销最多

0 喜欢 0 不喜欢
71 浏览
做一个 开房间对战的游戏, 填充了大量AI 模拟真实玩家的行为(让玩家能体会很多人游戏的乐趣)
但发现一个服务器只能开不多的房间,成本太高。
AI放在服务器上, 服务器是用C++的, 已经用BEHAVIAC_RELEASE开关。 虽然行为树文件用的是xml,不过性能应该和导出C++代码差不太多。

用gprof分析了一下:

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
  7.42      3.26     3.26 338435127     0.00     0.00  std::less<unsigned int>::operator()(unsigned int const&, unsigned int const&) const
  6.03      5.91     2.65 42730776     0.00     0.00  behaviac::BehaviorTask::exec(behaviac::Agent*, behaviac::EBTStatus)
  3.35      7.38     1.47  8214466     0.00     0.00  behaviac::Sequence::SequenceUpdate(behaviac::Agent*, behaviac::EBTStatus, int&, behaviac::vector<behaviac::BehaviorTask*, behaviac::stl_allocator<behaviac::BehaviorTask*> >&)
  2.91      8.66     1.28  8082637     0.00     0.00  behaviac::IfElseTask::update(behaviac::Agent*, behaviac::EBTStatus)
  2.19      9.62     0.96 42379225     0.00     0.00  behaviac::BehaviorTask::onexit_action(behaviac::Agent*, behaviac::EBTStatus)
  2.11     10.55     0.93 42382310     0.00     0.00  behaviac::BehaviorTask::onenter_action(behaviac::Agent*)
  1.53     11.22     0.67 22763038     0.00     0.00  std::_Rb_tree<unsigned int, std::pair<unsigned int const, behaviac::IVariable*>, std::_Select1st<std::pair<unsigned int const, behaviac::IVariable*> >, std::less<unsigned int>, behaviac::stl_allocator<std::pair<unsigned int const, behaviac::IVariable*> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<unsigned int const, behaviac::IVariable*> > const*, std::_Rb_tree_node<std::pair<unsigned int const, behaviac::IVariable*> > const*, unsigned int const&) const
  1.41     11.84     0.62 13729240     0.00     0.00  behaviac::Condition::Evaluate(behaviac::Agent*)
  1.34     12.43     0.59   216968     0.00     0.01  SPlayer::getClosestEnemy()
  1.30     13.00     0.57 10043041     0.00     0.00  std::_Rb_tree<unsigned int, std::pair<unsigned int const, behaviac::Property*>, std::_Select1st<std::pair<unsigned int const, behaviac::Property*> >, std::less<unsigned int>, behaviac::stl_allocator<std::pair<unsigned int const, behaviac::Property*> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<unsigned int const, behaviac::Property*> >*, std::_Rb_tree_node<std::pair<unsigned int const, behaviac::Property*> >*, unsigned int const&)
  1.22     13.53     0.54 215509216     0.00     0.00  std::_Rb_tree<unsigned int, std::pair<unsigned int const, behaviac::IVariable*>, std::_Select1st<std::pair<unsigned int const, behaviac::IVariable*> >, std::less<unsigned int>, behaviac::stl_allocator<std::pair<unsigned int const, behaviac::IVariable*> > >::_S_key(std::_Rb_tree_node<std::pair<unsigned int const, behaviac::IVariable*> > const*)
  0.98     13.96     0.43 111625020     0.00     0.00  CRC32::UpdateB(unsigned int&, unsigned char)
  0.96     14.38     0.42 198071284     0.00     0.00  std::basic_string<char, std::char_traits<char>, behaviac::stl_allocator<char> >::_M_data() const
  0.94     14.80     0.42 130005289     0.00     0.00  std::vector<behaviac::BehaviorNode*, behaviac::stl_allocator<behaviac::BehaviorNode*> >::size() const
  0.91     15.20     0.40  5281937     0.00     0.00  bool const* behaviac::Variables::Get<bool>(behaviac::Agent const*, bool, CMemberBase const*, unsigned int) const
  0.89     15.59     0.39 10060800     0.00     0.00  CRC32::CalcCRC(char const*)
  0.89     15.98     0.39 65368655     0.00     0.00  std::basic_string<char, std::char_traits<char>, behaviac::stl_allocator<char> >::size() const
  0.87     16.36     0.38 244545039     0.00     0.00  std::_Select1st<std::pair<unsigned int const, behaviac::IVariable*> >::operator()(std::pair<unsigned int const, behaviac::IVariable*> const&) const
  0.75     16.69     0.33 23077550     0.00     0.00  behaviac::BehaviorTask::update_current(behaviac::Agent*, behaviac::EBTStatus)
  0.75     17.02     0.33 19647754     0.00     0.00  behaviac::BranchTask::update_current(behaviac::Agent*, behaviac::EBTStatus)
  0.75     17.35     0.33 42382310     0.00     0.00  behaviac::BehaviorNode::InstantiatePars(behaviac::Agent*) const
  0.74     17.67     0.33 86163248     0.00     0.00  behaviac::BehaviorTask::CheckPreconditions(behaviac::Agent*, bool)

不太清楚从何入手优化。

是不是可以分析一下 行为树文件, 判断哪些节点 开销比较多(执行次数比较多), 可以做一下优化?

看到有宏开关: BEHAVIAC_ENABLE_PROFILING

这个是可以统计分析,哪些节点被执行最多吗? 怎么使用呢?

谢谢!
最新提问 6月 27, 2016 用户: zhenmu (310 分)
标签修改 8月 22, 2016 用户:jonygli

1个回答

0 喜欢 0 不喜欢
 
已采纳

image

如上图,在最新版(3.5.3及以后)中,可以显示出每个节点的执行情况(当前更新时间 平均更新时间 执行次数)

最新回答 6月 27, 2016 用户: jonygli (58,290 分)
采纳于 6月 28, 2016 用户:zhenmu
更新到3.5.4了, 可以看到这些信息了。

 不过开启_DEBUG后, 发现调试时CPU 占用率非常高,有时会卡死,
以前版本3.4.1 调试好像不会这样...
这次版本 只是DEBUG效率变低了吧? RELEASE 不知道怎样?
...