W mojej aplikacji tworzę mapowanie obrazu, które przenosi się do wartości pikseli i używa go jako nakładki w Mapach Google, ale trwa to wieczność, to samo w Androidzie jest niemal natychmiastowe. Mój kod wygląda tak:Rysowanie obrazu w Swift trwa wiecznie
private func imageFromPixels(pixels: [PixelData], width: Int, height: Int) -> UIImage? {
let bitsPerComponent = 8
let bitsPerPixel = bitsPerComponent * 4
let bytesPerRow = bitsPerPixel * width/8
let providerRef = CGDataProvider(
data: NSData(bytes: pixels, length: height * width * 4)
)
let cgimage = CGImage(
width: width,
height: height,
bitsPerComponent: bitsPerComponent,
bitsPerPixel: bitsPerPixel,
bytesPerRow: bytesPerRow,
space: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue),
provider: providerRef!,
decode: nil,
shouldInterpolate: true,
intent: .defaultIntent
)
if cgimage == nil {
print("CGImage is not supposed to be nil")
return nil
}
return UIImage(cgImage: cgimage!)
}
Jakieś sugestie, jak to może zająć tyle czasu? Widzę, że wykorzystuje około 96% mocy procesora.
func fromData(pair: AllocationPair) -> UIImage? {
let table = pair.table
let data = pair.data
prepareColors(allocations: table.allocations)
let height = data.count
let width = data[0].count
var colors = [PixelData]()
for row in data {
for val in row {
if (val == 0.0) {
colors.append(PixelData(a: 0, r: 0, g: 0, b: 0))
continue
}
if let interval = findInterval(table: table, value: val) {
if let color = intervalColorDict[interval] {
colors.append(PixelData(a: color.a, r: color.r, g: color.g, b: color.b))
}
}
}
}
return imageFromPixels(pixels: colors, width: width, height: height)
}
Próbowałem go profilować czasowo, a to jest wynik, gdy wymaga czasu.
Zasadniczo jestem po prostu pokazując obraz albo zielony, czerwony lub żółty pikseli miesza się – Recusiwe
Czy jesteś pewien problem jest tutaj, a nie w tworzeniu '[]' PixelData tablicy? W kompilacjach debugowania obsługa dużych tablic jest bardzo powolna. W przypadku kompilacji wydania z włączonymi optymalizacjami użycie dużych tablic jest znacznie szybsze. Upewnij się, że problem jest tutaj, a nie w tworzeniu tej tablicy. A następnie, oczywiście, upewnij się, że po wyświetleniu obrazu, który robisz to w głównej kolejce. – Rob
@Recusiwe, czy próbowałeś używać Instrumentów do wskazania miejsca, w którym zużywasz cały procesor? Możesz spróbować zacząć od tego samouczka: https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started –