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

2023-05-22 07:22:34 +08:00
 nekoharuya
项目背景:github 上某不知名开源黄油
语言:python
目前算法:整体上依然是 goap 的思路,然后将世界变量作为条件随机场的条件参数,供 ai 决策自己要检索的目标,通过对数据结构做了优化,写了套简易的启发式检索,供 ai 决策出完整的行为链,同时由于游戏里 npc 很多(2800 个),于是又通过近似检索,评分加权等思路,做了套蚁群优化,来降低 ai 的决策次数
目前成果:上诉这套东西都做完了,crf 的条件粗略几千个,角色属性纬度大几百个,写了套编辑器来随便增减目标,又大范围利用 chatgpt 做内容产出
瓶颈:性能是大问题,目前我个人能力已经找不到优化空间,除非对游戏设计做减法
需求:我想要进一步改进它,让 npc 看上去更像人,让调试变得更容易,让性能变得更好,更快,但是我自己肚子里没有墨水了,chatgpt 现在也只能对我放彩虹屁,我需要新的思路,感兴趣的话欢迎一起讨论撒
4201 次点击
所在节点    程序员
35 条回复
thorneLiu
2023-05-22 16:09:01 +08:00
看下来 讲性能提升是不是换语言更立竿见影?
c/cpp 额 要么 rust
nekoharuya
2023-05-22 16:24:19 +08:00
@thorneLiu 几个方面,一则这个项目开发了五年,数据结构之类的设计上和 python 强耦合,利用了大量的 python 的特性和设计思想,另一方面,python 的生态还是可以的,我用了许多三方库来解决问题,社区的拖拉机还是很可以的,比如用 numpy 实现,以 value 作为随机区间,随机选择一个 key ,比起我直接拿 python 写二分法,要快 40%,又或者我写的蚁群算法依赖近似度检索,chatgpt 给我挑了一堆库多半都是炼丹来实现的,我直接拿来就用,不用去关心它的设计原理,
csulyb
2023-05-22 17:21:22 +08:00
耗时算法用 c++做吧,以前做游戏基本就是套一个行为树来实现,没有其他办法,穷举法倒也是一个办法。
从我多年游戏来看,NPC 的智能化程度,并不影响用户的对游戏的体验,之前做游戏游戏大部分是专注于图形相关的,ai 这块基本上不会太复杂。
nekoharuya
2023-05-22 17:46:39 +08:00
@csulyb 没有什么纯算法上的性能瓶颈,有数学计算的硬性需求的,大部分都通过各种库解决了,例如随机算法和检索近似对象,还有寻路,主要的性能瓶颈在硬性的计算量上,只能从整个 ai 算法的框架上做优化来规避,比如通过基本案例推导,让 npc 之间相互模仿行为,npc 每次要检索的行为树就降低了一大截,俺这个是纯文字沙盒游戏,重心就在 ai 上,我清楚这技术也是屠龙技,我搬砖多年,完全用不到,但是它酷啊,整个游戏行业,从各种 3a 到各路独立游戏,不管是什么模拟人生钢铁雄心绿帽之王,还是什么 cdda ,矮人要塞,环世界,哪个 ai 有我这个高级,你说是吧
zglzy
2023-05-22 18:30:03 +08:00
主要是换语言就可以有免费的性能提升,我本来还想建议试试换到 PyPy ,但是好像没有看到过什么成熟的从 CPython 迁移到 PyPy 的例子就还是算了
nekoharuya
2023-05-22 19:24:55 +08:00
@zglzy 项目大了,积重难返,其实也试过走 nuitka 之类的东西,把 python 转成 c ,再编译,但是有几个问题,一是现在项目和 python 耦合性太高了,不说那些复杂的语法糖,光是一个推导式,它都搞不定,更别提对各种 c 库的兼容,那些走 jit 的方案也是同理
exch4nge
2023-05-22 19:54:29 +08:00
不换语言的话,那就先上多线程吧
nekoharuya
2023-05-22 20:14:33 +08:00
@exch4nge python 的缺陷在这里,它的多线程是是在单进程中运行的,然后 cpu 在各个线程中不断切换,于是就有了一个问题,切换也是要时间的,在这种 cpu 密集的场景下,多线程将列表处理完一遍的时间,比单线程遍历完一遍,需要更多的时间,多进程的话,进程间通信的开销更加巨大,特别是在没有 fork 的 windows 上,要计算的数据还得单独传递过去,在数据体积十分庞大的情景(特指俺这游戏),这是相当高昂的开支,另外就是沙盒游戏的通病,角色数据只能逐个迭代,不能分开算……不过,目前游戏里还是有一些多线程处理,比如 ui 的渲染在单独的线程里,也有多进程的应用,比如用子进程实现了完全不影响玩家操作的自动存档,又或者做近似对象检索的库,它建立索引的过程是多核的
ac23
2023-05-23 09:35:12 +08:00
优秀~
ac23
2023-05-23 09:46:31 +08:00
大佬,给个 GitHub 地址呀
L1shen
2023-05-23 13:52:28 +08:00
今天还看到一个文章,用 rust 加速 python

https://www.infoq.cn/article/DIt8eRMQd8mw1i3aV077

如果是有明显的热点可以试试用这种方法
nekoharuya
2023-05-23 14:26:32 +08:00
@L1shen 这个昨天也正好刷到,这类方案其实之前考虑过,最后还是放弃了,参考我在第 8 ,18 和 20 楼的回复
huskar
2023-05-23 14:48:15 +08:00
很感兴趣,搜了下 GOAP 感觉资料不是很多,楼主有没有介绍 GOAP 的博客?
这篇介绍 GOAP 原理的博客 https://blog.csdn.net/LIQIANGEASTSUN/article/details/79132514 可以参考吗?

我有做 ABM(agent-base model)模拟的经验,一开始也是用 python 结合 numpy 做,也尝试过用 cython 、mypyc 编译加速,但是用起来都有坑,最终还是改成编译语言了。感觉用 python 做计算密集还是不太行。abm 里 agent 的行为很简单,基本靠策略判断就能实现了,没有设计 ai 算法。

另外楼主试过用强化学习实现 AI 策略吗?
nekoharuya
2023-05-23 14:59:58 +08:00
@huskar 强化学习是一个方向,但是和俺这游戏设计理念不同,难点在于奖励机制不好设计,因为在这个游戏中,npc 没有一个明确的,统一的,游戏目标,npc 每个目标都是它自己顺着世界状态,推出来的,
nekoharuya
2023-05-23 15:03:22 +08:00
@huskar 除了上诉的奖励机制外,世界状态通常是计算出来的,而不是可以直接查值的,例如小明有没有喜欢的人,小红和小明的性格是否合拍,也就是说,上了强化学习,也并不能减少这块的硬性计算量

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

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

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

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

© 2021 V2EX