代码之家  ›  专栏  ›  技术社区  ›  Optimalist

如何(有效地)测试SKTexture的可见内容?

  •  0
  • Optimalist  · 技术社区  · 7 年前

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

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

    作为一种解决方法,我尝试使用SKPhysicsBody(纹理:alphaThreshold:size:)为每个迷你纹理创建一个SKPhysicsBody(请参见下面的代码),当纹理中没有任何内容超过alphaThreshold时,它会返回nil。这样至少可以让我测试并有选择地处理有用的微纹理。但在这样做的时候,我遇到了两个问题:首先,模拟器的速度减慢到了虚拟的静止状态。其次,当使纹理非常小时,所有纹理都被确定为零,而不管我的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 回复  |  直到 7 年前
        1
  •  0
  •   Optimalist    7 年前

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

    苹果公司的shouldcullnovisiblenodes实例属性文档(默认值为true)为 here

    更好的上游解决方案是测试隐形性 之前 创建图像/纹理,但这将涉及到对低级别iOS图形处理的更深理解,而我目前还没有。