在 CPU 上计算矩阵占用了大部分帧时间

Calculating matrices on CPU takes up most of the frame time

我正在为一个简单的游戏编写一个简单的引擎,到目前为止,我喜欢我的小爱好项目,但游戏不断发展,现在一个场景中一次有大约 800 个游戏对象。

每个对象,就像在Unity中一样,都有一个变换组件,在组件初始化时计算变换矩阵。我开始注意到,对于 800 个对象,仅更新每个矩阵(例如,如果每个对象都已移动)就需要 5.4 毫秒,而无需任何其他组件或其他任何东西。

我使用 GLKit 数学库,出于某种原因,它比使用本机 simd 类型更快。使用 simd 类型使计算时间增加三倍

这是运行它的一段代码

    let Translation : GLKMatrix4 = GLKMatrix4MakeTranslation(position.x, position.y, position.z)
    let Scale : GLKMatrix4 = GLKMatrix4MakeScale(scale.x, scale.y, scale.z)
    let Rotation : GLKMatrix4 = GLKMatrix4MakeRotationFromEulerVector(rotation)
    
    //Produce model matrix
    let SRT = GLKMatrix4Multiply(Translation, GLKMatrix4Multiply(Rotation, Scale)) 

问题:我正在寻找一种优化方法,以便我可以使用更多游戏对象。并在我的对象上使用更多组件

您的程序中可能存在多个瓶颈。

  1. 优化您的框架依赖性以尽可能避免停顿,例如通过在 CPU 上预先计算帧数据。 This 是学习此技术的好资源。
  2. 确保所有矩阵都存储在一个从顶点阶段索引的 MTLBuffer 中
  3. 在 Apple 芯片上 iOS 使用 MTLResourceStorageModeShared
  4. 如果你真的想扩展到数万个对象,那么在计算着色器中计算你的矩阵以将它们存储在 MTLBuffer 中。然后,使用间接渲染发出绘制调用。
  5. 一般来说,了解一下AZDO

了解计算着色器:https://developer.apple.com/documentation/metal/basic_tasks_and_concepts/performing_calculations_on_a_gpu

了解间接渲染: https://developer.apple.com/documentation/metal/indirect_command_buffers