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)为例说下各字段语义。


从以上可以看出:
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执行寻找路径。

优化策略

作者: 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