[ai] ai执行效率

衡量ai执行效率的指标是ai开始行动到结束时玩家需等待的时间。

等待时间自然是越短越好。ai算法可说都是cpu不断自动计算,因此,ai时间和平台所用cpu密切相关,同样算法基于Intel的PC和基于ARM的ios会出现不同结果。

要清楚ai执行效率,首要是知道ai把大部分时间花在哪里。以下是ai执行的时间及对比。

注:以#9, play_ai_turn 5620 ms, (draw: 2088(15), analyzing: 605), [5499](1+[5217]+281)(recruit: 455, combat: 1361, build: 0, move: 3401, diplomatism: 0)为例说下各字段语义。

  • #9:当前执行的ai势力。
  • play_ai_turn 5620ms:play_ai_turn是ai执行整个过程,它表示此次执行共花费5620毫秒。(所有时间单位都是毫秒)。
  • draw: 2088(15):此次ai过程中display::draw函数总共花掉2088毫秒。此次ai过程总共调用了15次display::draw。
  • analyzing: 605:此次ai过程分析攻击路径总共花掉605毫秒。
  • [5499](1+[5217]+281):5499是由后面三个时间加出的时间,它一般等于play_ai_turn后那个时间。1:do_move之前用的时间;5127:do_move用的时间;281:do_move后用的时间,这个时间一般待于一次重画小地图的display::draw时间。
  • (recruit: 455, combat: 1361, build: 0, move: 3401, diplomatism: 0):这是do_move中的各个阶段花费时间。

从以上可以看出:

1:display::draw很耗时。

2:move是个很耗时操作。

3:分析攻击路径(analyzing)是个耗时操作。

 

二、减少调用display::draw

减少可能性

display::draw作用是重画游戏窗口界面,要是AI时间够短,即使界面上没做做到实时更新,像AI部队移动了但没有小地图表现出来,玩家也可以接受。

不能少原因

1、小地图。display::draw画的内容除了大地图还有小地图。像一只AI部队移动路径不在当前窗口,它移动后大地图上可以不必画,但小地图是啥个地方都能看到的,不调用display::draw就没法剧新小地图。

2、有动画的地形。当前窗口存在有动画地形时,要是不调用display::draw就没法显示这些动画。

 

执行策略

提供一个选项指示是否要降低cpu使用率,lower_cpu_usage。该选项默认是false。

选择要降低cpu使用率时,每次AI过程只会在最后一次调用带有重画小地图的display::draw。

lower_cpu_usage=flase时,要屏蔽掉的几处display::draw调用。

1:actions.cpp中的move_unit中的disp.draw()。它在移动动画后要调用它来更新小地图。

2:actions.cpp中的attack::perform()。攻击后要调用它来更新小地图。

 

三、AI移动时间

从一楼ai执行时间可以看出move部分花时间占大部分。那move具体执行的是什么步骤?

move把应该的AI部队从from移到to,以一只部队论,它就是两个过程,1)找出一条从from到to的最好路径;2)沿着这条路径,执行从from向to移动。

以下是更细的move花的时间。

 

move主要时间主要是花在“找出一条从from到to的最好路径”。为什么找路径这么花时间呢?因为AI算出的to可能距from很远,这个远会造成找路径算法花去时间成指数增长。

a_star_search执行寻找路径。

优化策略

[list]

[*]使用cost缓存。

[*]shortest_path_calculator::ignore_defense_变量置为true。

[*]设置好恰当stop_at值。

double stop_at = dst_must_reachable? 10000.0: calc.getUnitHoldValue() + 10000.0;

dst_must_reachable指示此次搜索时是否一定要移动到目的格子。AI时除移动+攻击其它都是dst_must_reachable=false。

calc.getUnitHoldValue():该格子上站了一个敌对部队时需要成本。stop_at设为的要保证避开关隘。

shortest_path_calculator::cost中注意下建筑物格子成本。建筑物格子成本分三种情况。

1:部队要移动到它之上时,成本等于地形成本。

2:部队是被建筑物zoc时,已消耗成本>2*部队MP,不改变累计成本消耗。(*2)。

3:部队是被建筑物zoc时,已消耗成本<2*部队MP,成本消耗立即增加当前剩余移动力。(*3)。

(*2):要是当作zoc增加累计成本,这会一下增加支线上的“多余”格子。

(*3):要是不当作zoc不增加累计成本,这会使得跑去城边立即被zoc,倒致不预测移动和真实移动不一致。以下是(3)的一个例子,把城做为zoc。

 

四、当轮到本势力时,各步骤花费时间

这个不是AI所独有,放在这里主要是它涉及到效率。

玩家势力达到20支城外部队,7个城市。

play_controller::do_init_side

 花费时间(毫秒)
各部队、current_team的new_turn()函数花费时间2
side_upkeep/spend_gold花费时间1
calculate_healing花费时间5471
reset_resting花费时间2801

playsingle_controller::before_human_turn

 花费时间(毫秒)
to_config花费时间139
 1
save.autosave花费时间73

可以发现在calculate_healing、reset_resting时会花费的时间最多。

全部评论: 0

    写评论: