Почему при использовании UIImage (с именем:»») и Bundle.main.path(forResource:) для компоновки изображений производительность сильно отличается?

#ios #swift #uikit #core-graphics

#iOS #swift #uikit #ядро-графика

Вопрос:

Мне нужно объединить два изображения в одно, одно из которых используется в качестве фона. Метод, когда я использую

 let a = UIImage(named: "234")
let b = UIImage(named: "720")

let aRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
let bRect = CGRect(x: 0, y: 0, width: backgroundImg.size.width, height: backgroundImg.size.height)

  ...
  let render = UIGraphicsImageRenderer(bounds: bRect)
  let result = render.image { renderContext in
      backgroundImg.draw(in: bRect)
      image.draw(in: aRect)
  }
  return result
  

Это заняло 2 мс.

но когда я использую

 let aPath = Bundle.main.path(forResource: "234@3x", ofType: "png")
let bPath = Bundle.main.path(forResource: "720@3x", ofType: "png")

let a = UIImage(contentsOfFile: aPath!)
let b = UIImage(contentsOfFile: bPath!)

  ...
  let render = UIGraphicsImageRenderer(bounds: bRect)
  let result = render.image { renderContext in
      backgroundImg.draw(in: bRect)
      image.draw(in: aRect)
  }
  return result

  

Потребовалось 20 мс, что привело к увеличению времени в 10 раз?

Моя загадка заключается в том, что оба метода загружают два изображения a b в память перед объединением изображений. Но почему существует такая разница в процессе объединения изображений?

Код, подобный этому:

введите описание изображения здесь

Ответ №1:

Больше времени занимает не компоновка изображений. Это загрузка файла. В первом коде изображения кэшируются в памяти, поэтому для их загрузки после первого раза требуется нулевое время. Во втором коде изображения не кэшируются, поэтому их приходится каждый раз считывать с диска, что происходит медленно.

Комментарии:

1. Спасибо за ваш ответ. Но вы, возможно, неправильно поняли мой код. Мой код записывает изображения в память до того, как два изображения начнут компоноваться. Я думаю, что изображения двух методов находятся в памяти, когда они выполняют метод composition. В приведенном выше вопросе я добавил картинку. Вы можете щелкнуть, чтобы просмотреть его.