dotaai吧 关注:21,442贴子:482,838
  • 0回复贴,共1

关于AI时代dota地图的解读

只看楼主收藏回复

众所周知,目前已进入Ai时代,作图方式已经演成工程化,奔溃泄露改善优化已经变成人工位置机器为辅方式,传统的改图方式已经被淘汰,也向着先进的作图模式看齐了,那么如何把错误和bug找出来提交给AI去优化呢?首先,我认为需要有一套完好的日志系统(lua当仁不让啦)来跟踪,为啥不用打印输出呢,因为记录面板保存的数量查看是有限的,而日志则可以无限查看。然后日志该如何找到bug呢,首先把runtime.handle_level去设为2,再把runtime.error_handle输出成你喜欢的方式,记得把debug.traceback()放进去就行,那么一旦有jass运行错误它都会记录的日志里,比如各种crash啦。接着再去网上找某位大师写的计时器之类的统计泄露脚本,核心就两句local h = 0x100000 + c,local info = dbg.handledef(h)。然后在游戏运行到fps低于某个值时(比如29、30、31呀)把数据都弄到日志去。接下来去相同英雄模式-SH里打几把,因为十个英雄调用的技能,装备,AI逻辑都是一样的。这样把统计下来的数据去跟正常的英雄对比一下或看下变化速度是否太快就知道哪个异常了。当然啦像冰娃的触发器很多都是在一分钟后才销毁有时也并非啥问题,玩家事件EVENT_PLAYER_UNIT_ATTACKED最好注册了也不要轻易去销毁掉,比如熔炉精灵每个都是新开一个一旦销毁其他全局攻击触发器将可能得到空的GetAttacker报错。最后根据异常项比如找到泄露过多的代码行数就更简单啦,首先设想是CreateUnit的锅的话,那么就拦截掉这个函数CreateUnitOrigin = CreateUnit,然后重定义它并用debug.getinfo去拿调用它的行数,每次调用用一个全局变量去记录它的数量,acCt[lc] = (acCt[lc] or 0) + 1这样就拿到所有调用行数的次数啦。最最后只要在记录泄露事项的同时把行数拍下序取前5个就OK啦,
local list = {}
for line, count in pairs(acCt) do
table.insert(list, {line = line, count = count})
end
table.sort(list, function(a, b)
return a.count > b.count
end)
for i = 1, 5 do
JassLog(list[i].line .. ' : ' .. list[i].count)
end。在这5个里面逐个去找大于句柄数量的,看看哪个有问题就行,要是找到了还不知道怎么改当然是去问问伟大的AI啦。下一课有空再讲讲如何用go软件利用w2l把解压后的文件夹工程打包成地图


IP属地:广东1楼2026-09-13 11:43回复