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



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

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

我使用GLKit数学库,由于某些原因,它比使用原生simd类型更快。使用simd类型将的计算时间增加三倍

这是运行的pice代码

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上预计算帧数据。这是一个很好的资源来学习这项技术
  2. 确保所有矩阵都存储在一个MTLBuffer中,该MTLBuffer是从顶点阶段索引的
  3. 在Apple silicon和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

相关内容

最新更新