专栏名称: CSDN
CSDN精彩内容每日推荐。我们关注IT产品研发背后的那些人、技术和故事。
51好读  ›  专栏  ›  CSDN

游戏与算法的必经之路

CSDN  · 公众号  · 科技媒体  · 2016-12-30 13:40

正文

本文为姜雪伟原创文章,未经允许不得转载, 阅读原文查看作者有关《【系列直播】算法与游戏实战技术》经验分享。注:文中所有标蓝部分均可阅读原文获取详情。


前言


作为一个在IT行业工作十五年的老兵,笔者在这里将自己多年的学习游戏算法经验分享给读者,希望能够帮助那些想学习算法提升自己的读者。算法是IT产品研发的核心,在IT的任何领域都离不开算法,目前比较流行的IT领域有:大数据,人工智能,深度学习,游戏开发,虚拟现实,增强现实等,这些领域的核心都是算法,可见算法在IT领域的重要性。本文主要聚焦游戏算法,游戏开发不外乎3D引擎接口调用和游戏逻辑编写,3D游戏引擎的主要功能是渲染,渲染使用的是图形学算法针对GPU编程的。客户端逻辑的编写也会用到一些算法,比如抛物线算法,曲线插值算法,A*寻路算法等等。算法的优势主要体现在游戏核心功能和效率优化上面,作为IT程序员来说,如果对算法不精通,或者不知道如何在程序中使用算法,随着时间的推移会逐步被行业淘汰。当然大家也不必为此担心,笔者在此总结了学习算法必经之路的三个主要阶段。


第一阶段 基础篇


对于初始学习 算法 的读者,首先要把基础算法学好,也就是把大厦的地基要打牢,毛泽东说过“理论联系实际”,学习算法先要把理论知识学好,给读者推荐的学习资料是大学的经典课程《数据结构与算法》,涉及到的主要知识点有:快速排序,二叉树排序,二分查找,哈希表,二叉树等。掌握这些数据结构并能运用它们解决实际问题,千万不要死记硬背,亲自动手将算法书写一遍,编程的过程就是要反复的练习。另外,还要学习一些关于矩阵、向量运算的知识点,这些知识点也是游戏开发必备的。给读者推荐的资料是大学课程《线性代数》。掌握这些知识的方法就是读者都要动手将它们逐行代码敲一遍并且用脑子反复琢磨领会贯通。


以二叉树为例,介绍其在游戏开发中使用的案例,二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。它在游戏中应用案例给读者介绍一下,在游戏开发中经常使用图集,就是把多张小图片合成一张大的图片一次性加载到内存中,优化了内存加载效率,生成图集的算法就是用二叉树算法实现的,算法流程就是首先生成一块内存用于存储大图片,然后新建一个空的二叉树,把小图片看作是二叉树的子节点,依次去挂载到二叉树的叶子节点上,挂接的顺序采用的是先序遍历的思想,这样一张图集就生成了。如果本阶段的知识点读者已经掌握了可以直接略过,接下来进入第二阶段进阶篇。


第二阶段 进阶篇


在进阶篇阶段是学习一些相对基础篇比较复杂的算法,进阶篇的算法主要包括:A*算法,八叉树算法,Perlin噪音等,笔者建议学习的资料是关于游戏编程方面的书籍《游戏编程大师技巧》(上下册)这两本书非常经典,虽然其接口有些旧,但里面的编程理论非常适用游戏开发,笔者利用它的编程思想编写了一本适合初学者学习的《手把手教你架构3D游戏引擎》一书。


下面以八叉树算法为例给读者介绍其应用,八叉树(octree)是三维空间划分的数据结构之一,它用于加速空间查询, Octree的实现原理主要分为六步:


  • 第一步、设定最大递归深度;

  • 第二步、找出场景的最大尺寸,并以此尺寸建立第一个立方体;

  • 第三步、依序将单位元素丢入能被包含且没有子节点的立方体

  • 第四步、若没有达到最大递归深度,就进行细分八等份,再将该立方体所装的单位元元素全部分担给八个子立方体;

  • 第五步、若发现子立方体所分配到的单位元元素数量不为零且跟父立方体是一样的,则该子立方体停止细分,因为跟据空间分割理论,细分的空间所得到的分配必定较少,若是一样数目,则再怎么切数目还是一样,会造成无穷切割的情形;

  • 第六步、重复3步骤,直到达到最大递归深度。


给读者举个游戏案例,假设:我们有一个大的房间,房间里某个角落站了一只小动物,我们想很快的把小动物找出来,该如何做?我们可以把房间当成一个立方体,先切成八个小立方体,
然后排除掉没有放任何东西的小立方体,再把有可能藏小动物的小立方体继续切八
等份….如此下去,平均在Log8(房间内的所有物品数)的时间内就可找到小动物。
因此,八叉树就是用在3D空间中的场景管理,可以很快地知道物体在3D场景中的位置,或侦测与其它物体是否有碰撞以及是否在可视范围内。进而八叉树的应用场景可以推广到解决如下技术问题:


  • 一、用其加速用于可见性判断的视锥裁剪;

  • 二、加速射线投射,如用作视线判断或枪击判定;

  • 三、邻近查询,如查询玩家角色某半径范围内的敌方NPC;







请到「今天看啥」查看全文