突然我遇到语法错误,我正在尝试学习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())
答案 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
。如果改为使用强制展开来确保从设备获取非零缓冲区,则所有指针算术类型检查都很好。
一些额外的要点:
Int
上添加UnsafeMutableRawPointer
是完全有效的:它会将指针偏移该字节数,从而产生另一个UnsafeMutableRawPointer
。