Кодировать ASTC на устройстве (iOS)?
Есть ли какая-либо библиотека, способная кодировать данные изображения в текстуру ASTC по требованию? Я знаю, что это сильно загружает процессор, но все равно заинтересован.
3 ответа
https://github.com/ARM-software/astc-encoder - это эталонный компрессор (созданный ARM и AMD). Вероятно, нетрудно заставить исходный код работать на устройстве iOS. Он может быть слишком медленным, но он предлагает различные варианты скорости, так что, возможно, вы найдете правильный баланс между качеством и скоростью для вас.
import ImageIO
import MetalKit
let loader: MTKTextureLoader
let srcImage: CGImage
let ktxData = NSMutableData()
let dest = CGImageDestinationCreateWithData(ktxData, "org.khronos.ktx" as CFString, 1, nil)!
CGImageDestinationAddImage(dest, srcImage, 0, ["kCGImagePropertyASTCBlockSize": 0x88] as CFDictionary)
CGImageDestinationFinalize(dest)
try loader.newTexture(data: ktxData as Data, options: [])
kCGImagePropertyASTCBlockSize
показанная опция дает вам размер блока 8х8 (т.е. 2 бита на пиксель); единственный другой допустимый размер - 4x4 (8 бит на пиксель), который является значением по умолчанию.
Для максимальной производительности добавьте kCGImageDestinationLossyCompressionQuality: 0.0
к вариантам для CGImageDestinationAddImageFromSource
,
Другие возможные флаги kCGImagePropertyASTCUseLZFSE
, kCGImagePropertyASTCPreTwiddle
, kCGImagePropertyASTCFlipVertically
а также kCGImagePropertyASTCWeightChannelsEqually
(все bools).
В iOS 10 Apple добавила кодировку ASTC в систему. Вы можете получить к нему доступ через /usr/include/AppleTextureEncoder.h, /usr/lib/libate.dylib или (проще) просто кодировать в ASTC, используя обычные утилиты кодирования изображений, доступные через CG / ImageIO.framework. См. CGImageDestination и связанные объекты. Можно также получить это через сжатие каталога актива изображения в XCode.
Системный кодировщик ASTC намного быстрее, чем эталонный кодировщик ARM. Поддерживаются размеры блоков 4х4 и 8х8. Производительность должна быть аналогична кодировке JPEG или PNG.