修复语法错误并使用RayWenderlich Metal Part 2教程不显示渲染

时间:2018-08-26 02:47:13

标签: swift metal

突然我遇到语法错误,我正在尝试学习Metal。我想知道为什么这个人试图添加一个UnsafeMutablePointer,但这不是重点。我尝试移动这些东西,以便它不会尝试向Insafe和UnsafeMutablePointer添加一个int,但是那个立方体完全消失了。

本教程似乎有一个编程语法错误,并将原因移到另一个参数中,否则根本无济于事(它将擦除所有内容)。 (这不是因为语言的更新)。

项目的Gitlab(我将其保存到一个文件中),问题出在67点左右。这是代码的样子:

memcpy(bufferPointer + MemoryLayout<Float>.size * Matrix4.numberOfElements(), projectionMatrix.raw(), MemoryLayout<Float>.size * Matrix4.numberOfElements())

如果您想仔细查看整个文件的上下文,请点击以下链接:

        let bufferPointer = uniformBuffer?.contents()
        memcpy(bufferPointer, nodeModelMatrix.raw(), MemoryLayout<Float>.size * Matrix4.numberOfElements())

        //come back to here
        memcpy(bufferPointer + MemoryLayout<Float>.size * Matrix4.numberOfElements(), projectionMatrix.raw(), MemoryLayout<Float>.size * Matrix4.numberOfElements())

1 个答案:

答案 0 :(得分:2)

这是由于Metal API在Swift 4和iOS 11左右发生的细微变化。

-newBufferWithLength:options:方法的返回类型从nonnull id<MTLBuffer>更改为nullable id<MTLBuffer>。结果,Swift“覆盖”中相应的makeBuffer(length:options:)方法的返回类型从MTLBuffer更改为MTLBuffer?

因此,如果您使用带有此API返回值的可选链接,则contents()方法将返回UnsafeMutableRawPointer?,而不是您想要的UnsafeMutableRawPointer。如果改为使用强制展开来确保从设备获取非零缓冲区,则所有指针算术类型检查都很好。

一些额外的要点:

  • 这不是original article中的语法错误,而是在不完全考虑API更改的情况下将Swift 3代码迁移到Swift 4的结果。
  • Int上添加UnsafeMutableRawPointer是完全有效的:它会将指针偏移该字节数,从而产生另一个UnsafeMutableRawPointer