有人对游戏 ai 设计感兴趣无

2023-05-22 07:22:34 +08:00
 nekoharuya
项目背景:github 上某不知名开源黄油
语言:python
目前算法:整体上依然是 goap 的思路,然后将世界变量作为条件随机场的条件参数,供 ai 决策自己要检索的目标,通过对数据结构做了优化,写了套简易的启发式检索,供 ai 决策出完整的行为链,同时由于游戏里 npc 很多(2800 个),于是又通过近似检索,评分加权等思路,做了套蚁群优化,来降低 ai 的决策次数
目前成果:上诉这套东西都做完了,crf 的条件粗略几千个,角色属性纬度大几百个,写了套编辑器来随便增减目标,又大范围利用 chatgpt 做内容产出
瓶颈:性能是大问题,目前我个人能力已经找不到优化空间,除非对游戏设计做减法
需求:我想要进一步改进它,让 npc 看上去更像人,让调试变得更容易,让性能变得更好,更快,但是我自己肚子里没有墨水了,chatgpt 现在也只能对我放彩虹屁,我需要新的思路,感兴趣的话欢迎一起讨论撒
4201 次点击
所在节点    程序员
35 条回复
Eddition
2023-05-22 07:29:13 +08:00
差异化指令集
nekoharuya
2023-05-22 07:32:44 +08:00
@Eddition 可以详细解释下吗,请原谅我没看懂
txhwind
2023-05-22 10:17:48 +08:00
多线程、换 C
antonius
2023-05-22 10:21:55 +08:00
这么多 agent ,看你 tick 的频率,如果比较高,GOAP 开销还是不小的。优化方法也很多,不过实际情况多采用针对性优化,建议做分层(hierarchical),区分大目标小目标,缩减状态空间。或者 time-slicing ,或者降低 GOAP 搜索频率。

还可以采用混合架构,用 Behavior Tree 或者(H)FSM 做局部优化,提高性能。
thorneLiu
2023-05-22 10:48:58 +08:00
搞性能 估计得上 GPU 计算
thetbw
2023-05-22 11:58:27 +08:00
以前就觉得,现在 ai 技术要是做到游戏中,沉浸感得多强
nekoharuya
2023-05-22 12:03:12 +08:00
@antonius 时间切片之类的在行为跨度短的时候有效,但是第一次启动时,所有角色都在查找可用的目标,其实也是一个比较大的瓶颈,玩家选择睡觉这种操作的时候,步进跨度比较大,要卡很久,也是常受玩家诟病的,设计上,其实是选择了状态机和时间切片耦合的办法,ai 找到目标后就进入了状态机,状态结束后才重新查找,另外蚁群优化也是降低查询次数的方案,找到了近邻角色以后,按相似度和信息素作为决定是否模仿对方的行为的概率
nekoharuya
2023-05-22 12:07:32 +08:00
@txhwind 在这套设计里,作为核心,也就是性能瓶颈最大的 crf ,和对象化的数据结构强耦合,详细来说,我通过装饰器,注册了几千个验证世界状态的函数,它们各自之间,又有一些逻辑处理,同时也必须非向量化的处理角色的属性数据,各种状态验证中,验证角色之间的社交关系,好感度,当前位置,历史状态的也不在少数,我目前应该是没有能力完成向 c 的迁移
nekoharuya
2023-05-22 12:13:30 +08:00
@thorneLiu 主要是 gpu 只能解决特定算法问题,参考上面我对 txhwind 的回复
kepenj
2023-05-22 12:50:18 +08:00
AI 这块不是很懂,纯游戏开发角度,同步并发 2800 个 NPC ,且希望行为树各不相同,不算不同层级 BTree 里面可能发起的查询分支数不同,光本地性能消耗就很可观了,还不算其他脚本的挂载。所以从源头设计控制岂不是最优,毕竟游戏还是讲究的体验(同屏 2800 小黄油...刺激...话说地址能分享一手么...
nekoharuya
2023-05-22 12:54:09 +08:00
@kepenj github 上搜 dieloli 就是了,帖子里说的算法自然是成品,这个游戏我做了五年了
aegon466
2023-05-22 13:34:49 +08:00
对技术和游戏内容都比较有兴趣 有群吗
thorneLiu
2023-05-22 14:02:22 +08:00
@nekoharuya 游戏这方面我确实不懂 我只看到 AI+性能 我以为是我们做的 AI 训练推理工程化相关的内容
我们这边基本就是 c++加异构的计算来提升性能
antonius
2023-05-22 14:11:24 +08:00
@nekoharuya 具体问题具体分析,做一次完整的性能数据采集,看看瓶颈在哪些地方。agent 较多可以考虑 AI 方面的 LOD ,不是所有 agent 都要完全执行。也可以试试 utility-based ai system 。

除此之外,你可能要考虑优化一下底层架构,例如游戏运行时性能,解决 Python 本身的性能问题。不太了解 Python 我就不乱说了。

性能优化是个痛苦的过程,为了性能可能要会代码搞得没那么优雅,还有不少妥协以及 hack 手法。
nekoharuya
2023-05-22 14:58:52 +08:00
@antonius PreCondition 这块的处理也是有的,核心是通过实现建立好的 hash 表,从 Goal 去查它绑定的 PreCondition ,当 PreCondition 不能满足的时候,又通过事先建立好的 hash 表,从 Effect 去反查能够满足他的 Goal ,只有一个 Goal 能满足的时候就返回它,有多个的时候就通过权重抽一个,某个 Goal 有某个 PreCondition 不能满足的时候,就又递归一层,通过对数据结构的调整,以及对数据进行预热,来优化这块的时间复杂度,尽可能的做到 O1 ,至少我刚才回忆了一下,只有一两处实在绕不开的地方是 On ,底层架构的话,我已经做了非常多的优化,我的能力所限,现在要继续优化也完全找不到新的思路
zglzy
2023-05-22 15:20:52 +08:00
有个不成熟的想法,有没有可能把计算密集的部分放在其他语言里写,做成一个 Python 包把接口提供出来就好?
比如 C++的 PyBind
或者用 Rust 的 PyO3 (这个我自己试过体验很好,开多线程并行也很方便)
nekoharuya
2023-05-22 15:23:54 +08:00
@antonius utility-based ai system 实质上是被包含在这个算法的条件随机场(Conditional Random Field)中了,效用(utility),即 crf 中,验证函数通过世界变量获取到的条件权重,在人类的思考过程中,并不总是选择最优策略,但总的来说,人类总是更倾向于更有利的选择,所以这里做了个随机场来实现这一点,权重越大,选择对应目标的概率就越大
nekoharuya
2023-05-22 15:26:34 +08:00
@zglzy 其实有尝试过,但是,数据传递和数据类型转换的成本相当的高,再者就是高度耦合的问题,详看我在 8 楼的回复
antonius
2023-05-22 15:43:58 +08:00
如果你觉得没法再优化,那就做一次 profiling ,看看瓶颈在哪些地方。
nekoharuya
2023-05-22 15:57:20 +08:00
@antonius 倒也没有在虚空优化,火焰图之类的东西有在用,print 也打得多,各有优缺吧吧,但是常规的手段只能排查一些明显的瓶颈,通常也通过预热数据来解决了,比如游戏中场景树相当复杂,节点到节点之间的移动找不到什么有效的算法,最后选择上数据预热,例如在 github 的流水线中打包的时候,就把所有可能的,结果到节点之间的移动的最短路线创建好,比起死磕这块,不过直接从算法上完全避免,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/941790

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX