ios - 我如何(有效地)测试 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)
}
}
解决方案
事实证明,SpriteKit 默认已经剔除了不可见和屏幕外的节点,这可能是我的应用程序在没有测试和删除完全透明的 SKSpriteNodes 的情况下表现不佳的原因。(但也许我的理解是错误的,如果“隐形”Apple 仅仅意味着“设置为 isHidden”。)
Apple 的 shouldCullNonVisibleNodes 实例属性(默认值为 true)的文档在此处。
一个更好的上游解决方案是在创建图像/纹理之前测试不可见性,但这将涉及比我目前更深入地了解低级 iOS 图形操作。
推荐阅读
- node.js - Nodejs React 在渲染之前运行函数
- selenium - 在 Google Chrome 和 Edge 中运行强制自动翻译。翻译不起作用
- pandas - 根据两列的匹配值重新索引数据框
- powershell - Powershell 无法识别 Conda
- python - python Selenium - Github 集成
- javascript - 在 sinon 存根打字稿上返回 AWSError
- python - Python 是否提供了一种访问最近封闭范围之外的变量的方法?
- javascript - 将下拉列表值从视图传递到控制器并重新发送 asp.net core 3.1 中的相同视图?
- mysql - RAND() 是否具有低熵来生成盐?
- node.js - 是否可以在运行时向 Node.js 信任库添加证书颁发机构?