Getter를 사용할 때 UnsafeMutableBufferPointer가 느립니다.

WJM

사용자 지정 AURenderCallback이있는 AVAudioEngine이 있습니다. 엔진을 실행할 때 CPU가 급증하고 UnsafeMutableBufferPointer.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
}

기기 디버그 세션

포인터 데이터를 가져오고 설정하는이 비효율적 인 동작의 원인은 무엇입니까? 오디오 샘플에서 작동하기 때문에 비 효율성으로 인해 오디오 신호가 끊깁니다.

hotpaw2

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 
    }
}

mySampleType (크기 = 2 바이트)에 Int16을 사용하지만 4 바이트 유형의 Float에서도 작동합니다.

원시 메모리 포인터를 직접 사용하면 버퍼 getter / setter 비 효율성을 피할 수 있습니다 (또한 유효성 검사도 가능하므로주의하십시오!).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ListItem에서 여러 Imageview를 사용할 때 Android 사용자 정의 Listview가 너무 느립니다.

분류에서Dev

HD로 비디오를 재생할 때 Netflix가 느립니다.

분류에서Dev

HD로 비디오를 재생할 때 Netflix가 느립니다.

분류에서Dev

효과를 렌더링 할 때 GLSurfaceView가 너무 느립니다.

분류에서Dev

QString :: split 함수를 사용할 때 performace가 느려집니다.

분류에서Dev

MySQL 쿼리는 ORDER BY 필드 DESC 및 LIMIT를 사용할 때만 느립니다.

분류에서Dev

onMouseMove ()를 사용할 때 ReactJS에서 사용자 정의 드래그 가능한 구성 요소가 너무 느립니다.

분류에서Dev

티를 사용할 때 스크립트가 걸려서 기다립니다. 왜?

분류에서Dev

GPU에서 계산에 사용자 정의 함수를 사용할 때 Matlab이 느립니다.

분류에서Dev

flutter에서 provider를 사용할 때 getter가 null에서 호출되었습니다.

분류에서Dev

IP 카메라를 사용할 때 ffmpeg가 너무 느리게 시작됩니다 (OpenCV 사용과 동일).

분류에서Dev

동시 요청을 할 때 PHP curl localhost가 느립니다.

분류에서Dev

Java에서 Apache Spark로 cassandra를 쿼리 할 때 느립니다.

분류에서Dev

사용자가 C # WPF를 클릭 할 때까지 기다립니다.

분류에서Dev

탭 페이지를 이동할 때 컨트롤을 그리는 속도가 느립니다.

분류에서Dev

tensorflow를 실행할 때 htop cpu가 거의 빨간색이며 예측이 매우 느립니다.

분류에서Dev

Groovy 스크립트에 외부 파일을 사용할 때 JMeter가 느려집니다.

분류에서Dev

tf.function을 사용할 때 Tensorflow 요소 현명한 그라디언트가 느립니다.

분류에서Dev

새 SSD를 사용하면 Windows가 매우 느립니다.

분류에서Dev

Sequelize에서 TypeScript를 사용할 때`getDataValue ()`를 사용하지 않으면 기본 getter가 값을 반환하지 않습니다.

분류에서Dev

우리가 직접 자바 액세스 전용 변수를 setter 메소드를 사용할 수있을 때 왜 getter 메소드를 사용합니까?

분류에서Dev

vuex에서 다른 getter가 변경되었을 때 getter를 다시 계산할 수 있습니까?

분류에서Dev

C ++ : waitpid를 사용할 때 자식 프로세스가 종료 될 때까지 기다립니다.

분류에서Dev

Ubuntu 16.04 systemd 서비스는 etc / network / interfaces를 사용할 때 dhclient가 완료 될 때까지 기다립니다.

분류에서Dev

및 또는 절을 추가 할 때 MySql Left Join이 느립니다.

분류에서Dev

SQLite는 큰 테이블에서 .import를 수행 할 때 매우 느립니다.

분류에서Dev

swift는 REST POST 요청 후 뷰를 업데이트 할 때 느립니다.

분류에서Dev

메모장 ++은 이제 검색 / 바꾸기를 할 때 정말 느립니다.

분류에서Dev

venv를 사용할 때 환경 $ PATH가 다릅니다.

Related 관련 기사

  1. 1

    ListItem에서 여러 Imageview를 사용할 때 Android 사용자 정의 Listview가 너무 느립니다.

  2. 2

    HD로 비디오를 재생할 때 Netflix가 느립니다.

  3. 3

    HD로 비디오를 재생할 때 Netflix가 느립니다.

  4. 4

    효과를 렌더링 할 때 GLSurfaceView가 너무 느립니다.

  5. 5

    QString :: split 함수를 사용할 때 performace가 느려집니다.

  6. 6

    MySQL 쿼리는 ORDER BY 필드 DESC 및 LIMIT를 사용할 때만 느립니다.

  7. 7

    onMouseMove ()를 사용할 때 ReactJS에서 사용자 정의 드래그 가능한 구성 요소가 너무 느립니다.

  8. 8

    티를 사용할 때 스크립트가 걸려서 기다립니다. 왜?

  9. 9

    GPU에서 계산에 사용자 정의 함수를 사용할 때 Matlab이 느립니다.

  10. 10

    flutter에서 provider를 사용할 때 getter가 null에서 호출되었습니다.

  11. 11

    IP 카메라를 사용할 때 ffmpeg가 너무 느리게 시작됩니다 (OpenCV 사용과 동일).

  12. 12

    동시 요청을 할 때 PHP curl localhost가 느립니다.

  13. 13

    Java에서 Apache Spark로 cassandra를 쿼리 할 때 느립니다.

  14. 14

    사용자가 C # WPF를 클릭 할 때까지 기다립니다.

  15. 15

    탭 페이지를 이동할 때 컨트롤을 그리는 속도가 느립니다.

  16. 16

    tensorflow를 실행할 때 htop cpu가 거의 빨간색이며 예측이 매우 느립니다.

  17. 17

    Groovy 스크립트에 외부 파일을 사용할 때 JMeter가 느려집니다.

  18. 18

    tf.function을 사용할 때 Tensorflow 요소 현명한 그라디언트가 느립니다.

  19. 19

    새 SSD를 사용하면 Windows가 매우 느립니다.

  20. 20

    Sequelize에서 TypeScript를 사용할 때`getDataValue ()`를 사용하지 않으면 기본 getter가 값을 반환하지 않습니다.

  21. 21

    우리가 직접 자바 액세스 전용 변수를 setter 메소드를 사용할 수있을 때 왜 getter 메소드를 사용합니까?

  22. 22

    vuex에서 다른 getter가 변경되었을 때 getter를 다시 계산할 수 있습니까?

  23. 23

    C ++ : waitpid를 사용할 때 자식 프로세스가 종료 될 때까지 기다립니다.

  24. 24

    Ubuntu 16.04 systemd 서비스는 etc / network / interfaces를 사용할 때 dhclient가 완료 될 때까지 기다립니다.

  25. 25

    및 또는 절을 추가 할 때 MySql Left Join이 느립니다.

  26. 26

    SQLite는 큰 테이블에서 .import를 수행 할 때 매우 느립니다.

  27. 27

    swift는 REST POST 요청 후 뷰를 업데이트 할 때 느립니다.

  28. 28

    메모장 ++은 이제 검색 / 바꾸기를 할 때 정말 느립니다.

  29. 29

    venv를 사용할 때 환경 $ PATH가 다릅니다.

뜨겁다태그

보관