Skip to main content
Loading...

More Swift Posts

import simd

private func test() {
    let screenWidth: Int = 256
    let screenHeight: Int = 240
    let pixelBufferPtr = UnsafeMutableBufferPointer<BGRA>.allocate(capacity: screenWidth * screenHeight)
    let runCount = 1000
    let start = Date.now
    for _ in 0 ..< runCount {
        var index = 0
        var palletIndex = 0
        let palletCount = BGRAPallet.count
        while index < pixelBufferPtr.count {
            let bgra = BGRAPallet[palletIndex]
            let bgraVector = simd_uint4(bgra.blue, bgra.green, bgra.red, bgra.alpha)
            let maxCount = min(pixelBufferPtr.count - index, 4)
            let pixelBuffer = pixelBufferPtr.baseAddress! + index
            pixelBuffer.storeBytes(of: bgraVector, as: simd_uint4.self)
            palletIndex += 1
            if palletIndex == palletCount {
                palletIndex = 0
            }
            index += maxCount
        }
    }
    let elapsed = Date.now.timeIntervalSince(start)
    print("Average time per run: \((Int(elapsed) * 1000) / runCount) ms")
}


//if for some reason your system doesnt support simd_uint4, you can try the following: 
// private func test() {
//     let screenWidth: Int = 256
//     let screenHeight: Int = 240
//     let pixelBufferPtr = UnsafeMutableBufferPointer<BGRA>.allocate(capacity: screenWidth * screenHeight)
//     let runCount = 1000
//     let start = Date.now
//     for _ in 0 ..< runCount {
//         let pixelBuffer = pixelBufferPtr.baseAddress!
//         let pixelBufferCount = pixelBufferPtr.count
//         let palletCount = BGRAPallet.count
//         var palletIndex = 0
//         for i in stride(from: 0, to: pixelBufferCount, by: 4) {
//             let bgra = BGRAPallet[palletIndex]
//             pixelBuffer[i] = bgra
//             pixelBuffer[i + 1] = bgra
//             pixelBuffer[i + 2] = bgra
//             pixelBuffer[i + 3] = bgra
//             palletIndex += 1
//             if palletIndex == palletCount {
//                 palletIndex = 0
//             }
//         }
//     }
//     let elapsed = Date.now.timeIntervalSince(start)
//     print("Average time per run: \((Int(elapsed) * 1000) / runCount) ms")
// }