SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4405|回复: 3
打印 上一主题 下一主题

[ai] ai执行效率

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2020-9-5 18:49:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
衡量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
回复

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
沙发
 楼主| 发表于 2020-9-5 18:50:06 | 只看该作者

减少调用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()。攻击后要调用它来更新小地图。
回复 支持 反对

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
板凳
 楼主| 发表于 2020-9-5 18:51:00 | 只看该作者
从一楼ai执行时间可以看出move部分花时间占大部分。那move具体执行的是什么步骤?
move把应该的AI部队从from移到to,以一只部队论,它就是两个过程,1)找出一条从from到to的最好路径;2)沿着这条路径,执行从from向to移动。
以下是更细的move花的时间。

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

a_star_search执行寻找路径。

优化策略
  • 使用cost缓存。
  • shortest_path_calculator::ignore_defense_变量置为true。
  • 设置好恰当stop_at值。
    1. 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。

回复 支持 反对

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
地板
 楼主| 发表于 2020-9-5 18:51:24 | 只看该作者

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

这个不是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时会花费的时间最多。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 04:05 , Processed in 0.048352 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表