note/src/z/zengine/版本计划.md
2025-02-06 09:23:04 +08:00

4.5 KiB
Raw Blame History

aliases tags creation date modification date
2025-01-04 11:22 Saturday 4th January 2025 11:22:39

Games101

顶点着色器

数据输入

  • 顶点布局
    • 每个顶点独有,且渲染中不变的数据
    • 模型顶点坐标、uv贴图、蒙皮骨骼
  • 可变独占
    • 每个顶点独有直接映射为纹理通过uv坐标访问
  • 共享资源
    • 每个顶点共享,经常变化的数据
    • MVP矩阵 、光照信息

空间变化

考虑相同模型的不同物体

  • 模型空间
    • 来自美术提供的源文件共用同一份GPU顶点缓冲区
    • 加载模型骨骼动画,顶点蒙皮缓冲区
  • 动画空间 动画可以不一样,动画进度也可以不一样
    • 骨骼动画
      • CPU更新每根骨骼的位置
      • 加权计算蒙皮骨骼变换
        • 一个顶点加权4根骨骼就够了
    • 纹理动画
      • 普通关键帧动画
      • 骨骼动画烘培成纹理动画
  • MVP矩阵
    • 世界空间
      • 模型变换矩阵 * 动画矩阵
      • 对单位向量进行变换,计算很方便
      • 模型坐标、模型xyz旋转、模型缩放
      • M = T * R * S 先缩放,再旋转,最后平移
      • 如何计算xyz旋转矩阵呢
        • 固定一个轴,然后计算另外两个轴旋转后的坐标,能直接写出绕轴的旋转矩阵
        • 三个矩阵相乘就是最终旋转矩阵顺序呢UE是先Z再X再Y
    • 相机空间
      • 相机透视矩阵 * 世界空间
      • 要变换回单位向量,计算很复杂
        • 可以放过来求逆
        • 单位向量进行变换
        • 正交矩阵的逆是矩阵转置
          • 单位向量依然是单位向量
          • 单位向量依然互相垂直
          • 正交矩阵只改变了单位向量的方向
      • 相机坐标、相机朝向、相机UP方向
        • 相机朝向要变为-z方向up方向要变为y方向
        • x 方向由 -z 和 y 叉乘得到
    • 投影空间
      • 相机投影矩阵 * 相机空间
      • 正交投影
        • 相机空间投影到立方体[-1,1]^3
        • 要变换回单位向量
        • 先平移再缩放
      • 透视投影
        • 正交投影矩阵(线性) * 透视投影矩阵(非线性)
      • 非线性变化特点
        • 把四棱锥挤压成长方体
        • 压缩有一个系数比n/z三个坐标都有变化,z坐标变化未知
        • z坐标在近平面和远平面需要保持z不变
        • 列出方程,求解矩阵
        • An + B = nn
        • Af + B = ff
        • n 0 0 0
        • 0 n 0 0
        • 0 0 n+f -nf
        • 0 0 1 0
    • MVP矩阵 = 相机投影矩阵 * 相机矩阵 * 模型矩阵(TRS)

光线追踪

空间划分

  • 网格
    • 体素游戏
    • 实现简单,空间开销大
    • 寻路方便、划分简单
  • 四叉树、八叉树 空间划分成四/八份, 检测子空间物体数量,数量太多就递归划分子空间
    • 和维度相关,分叉太多
    • 跨节点物体存储浪费
    • 动态物体会频繁变更节点树
  • BSP树 二叉树,每次使用超平面分割空间,分割时采取空间或物体均匀划分
    • 构建复杂,适合室内场景优化
    • 不适合处理动态物体需要重新构建BSP树
  • KD树
    • 超平面是轴对齐的特殊BSP树
  • BVH树

数学算法

  • 判断点和平面的关系

多线程

手机端,多线程拆分太细,会导致新的问题发热、耗电快

所以当任务量较小时,应该退化为单线程

实现

任务

  • 对任务进行封装,变成一个可执行单元
  • 从线程池获取线程,执行任务
  • 线程调度优先级、CPU大小核

线程安全

  • 原子操作
    • std::atomic
  • 加锁
  • 无锁
    • 如果操作是线性的
    • 可以使用CAS循环操作
  • 同步、异步
    • 条件变量、信号量

任务

IO

  • 我希望序列化的对象内存都是临时内存
  • 序列化要有一个单独的内存分配器

渲染

  • 封装记录API命令然后再交给渲染线程
    • 只能降低api调用耗时但是现代api开销没那么大
  • 复制对象状态,传递给渲染线程绘制
    • 空间换时间,性能更好
    • 可见性检测、批处理、api调用

粒子

物理

动画

Job系统

  • 比如物理线程中,可以一次开多个小线程,并行计数,然后等待计算结果

内存管理

  • 初始化后,大小不变的堆数组
    • 需要快速申请、快速释放
  • 存储相同子类型的特殊数组
    • 顶点缓冲区
  • 存储子类型的特殊数组,要求访问连续
  • 帧缓存区、全局缓冲区、可回收缓冲区

异步回调

  • 这样对异步资源需要进行封装
  • 需要能让资源还能正常组装,而没有深度依赖
  • 需要知道何时加载完毕
  • 可以由异步切换到同步