首页 > 解决方案 > 我如何(有效地)测试 SKTexture 的可见内容?

问题描述

我的应用程序目前使用 SpriteKit 为数千个“迷你纹理”制作动画。每个感兴趣的对象的转换过程是 UIView 到 UIImage 到 SKTexture 到很多很多非常小的 SKTextures(miniTextures)。我遇到的问题是如何仅进一步处理那些“有用”的 miniTexture。

许多来自对象/视图/图像/纹理的空白部分的迷你纹理不包含有用的视觉信息(即它们是空白的)。因此,为它们制作动画是很浪费的。问题是,我不知道有什么好的、有效的测试。我曾希望能够以某种方式检查每个纹理的像素,并且如果纹理中的每个像素的 alpha 值为 0,则该纹理将不会被处理(即,不会为它创建 SKSpriteNode)。

作为一种解决方法,我尝试使用 SKPhysicsBody(texture: alphaThreshold: size:) 为每个 miniTexture 创建一个 SKPhysicsBody(参见下面的代码),当纹理中没有任何内容超过 alphaThreshold 时返回 nil。那至少可以让我测试并有选择地处理有用的 miniTextures。但是在这样做时,我遇到了两个问题:首先,模拟器减速到虚拟停止。其次,当纹理非常小时,无论我的 alphaThreshold 是多少,它们都被确定为 nil。

洞察力?解决方案?同情?

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)
    }
}

标签: iosswiftsprite-kitskspritenodeskphysicsbody

解决方案


事实证明,SpriteKit 默认已经剔除了不可见和屏幕外的节点,这可能是我的应用程序在没有测试和删除完全透明的 SKSpriteNodes 的情况下表现不佳的原因。(但也许我的理解是错误的,如果“隐形”Apple 仅仅意味着“设置为 isHidden”。)

Apple 的 shouldCullNonVisibleNodes 实例属性(默认值为 true)的文档在此处

一个更好的上游解决方案是在创建图像/纹理之前测试不可见性,但这将涉及比我目前更深入地了解低级 iOS 图形操作。


推荐阅读