Swift Metal调用makeBuffer传Int值报错无法转UnsafeRawPointer
问题原因
makeBuffer(bytes:length:options:)方法的bytes参数要求传入UnsafeRawPointer类型的内存指针。
- 传入
[Int]数组时,Swift编译器会针对数组类型做特殊的隐式桥接:自动把数组底层连续存储的内存首地址传过去,因此可以正常编译。 - 传入单个
Int值时,普通值类型没有这套自动桥接规则,编译器无法直接获取值对应的内存指针传入参数,因此会抛出类型不匹配的编译错误。
另外你贴的代码里创建graphBuff时length参数用到的count变量没有在函数内定义,实际使用时需要替换为gra.count,否则也会触发编译错误。
正确实现方案
你可以任选以下两种方式创建存储单个Int值的Metal缓冲区:
方式1:通过withUnsafeBytes直接获取值的指针传入
直接通过Swift标准库的withUnsafeBytes方法拿到当前值的临时内存指针,传入makeBuffer即可:
let distanceBuff = withUnsafeBytes(of: dist) { bufferPtr in device?.makeBuffer( bytes: bufferPtr.baseAddress!, length: MemoryLayout<Int>.size, options: .storageModeShared ) }
方式2:先创建空缓冲区再写入值(更推荐)
先分配对应大小的Metal缓冲区,再把值直接写入缓冲区管理的内存,这种方式不需要处理临时指针的生命周期问题,稳定性更高:
// 先创建指定长度的缓冲区 guard let distanceBuff = device?.makeBuffer( length: MemoryLayout<Int>.size, options: .storageModeShared ) else { // 在这里处理缓冲区创建失败的逻辑,比如Metal设备不可用的场景 return } // 将dist的值写入缓冲区内存 distanceBuff.contents().storeBytes(of: dist, as: Int.self)
内容的提问来源于stack exchange,提问作者blkpingu
相关产品推荐
相关产品推荐

