Мое приложение в настоящее время анимирует тысячи «мини-текстур» с помощью SpriteKit.Процесс преобразования для каждого интересующего объекта - это UIView в UIImage to SKTexture для многих, многих, очень маленьких SKTexture (miniTextures).У меня проблемы с дальнейшей обработкой только тех мини-текстур, которые являются «полезными».
Многие из мини-текстур, происходящих из пустых частей объекта / вида / изображения / текстуры, не содержат полезных визуальных элементов.информация (т.е. они не заполнены).Таким образом, было бы расточительно их оживлять.Проблема в том, что я не знаю ни одного хорошего, эффективного теста для этого.Я надеялся, что каким-то образом смогу изучить пиксели каждой текстуры, и если каждый пиксель в текстуре имеет альфа-значение 0, эта текстура не будет обработана (т. Е. Для нее не будет создан SKSpriteNode).
В качестве обходного пути я попытался создать SKPhysicsBody для каждой мини-текстуры (см. Код ниже), используя SKPhysicsBody (texture: alphaThreshold: size :), который возвращает ноль, когда ничто в текстуре не превышает alphaThreshold.Это могло бы, по крайней мере, позволить мне проверить и выборочно обработать полезные мини-текстуры.Но при этом я столкнулся с двумя проблемами: во-первых, симулятор замедлился до виртуальной остановки.Во-вторых, когда текстуры были очень маленькими, все они были равны нулю, независимо от моего alphaThreshold.
Выводы?Решения?Сочувствие?
for j in stride(from: 0, to: 1, by: yFraction) {
for i in stride(from: 0, to: 1, by: xFraction) {
let miniTexture = SKTexture(rect: CGRect(x: CGFloat(i),
y: CGFloat(j),
width: CGFloat(xFraction),
height: CGFloat(yFraction)),
in: texture)
spriteNode.physicsBody = SKPhysicsBody(texture: miniTexture,
alphaThreshold: 0.5,
size: CGSize(width: 1,
height: 1))
// BUT WHEN THE miniTextures ARE VERY SMALL, THESE ALL ARE NIL!
// AND THE ANIMATION COMES TO A VIRTUAL STANDSTILL!
if spriteNode.physicsBody == 0 { continue }
// spriteNode.position details here
// spritNode.run(specificAnimation) details here
let spriteNode = SKSpriteNode(texture: miniTexture)
spriteNodes.addChild(spriteNode)
}
}