在 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))
问题:我正在寻找一种优化方法,以便我可以使用更多游戏对象。并在我的对象上使用更多组件
您的程序中可能存在多个瓶颈。
- 优化您的框架依赖性以尽可能避免停顿,例如通过在 CPU 上预先计算帧数据。 This 是学习此技术的好资源。
- 确保所有矩阵都存储在一个从顶点阶段索引的 MTLBuffer 中
- 在 Apple 芯片上 iOS 使用 MTLResourceStorageModeShared
- 如果你真的想扩展到数万个对象,那么在计算着色器中计算你的矩阵以将它们存储在 MTLBuffer 中。然后,使用间接渲染发出绘制调用。
- 一般来说,了解一下AZDO。
了解间接渲染:
https://developer.apple.com/documentation/metal/indirect_command_buffers
我正在为一个简单的游戏编写一个简单的引擎,到目前为止,我喜欢我的小爱好项目,但游戏不断发展,现在一个场景中一次有大约 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))
问题:我正在寻找一种优化方法,以便我可以使用更多游戏对象。并在我的对象上使用更多组件
您的程序中可能存在多个瓶颈。
- 优化您的框架依赖性以尽可能避免停顿,例如通过在 CPU 上预先计算帧数据。 This 是学习此技术的好资源。
- 确保所有矩阵都存储在一个从顶点阶段索引的 MTLBuffer 中
- 在 Apple 芯片上 iOS 使用 MTLResourceStorageModeShared
- 如果你真的想扩展到数万个对象,那么在计算着色器中计算你的矩阵以将它们存储在 MTLBuffer 中。然后,使用间接渲染发出绘制调用。
- 一般来说,了解一下AZDO。
了解间接渲染: https://developer.apple.com/documentation/metal/indirect_command_buffers