Swift中如何获取SIMD4<Float>的UnsafeRawPointer写入Metal缓冲区?
解决Swift中SIMD4转UnsafeRawPointer写入Metal缓冲区的问题
要解决这个类型不匹配的错误,你可以用以下两种方式获取SIMD4
方法一:使用withUnsafeBytes(推荐,安全)
这是Swift官方推荐的安全获取内存指针的方式,它会自动管理指针的生命周期,避免野指针风险:
var color = SIMD4<Float>(1, 0, 0, 0) var colorBuffer: MTLBuffer! let size = MemoryLayout<SIMD4<Float>>.size color.withUnsafeBytes { rawBufferPointer in guard let baseAddress = rawBufferPointer.baseAddress else { // 可选:处理空指针的异常情况 return } colorBuffer = Renderer.device.makeBuffer(bytes: baseAddress, length: size) }
withUnsafeBytes会临时暴露color的内存区域,闭包内的rawBufferPointer.baseAddress就是我们需要的UnsafeRawPointer,直接传给makeBuffer的bytes参数即可。
方法二:直接取变量内存地址(不推荐,需注意生命周期)
如果你需要更简洁的写法,可以直接通过&符号获取变量的inout引用,再转为UnsafeRawPointer:
var color = SIMD4<Float>(1, 0, 0, 0) var colorBuffer: MTLBuffer! let size = MemoryLayout<SIMD4<Float>>.size colorBuffer = Renderer.device.makeBuffer(bytes: UnsafeRawPointer(&color), length: size)
这种方式要注意:必须保证color变量在makeBuffer执行完成前不会被释放或修改,否则可能导致内存访问错误,所以更建议用第一种安全方式。
本质原因是Metal的makeBuffer(bytes:length:)需要指向数据内存的原始指针,而SIMD4
内容的提问来源于stack exchange,提问作者wigging
相关产品推荐
相关产品推荐

