Используйте удаленный образ для MTKTextureLoader - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь загрузить свою текстуру из URL с помощью этого кода:

let textureLoader = MTKTextureLoader(device: device)
var texture: MTLTexture?
let origin = NSString(string: MTKTextureLoader.Origin.bottomLeft.rawValue)
let textureLoaderOptions = [MTKTextureLoader.Option.SRGB: 0, MTKTextureLoader.Option.origin: origin] as [MTKTextureLoader.Option: Any]

do {
   texture = try textureLoader.newTexture(URL: my-url-here, options: textureLoaderOptions)
} catch {
   print("texture not created")
}

Когда я загружал текстуру из приложения, все работало нормально, но я не могу ее получить работать с использованием внешнего URL. Кому-нибудь повезло с этим?

Я пытался Загрузить удаленное изображение с помощью MTKTextureLoader , но не смог заставить его работать как есть, и я не достаточно осведомлен, чтобы понять, как обновить его.

1 Ответ

1 голос
/ 01 апреля 2020

Вот расширение к MTKTextureLoader (совместимо с Swift 5), которое загружает изображение с удаленного URL и создает из него текстуру металла. Он в основном соответствует той же схеме, что и существующий API асинхронной загрузки .

extension MTKTextureLoader {
    static let errorDomain = "com.example.MTKTextureLoader.RemoteExtensions"

    func newTexture(remoteURL url: URL, options: [MTKTextureLoader.Option : Any]? = nil, completionHandler: @escaping MTKTextureLoader.Callback) {
        let downloadTask = URLSession.shared.downloadTask(with: URLRequest(url: url)) { (maybeFileURL, maybeResponse, maybeError) in
            var anError: Swift.Error? = maybeError
            if let tempURL = maybeFileURL, let response = maybeResponse {
                if let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first {
                    let cachesURL = URL(fileURLWithPath: cachePath, isDirectory: true)
                    let cachedFileURL = cachesURL.appendingPathComponent(response.suggestedFilename ?? NSUUID().uuidString)
                    try? FileManager.default.moveItem(at: tempURL, to: cachedFileURL)
                    return self.newTexture(URL: cachedFileURL, options: options, completionHandler: completionHandler)
                } else {
                    anError = NSError(domain: MTKTextureLoader.errorDomain,
                                      code: 1,
                                      userInfo: [NSLocalizedDescriptionKey : "Unable to find user caches directory"])
                }
            } else {
                anError = NSError(domain: MTKTextureLoader.errorDomain,
                                  code: 2,
                                  userInfo: [NSLocalizedDescriptionKey : "Download from URL failed"])
            }
            completionHandler(nil, anError)
        }
        downloadTask.resume()
    }
}

Обратите внимание, что если ваше приложение находится в изолированной среде, вы должны включить «Исходящие подключения» в своих правах, если у вас нет Это уже сделано.

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

...