AI 开发人员工作的最大限制是机器的物理限制。游戏 AI 没有数日的处理时间和 TB 级的内存,我们甚至无法使用运行游戏的计算机的所有处理器和内存。其他任务需要空间和时间,比如图形、声音、网络和输入。在团队中,不同团队的开发人员必须同时从事他们的专业工作,CPU和内存预算通常会有严格的限制。
学术界或商业研究中的 AI 技术没有得到广泛应用的原因之一是它们的处理时间或内存需求,在一个简单的演示中引人注目的算法可能会使成品游戏直接卡死。
本节讨论与AI代码的设计和构造相关的底层硬件问题,这里所包含的大部分内容是对所有游戏代码的一般建议,如果你只是刚刚接触游戏编程,只是想了解 AI 相关内容,你可以直接跳过这篇文章,问题不大。
一、处理器问题
对游戏效率最明显的限制是它所运行的处理器的速度。最初,所有的游戏机都有一个主处理器,它也负责图形处理;而现在大多数游戏硬件都有几个 CPU,以及专门用于处理图形的 GPU。
一般来说,CPU 更快更灵活,而 GPU 更并行。当一个任务可以被分割成许多简单的子任务,所有的子任务都同时运行时,GPU 上的数十到数千个处理核可以比相同的任务在 CPU 上顺序运行快数量级。
显卡驱动程序过去有固定函数的管道,其中的图形代码被内置到驱动程序中,并且只能在狭窄的参数内进行调整,因此除了显卡上的图形之外,不可能做很多其他的事情。而现在的驱动支持 Vulkan、DirectX 11、CUDA 和 OpenCL 等技术,这些技术允许通用代码在 GPU 上执行,所以更多的功能被转移到GPU,从而释放了更多的 CPU 处理能力。
在过去的 20 年里,用于 AI 的处理时间持续地增长。随着处理器速度的提高,这对于希望应用更复杂算法的 AI 开发人员来说显然是个好消息,尤其是在决策和战略制定方面。但是,尽管处理器时间的不断改进有助于开发新技术,但它们并不能解决根本问题,许多 AI 算法需要很长时间运行。一个功能全面的寻路系统会花费几十毫秒运行每个角色,很显然,在一个有 1000 个角色的 RTS 游戏中,没办法每一帧都运行。
在游戏中发挥作用的复杂 AI 需要被分解成小的组件以便进行分帧,将类似的这些技术应用于高开销的 AI 算法可以将它们带入到实际的应用中。
在过去的10年里,这个行业的一个大变化是 C++ 不再称霸游戏编程。现在,角色行为、游戏逻辑和 AI 通常是用高级语言编写的,比如 C#、Swift、Java,甚至是脚本语言比如 Python、Lua、Javascript等。这一点很重要,因为这些语言为程序员提供了更少的微操能力,比如内存管理。有 AI 程序员仍然写 C++,这需要对处理器的性能特征有着比较好的基础知识,但这样的程序员往往是致力于 AI