Swift3 使用getter时,UnsafemeutableBufferPointer速度慢

Swift3 使用getter时,UnsafemeutableBufferPointer速度慢,swift3,core-audio,unsafemutablepointer,Swift3,Core Audio,Unsafemutablepointer,我有一台装有定制光环的AVAudioEngine。当我运行引擎时,cpu会出现峰值,这似乎与UnsafemtableBufferPointer.getter和.setter操作有关: func performRender(ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, inTimeStamp: UnsafePointer<AudioTimeStamp>, inBusNumber: UInt3

我有一台装有定制光环的AVAudioEngine。当我运行引擎时,cpu会出现峰值,这似乎与UnsafemtableBufferPointer.getter和.setter操作有关:

func performRender(ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>, inTimeStamp: UnsafePointer<AudioTimeStamp>, inBusNumber: UInt32, inNumberFrames: UInt32, ioData: UnsafeMutablePointer<AudioBufferList>?) -> OSStatus {

    let blI = UnsafeMutableAudioBufferListPointer(ioData)

    let numSamples = Int((blI?[0].mDataByteSize)! / UInt32(MemoryLayout<Float32>.stride))

    for input in 0 ..< blI!.count{

        let bI = blI?[input]

        guard let inputData = bI?.mData else {

            //assert(false)

            return kAudioUnitErr_Uninitialized
        }

        let samplesBI = UnsafeMutablePointer<Float32>(inputData.assumingMemoryBound(to: Float32.self))

        let samplesI = UnsafeMutableBufferPointer<Float32>(start: samplesBI, count: numSamples)

        for sampleIndex in 0 ..< samplesI.count {

            samplesI[sampleIndex] *= 0.5
        }

    }

    return noErr
}
func performRender(ioActionFlags:UnsafeMutablePointer


什么会导致获取和设置指针数据的这种低效行为?因为它正在处理音频样本,因此低效会导致音频信号中断。

您可以跳过UnsafeMutableBufferPointer()调用,直接为样本指针编制索引:

let bufferListPtr = UnsafeMutableAudioBufferListPointer(ioData)
...
let mBuffer : AudioBuffer = bufferListPtr[0]
let count = Int(mBuffer.mDataByteSize) / yourSampleSizeInBytes
let dataPointer = UnsafeMutableRawPointer(mBuffer.mData)
if let dptr = dataPointer {
    let sampleArray = dptr.assumingMemoryBound(to: yourSampleType.self)
    for i in 0..<(count) {
        let x = sampleArray[i]
        let y = myModifySample( x )   
        sampleArray[i] =  y 
    }
}
let bufferListPtr=UnsafeMutableAudioBufferListPointer(ioData)
...
让mBuffer:AudioBuffer=bufferListPtr[0]
让count=Int(mBuffer.mDataByteSize)/yourSampleSizeInBytes
让dataPointer=unsafemeutablerawpointer(mBuffer.mData)
如果让dptr=dataPointer{
让sampleArray=dptr.AssumingMemoryBind(到:yourSampleType.self)
因为我在0。。