Как я могу (эффективно) протестировать SKTexture на предмет видимого контента? - PullRequest
0 голосов
/ 10 мая 2018

Мое приложение в настоящее время анимирует тысячи «мини-текстур» с помощью 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)
    }
}

1 Ответ

0 голосов
/ 29 мая 2018

Как оказалось, SpriteKit уже отбирает невидимые и неэкранные узлы по умолчанию, поэтому моё приложение не работало плохо без тестирования и удаления полностью прозрачных узлов SKSpriteNodes. (Но, возможно, мое понимание неверно, если под «невидимым» Apple просто подразумевает «установить в isHidden».)

Документация Apple для свойства экземпляра shouldCullNonVisibleNodes (по умолчанию установлено значение true) здесь .

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

...