| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
本章介绍了强化学习方法在制作游戏 AI 方面的一些探索。利用强化学习方法,只需要部分的人工参与,就可以在竞速类、格斗类等游戏上建立快速的高质量游戏AI生成流程。这个流程不仅能够生产在竞技水平上与一流的人类玩家相匹配的AI,还在能力分级、拟人行为等方面做了许多适应实际游戏开发需要的工作。
本章首先介绍了常规赛车AI 的赛道表示和行驶控制方法,引出了该模型下的调参问题,并提出了遗传算法进行调参的解决方案;然后分别介绍了监督学习和强化学习的基础概念和原理,并对这两个方案面临的问题与挑战进行了简单分析。
监督学习和强化学习都是机器学习的方法,训练出来的神经网络模型对于大部分研发团队来说是一个黑盒,无法对里面进行精细化控制,较难满足各种应用场景。此外,游戏逻辑变更或新增额外功能,都可能导致训练出来的模型失效,需要重新建模训练。因此,建议在游戏项目初期选用传统方法搭建基础的游戏 AI,在核心玩法稳定的情况下再尝试机器学习的方法。但在核心玩法复杂的竞技游戏中,用传统方法开发高水平的AI 是件非常困难的事情,所以机器学习仍是一种非常不错的解决方案。
强化学习是学术界在游戏AI研究方面热门的方向之一,随着技术的提升和推广,会在越来越多的游戏中落地,提高行业水平。这些超高水平的游戏 AI 研发技术可以给游戏体验和玩法探索带来更多的可能性。
对于赛车AI 参数优化问题,可以根据遗传算法流程设计如图所示的训练流程。
(1)随机初始化n套赛车参数作为初始种群。
(2)每套参数放到同一辆车上在赛道上跑,计算成绩(适应度)。
(3)如果有足够优秀的成绩,则输出对应的参数作为结果。
(4)从n套参数中,按成绩的比例权重随机选择2套参数作为母体。
(5)把选中的2套参数进行交叉和变异得到新的2套参数。
(6) 把作为母体的2套参数放回原种群,新的2套参数放入新种群。
(7) 重复步骤(4)~步骤(6)共n/2次,共得到新的n套参数。
(8)用新的n套参数重复步骤(2)~步骤(7),直到得到符合条件的参数。
监督学习方案是让AI 学习人类玩家的操作的,因此AI 的能力上限理论上无法超越样本中的玩家。同时样本的选取会极大地影响AI 的能力表现。如果全都使用高端玩家录像的样本(失误少),则缺乏异常样本,训练出来的AI 应对异常突发情况的能力比较弱。如果加入中低端玩家的样本,则会拉低整体 AI 的能力水平。此外,在大部分赛道中,只在某些弯道上使用高阶技巧,因此高阶技巧的样本在整个赛道中的占比少,在训练时容易被忽略。所以在实际项目中,需要对样本进行分类和筛选,并且根据游戏特性设计复杂的网络结构,而不是简单地使用一个全连接网络。例如,先把操控左右和漂移的按键抽象成一个独立的模型,把复位刹车操作抽象成另外的模型,再把两个模型结合起来,从而控制赛车。
除此之外,监督学习方案必须要使用样本来训练模型。一些还没上线的游戏,由于缺少游戏样本,因此无法使用这个方案。
强化学习过程看起来简单,但是实际落地在项目时,会有很多需要处理的问题。例如,一个动作的价值需要一段时间才能体现出来,Reward 只是当前动作结束后的反馈结果,不能代表动作的长远价值,那么动作的长远价值如何体现?这里面就涉及 Bellman 方程和 Reward 回传的问题。因赛车游戏只看完成赛道的时间,不关心中间过程,只有冲线后才能得到 Reward,所以 Reward 回传的路径很长,需要大量的训练时间,才能回传到初始状态。此外,AI 只追求最终结果,不关心具体操作情况,所以最终训练出来的AI 可能操作频率非常高,超出人类操作的极限。还有可能出现一些操作或失误不像人类的情况。这些问题都需要花费时间进行优化,游戏才能达到较好的上线效果。虽然强化学习技术的挑战较大,但是它可以突破传统游戏 AI 方法的限制,探索出超越人类顶尖玩家的 AI,同时发掘更多新奇的玩法体系。通过大量的探索训练,我们可以发现游戏漏洞或平衡性问题,可以辅助验证新赛车、新角色的数值合理性。
Nvidia PhysX是 Nvidia 公司旗下的物理引擎,是世界顶尖的物理引擎之一。
以PhysX物理引擎为例,物理查询被分为3种:射线投射查询、扫掠查询和重叠查询。
射线投射查询:从原点4发射一条射线到目标点B,用这条射线与其他物理对象进行相交检查并获取相交信息,这种方式被称为射线投射查询。数学上的射线应该是无限长的,所以严格来说应该叫作向量投射查询更为合理。
扫掠查询:在物理世界中,将一个3D 几何体从 4 点移动到B点,检查3D几何体移动过程中与其他对象的相交情况并返回结果,这种方式被称为扫掠查询。如图所示为球体的扫掠查询。
重叠查询:在物理世界中,在某个位置指定一个3D几何体,用这个3D 几何体与其他对象进行相交检查并返回检查结果,这种方式称重叠查询,如图1所示。
大世界首当其冲的3个问题是规模、复杂度/性能、渲染,分别对应内容生产、内容承载和内容呈现。本章聚焦如何解决内容承载问题,即场景复杂度管理。在大世界场景里,通常有大面积地形、大规模植被、大量琐碎静态物件等,在相同的硬件平台下,复杂度管理方案很大程度上决定了大世界场景里填充内容的数量和质量。本章描述的大世界场景复杂度管理方案,基于控制理论中的负反馈控制系统,分为以下3个部分:
输入部分。包含复杂度降维、复杂度度量、对象评分计算。在引擎和玩法层面,根据游戏定制计算因子和权重,统一计算复杂度和评分,传递给控制器模块。
控制器/被控对象部分。包含 Visibility(可见性)检测系统、LOD(Level OfDetail,细节层级)系统、Scalabiity(可伸缩性)系统等。该部分根据输入和反馈信号,利用多种不同的复杂度控制算法综合调节系统当前负荷。
输出/反馈部分。用于实现 Adaptive Performance(自适应性能)系统。根据系统负荷能力、系统当前负荷和系统指定负荷,传递反馈信号到控制器模块。
整个系统,最终可以达成如下目标。
反馈控制器模块根据反馈的系统指标数据和期望的系统指标数据之间的差异,按照一定的策略发送控制指令给复杂度控制器模块,从而达到调节场景复杂度的目的。图13.18所示为反馈控制器流程图。
对图13.18的说明如下。
(1)初始化。根据当前硬件平台,初始化既定目标值:目标 FPS、场景复杂度总量、CPU时间、GPU时间、Memory数值、Draw Call 数值。
(2)计算当前视口场景复杂度,和目标复杂度比较,确定是否需要根据差值切换目标等级。是,跳到(1);否,跳到(3)。
(3)确定是否可以进行调节(上一次调节是否结束,当前环境是否允许新的调节动作)。否,等待;是,跳到(4)。
(4) 根据当前内存使用量,和目标内存数值比较,确定当前内存是否超标。
是,发送卸载对象指令;否,跳到(5)。
(5)根据当前GPU消耗,和目标GPU消耗进行比较,确定GPU 是否过载。
是,根据过载级别发送降低LOD 指令或隐藏对象指令;否,跳到(6)。
(6)根据当前 RHI Thread 的CPU消耗,和目标 CPU 消耗进行比较,确定 RHIIThread 是否过载。是,[当前Draw Call是否过高?是,发送 Draw Call 调节指令(切换 HLOD 或在 Renderer Thread没有过载的情况下动态合批);否,发送隐藏对象指令];否,发送升高LOD 指令或显示对象指令或取消HLOD 指令。
(7)根据当前 Renderer Thread 的CPU 消耗,和目标CPU 消耗进行比较,确定 Renderer Thread 是否过载。是,发送隐藏对象指令(调整植被等实例化对象的Scalability);否,发送显示对象指令(调整植被等实例化对象的 Scalability)。
(8)根据当前 Game Thread 的CPU消耗,和目标CPU消耗进行比较,确定Game Thread 是否过载。是,跳到(9);否,发送加载对象指令,跳到(9)。
(9)返回(2)。
本章提出了一种基于多级细节网格结构的场景加载方案,并在实际游戏中应用于移动端游戏超大型 3D 场景的加载和连续展现。图14.5展示了运行时固定区域场景物件随摄像机移动的改变情况,可以看到,当摄像机逐渐远离该区域时,该区域内的小物件很快就会消失,而重要的物件较晚才消失,从而保证了用户看到的物件的准确性及最小化内存加载。
本方案的优势在于预先将所有场景物件的位置连同重要度信息整理排列存储在一个数据结构中,实现了“越不重要的物件,加载越少越近”的目标,并可以根据重要度进行一些加载优先级上的优化。此外,这种场景结构的划分和处理可以完全实现自动化,在实际的项目应用中,场景的美术设计人员不需要关心场景物件的区块划分或分块设计,制作流程相对简单。
场景预处理成多级细节网格结构
加载过程
| Back | FazBrowse Home | New Git URL |