SDL中文论坛
标题:
ai执行效率
[打印本页]
作者:
ancientcc
时间:
2020-9-5 18:49
标题:
ai执行效率
衡量ai执行效率的指标是ai开始行动到结束时玩家需等待的时间。
等待时间自然是越短越好。ai算法可说都是cpu不断自动计算,因此,ai时间和平台所用cpu密切相关,同样算法基于Intel的PC和基于ARM的ios会出现不同结果。
要清楚ai执行效率,首要是知道ai把大部分时间花在哪里。以下是ai执行的时间及对比。
(, 下载次数: 3180)
上传
点击文件名下载附件
注:以#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
作者:
ancientcc
时间:
2020-9-5 18:50
标题:
减少调用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()。攻击后要调用它来更新小地图。
作者:
ancientcc
时间:
2020-9-5 18:51
从一楼ai执行时间可以看出move部分花时间占大部分。那move具体执行的是什么步骤?
move把应该的AI部队从from移到to,以一只部队论,它就是两个过程,1)找出一条从from到to的最好路径;2)沿着这条路径,执行从from向to移动。
以下是更细的move花的时间。
(, 下载次数: 3129)
上传
点击文件名下载附件
move主要时间主要是花在“找出一条从from到to的最好路径”。为什么找路径这么花时间呢?因为AI算出的to可能距from很远,这个远会造成找路径算法花去时间成指数增长。
a_star_search执行寻找路径。
优化策略
使用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。
(, 下载次数: 3150)
上传
点击文件名下载附件
作者:
ancientcc
时间:
2020-9-5 18:51
标题:
当轮到本势力时,各步骤花费时间
这个不是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时会花费的时间最多。
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3