画布 1
游戏前端
  GamePlay
    核心玩法
      战斗
        回合制
        即时制
          remote同步
            帧同步
            状态同步
        PVP
          托管AI
        PVE
          怪物AI
        AI
          行为系统
            状态机（StateMachine）
              有限状态机（FSM）
                包含
                  状态（State）
                  转移（Transition）
                扩展
                  并发状态机：持有多个状态引用，每个对应一个状态机
                  分层状态机：状态可以有父状态。当一个事件进来，如果子状态没有处理，它就会交给链上的父状态
                  下推状态机：用一个栈保存历史状态，用于回想上一个状态
            行为树（Behavior Tree）：由行为节点组成的树状结构
              组成
                节点
                  行为节点
                    动作（Action）节点：根据动作结果返回成功，失败，或运行
                  逻辑节点
                    Selector
                      优先选择（Priority Selector）：从左到右遍历自己的子节点，如果子节点的准入条件符合信息的话，就执行该子节点。
                      序列选择（Sequence Selector）：从左到右按顺序执行子节点，并且仅仅在一个子节点执行完成后才执行下一个子节点。顺序执行所有子节点返回成功，如果某个子节点失败返回失败。
                      随机选择（Random Selector）
                    同步（Parallel）节点：让所有子节点同时运行，可以使当所有子节点都完成的时候结束，也可以让任一子节点完成时结束，视乎需要来做出选择
                  状态
                    ready
                    running
                    success
                    failed
                黑板（BlackBoard）
                  用于共享数据
              扩展
                分层行为树
                  策略逻辑
                  执行逻辑
    物理
      寻路
        静态地形
          A*算法
            基石
              Djikstra算法
                带权最短路径
                倾向于距离起点较近的节点
              最好优先搜索(best-first search)
                启发值
                倾向于距离目标较近的节点
            g(n)表示从起点到任意节点n的路径花费
            Heuristics：h(n)表示从节点n到目标节点路径花费的估计值（启发值）
              可以预算计算来优化
              曼哈顿距离(Manhattan distance)：用于方形网格标准的启发式函数
              欧几里得距离：欧几里得空间中两点间“普通”（即直线）距离
              红，黄，蓝是曼哈顿距离，绿色是欧几里得距离
            f(n)=g(n)+h(n)：A*算法将每次检测具有最小f(n)值的节点
              g(n)和h(n)需要相同的单位来度量
              f值相等时的决胜法(Breaking ties)
                为了避免f值相同，可以添加一个引子p来稍微增大启发值，heuristic *= (1.0 + p)，这个p叫做比例型决胜值（tie breaker）
                替换地图表征可以通过减少图形上结点的数量来解决这个问题。将多个结点归于一个，或删除重要结点外的所有结点。
                Jump Point 搜索跳过大面积含有大量关系的结点；该方法被设计用于方形网格
                AlphA* 算法添加了一些深度优先搜索到A* 通常的广度优先的行为中，以便它可以探索单条路径而不是同时处理所有这些路径。
                Fringe 搜索(PDF)?通过结点快速处理来解决这个问题。它分批处理结点，只扩展具有低f值的结点，而不是保存一个排序的开放集，并一次访问一个结点。这涉及到HOT 队列方法。
            实现：一个主循环，重复地从OPEN集中取最优节点n（即f值最小的节点）来检测。如果n是目标节点，那么算法结束；否则，将节点n从OPEN集删除，并添加到CLOSED集中，然后查看n的所有邻节点n’。如果邻节点在CLOSED集，它已被检测过，则无需再检测（*）；如果邻节点在OPEN集，它将会被检测，则无需此时检测（*）；否则，将该邻节点加入OPEN集，设置其父节点为n，到n’的路径开销g(n’) = g(n) + movementcost(n, n’)。
              OPEN 集：已访问区域的边界
                数据结构选择
                  无序数组或链表
                  有序数组
                  有序链表
                  二叉堆
                  有序跳跃列表（sorted skip lists）
                  索引数组（indexed arrays）
                  哈希表
                  伸展树（splay trees）
                  HOT（Heap On Top）队列
              CLOSED 集：已访问区域的内部
              Python和C++实现
              优化
                时间优化
                  缩减图的大小
                    考虑用导航网格（navigation meshes）代替网格（grids）
                    考虑分层地图表示（hierarchical map representations）
                  提高启发式函数的准确性
                  加快启发式值运算，如缓存启发值
                  优先级队列更快
                  提前退出
                  群体移动，计算一次路径，其他单元保持队形
                  先近似计算，等到有备用CPU资源时，再计算一条更好的路径（多线程）
                空间优化
                  路径压缩
                  位置点存储
                  方向存储
                  计算路径点
                  限制路径长度
            变体
              定向搜索：对OPEN集合大小设置约束条件
              迭代深化（Iterative deepening）：开始的时候给一个估计值，然后通过迭代使它越来越精确。“深度”是 f 值当前的一个截断值。当 f 值太大的时候，节点不会被考虑（也就是说，不会被加入到OPEN集中）。第一次循环时，只需要处理非常少的节点。随后的每次循环，都会增加访问的节点数。如果发现路径得到优化，就继续增加当前的截断值，否则结束。
              动态加权
              带宽搜索
              双向搜索
              动态A*（D*）可以用于在不知道全部地图信息的情况进行寻路
              终身规划A*可以重复利用以前的A*计算来产生新的路径
              跳跃点搜索
              Theta*
            处理移动中的障碍物
              重新计算路径
              路径剪接
              监视地图的改变
              预测障碍物移动
            地图表示
              网格（Grid）
                图块移动（Tile movement）
                边移动（Edge movement）
                顶点移动（Vertex movement）
              多边形地图（Polygonal maps）
              导航网（Navigation Meshes）：不用多边形表示障碍，而是将可行区域用不重叠的多边形表示，这也被称为导航网
                多边形移动（Polygon movement）
                多边形边移动（Polygon edge movement）
                多边形顶点移动（Polygon vertex movement）
                混合式移动（Hybrid movement）
              分层（Hierarchical）：使用多层次搜索
                异构层次结构（heterogenous hierarchy）
                  通常有固定层数
                  每层可以用不同的地图表示
                同质层次结构（homogeneous hierarchy）
                  层数任意
                  每层都有相同的特性
                  四叉树和八叉树就是同质层次结构
              环绕式地图（Wraparound maps）：物体可以从地图的一端绕到另一端
              连通组件（Connected Components）
              道路图（Road maps）
              路标（Waypoints）
              跳跃链（Skip links）
            结合Djikstra算法和BFS算法的有点
        动态地形
          D*算法
      碰撞检测
        Rigidbody
        Collider
      可见性检测
  表现
    动画系统
      动画的导入与设置
      动画状态机
        并发状态机
          动画混合：如上半身播射击，下半身播跑步
            LayerMask
          附加动画：跑步时受击，受击动画附加在跑步动画上
          以Unity中的Animator状态机来看
      骨骼动画
        动画融合：用于平滑过渡动画切换的过程
      帧动画
    Avatar系统
    UI
    音效系统
      音频的导入与设置
      播放
        分层播放
        混音
    渲染
      粒子系统（Particle System）：模拟一些特定的模糊现象的技术
        粒子发射器
          粒子行为参数
            粒子生成速度（即单位时间粒子生成的数目）
            粒子初始速度向量（例如什么时候向什么方向运动）
            粒子寿命（经过多长时间粒子湮灭）
            粒子颜色
            粒子生命周期中的变化以及其它参数
          三维空间中的位置
        更新循环
          模拟阶段：根据生成速度以及更新间隔计算新粒子的数目，每个粒子根据发射器的位置及给定的生成区域在特定的三维空间位置生成，并且根据发射器的参数初始化每个粒子的速度、颜色、生命周期等等参数
          渲染阶段：通常每个例子用经过纹理映射的四边形sprite进行渲染，也就是说四边形总是面向观察者。但是，这个过程不是必须的，在一些低分辨率或者处理能力有限的场合粒子可能仅仅渲染成一个像素，在离线渲染中甚至渲染成一个元球，从粒子元球计算出的等值面可以得到相当好的液体表面。另外，也可以用三维网格渲染粒子。
      渲染管线
        应用程序阶段（Application State）
          准备场景数据
            摄像机的位置
            视锥体
            场景中的模型
            光源
            将数据加载到显存中
          粗粒度剔除（culling）
          设置模型的渲染状态
            指定材质
              漫反射颜色
              高光颜色
            指定纹理
            指定Shader
              指定顶点着色器（Vertex Shader）
              指定片元着色器（Fragment Shader）
            指定光源属性
          调用DrawCall
            发起方：CPU
            接收方：GPU
            命令缓冲区（Command Buffer）：可放入改变渲染状态、DrawCall在内的多种命令
        几何阶段（Geometry Stage）
          顶点着色器（Vertex Shader）：完全可编程，通常用于实现顶点的空间变换、顶点着色等功能
            坐标变换
              对顶点坐标进行某种变换
                可模拟水面，布料等
              把顶点坐标从模型空间转换到齐次裁剪空间，接着通常再由硬件做透视除法后，最终得到归一化的设备坐标（Normalized Device Coordinates， NDC）
            逐顶点光照
            输出后续阶段所需的数据，如纹理坐标
          曲面细分着色器（Tessellation Shader）：用于细分图元
          几何着色器（Geometry Shader）：执行逐图元（Per-Primitive）的着色操作或产生更多图元
          裁剪（Clipping）：将摄像机视野外的顶点裁剪掉，并剔除某些三角图元的面片
            可配置
          屏幕映射（Screen Mapping）：把每个图元的坐标转换到屏幕坐标中
            不可配置
            只将x和y坐标缩放到屏幕坐标系（Screen Coordinates），z值保留，屏幕坐标系和z坐标一起构成了窗口坐标系（Window Coordinates）
          可编程
        光栅化阶段（Rasterizer Stage）
          三角形设置（Triangle Setup）：计算光栅化一个三角网格所需的信息
          三角形遍历（Triangle Traversal）：检查每个像素是否被一个三角网格覆盖，如果被覆盖的话，就生成一个片元（fragment）
            一个片元并不是像素，而是包含了很多状态的集合
          片元着色器（Fragment Shader）：用于实现逐片元（Per-Fragment）的着色操作
            可编程
            纹理采样
          逐片元操作（Per-Fragment Operations，OpenGL的说法。）或称输出合并阶段（Output-Merger，DirectX的说法）
            模板测试（Stencil Test）
              该片元的模板值
                使用读取掩码在模板缓冲区（Stencil Buffer）中读取
              参考值（reference value）
                使用读取掩码
              使用开发者指定的比较函数决定是否舍弃该片元
                不管通过与否都能修改模板缓冲区的值
            深度测试（Depth Test）
              该片元深度值
              深度缓冲区的深度值
              使用开发者指定的比较函数决定是否通过
                通过才有资格修改深度缓冲区的值
                  通过开启/关闭深度写入实现
              这里的测试顺序并不是唯一的，例如，将深度测试提前进行以提高性能的Early-Z技术
            混合（Blend）
              源颜色：片元着色器得到的颜色
              模板颜色：颜色缓冲区中的颜色
              使用混合函数进行混合操作
            可配置
          固定函数（Fixed-Function）阶段
        后置缓冲（Back Buffer）：使用双重缓冲（Double Buffering）策略避免看到正在进行光栅化的图元。渲染完成后通过一个swap交换操作将前置缓冲（Front Buffer）和后置缓冲中的内容交换。
  周边系统
    新手引导
    成就系统
    任务系统
    商城系统
  优化
    CPU
      脚本效率
        GC优化
        算法优化
      并发执行
    GPU
      减少DrawCall
        Batch批处理
          避免使用大量小的网格，或尽量合并它们
          避免使用过多的材质
          比较适合静态物体
      减少需要处理的顶点数目
        优化几何体
        模型的LOD技术
        遮挡剔除技术
      减少需要处理的片元数目
        控制绘制顺序
        减少或优化半透明物体
          由于手机的GPU架构（PowerVR），渲染透明物体时尽量使用Alpha Blend而不是Alpha Test
        减少实时光照和阴影
      节省带宽
        减少纹理大小
        利用分辨率缩放
      减少计算复杂度
        Shader的LOD技术
        采用精度稍低的数据类型
        根据硬件条件进行缩放
    包体大小
      按需资源加载
    网络优化
      UDP代替TCP，降低延迟