问题标签 [sktextureatlas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sprite-kit - 如何通过预加载优化大型 SKTextureAtlas 文件的绘图?
我有一个有 4 个纹理图集的游戏。每个图集大小为 4096 x 4096,包含大约 300 个精灵,全部约为 15kb - 50kb。在 Texture Packer 中未优化,它们每个大约 2 - 4MB,优化后大约是一半。
它们包含用于绘制字符的资产,但我发现绘制单个字符(大约 24 个节点)非常慢,大约 0.5 秒。这是因为多次调用[atlas textureNamed:textureName]
为了加快速度,我想预加载地图集。理想情况下,我会将它们保存在内存中,因为我总是需要它们。所以我的第一个问题是,这种大小的地图集是否可能?我试过打电话[SKTextureAtlas preloadTextureAtlases:@[MaleFeatureAtlas] withCompletionHandler...]
,但我遇到了没有堆栈跟踪的崩溃,只是失去了与设备的连接。
目前,我有一个 AtlasManager 类,它具有初始化每个纹理图集的静态变量:
每个角色精灵都有一个 AtlasManager 的实例,但由于 SKTextureAtlases 是静态变量,我认为它们绘制起来会很快。但是不断要求[atlas textureNamed:textureName]
真正减慢绘图速度。一旦绘制,我将存储一个节点的 NSDictionary,因此重绘非常快,但初始绘制时间太长。渲染 8 个字符,总共 100 多个节点,大约需要 5 秒。
那么,单例方法比使用静态变量更好吗?预加载这种大小的图集是否明智?
ios - Sprite Kit SKTexture 动画高度意外变化
我正在使用 aSKTextureAtlas
为 a 设置动画SKSpriteNode
。动画有效,但看起来很奇怪,因为出于某种原因,精灵的高度在动画中发生了多次变化。这也会导致 y 位置发生变化。除了高度和 y 之外,其他一切都保持不变。我能想到的唯一一件事是每帧内有不同数量的透明像素。虽然每个图像的大小相同。即使我使用SKAction.animateWithTextures(atlasFrames, timePerFrame: 0.1, resize: true, restore: false)
resize 设置为 true 和 false,问题仍然存在。
swift - 如何使用根据节点移动方式运行的 .xscale?
我正在使用 SpriteKit 制作游戏,其中我有一个节点使用此 SKAction 序列从屏幕的左侧到右侧反复来回移动:
该节点是一个 SKTexture,我正在使用一个名为 WalkRight 的图集。我想要做的是,当 SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: NSTimeInterval(4) 运行时,我想使用 .xscale 来旋转我的 walkRight 图像。我无法弄清楚如何将此代码合并到我的 SKAction 序列中。
下面是我添加地图集的代码,以防需要回答问题。
swift - 如何更改 SKAction 序列中节点的纹理图集?
SKAction
我正在使用 SpriteKit 制作游戏,其中我有一个节点使用以下序列从屏幕的左侧到右侧反复来回移动:
节点是SKTexture
,我使用的是名为 WalkRight 的图集。我想要做的是,当SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: NSTimeInterval(4)
运行时,我想将节点的纹理更改为我称为 WalkLeft 的不同图集。我不知道如何在我的序列中运行一个动作,让我改变节点的纹理。
我用于添加纹理的代码:
ios - 我可以在运行时创建 SpriteKit 纹理图集吗
我正在开发一个 os x / iOS 填字游戏,它使用SKLabelNode在SKNode子类上将填字游戏字母显示为子类。
所以对于每个字母都有SKNode.SKLabelNode。在不使用SKLabelNode的情况下,绘制计数在 6-8 的范围内。通过使用SKLabelNode,他们可以将场景中的孩子数量增加到近 100 个。
我现在正在寻找一种方法来避免这种情况,并提出将SKLabelNode光栅化为纹理的想法,但这并不会降低绘制次数,因为仍然有很多不同的纹理。
我现在的想法是光栅化这些SKNode -子类并将纹理放入纹理图集中。
所以问题是,是否可以在运行时创建纹理图集?如果单个纹理发生变化怎么办?是否可以在地图集中交换单个纹理,或者我必须重建它?
也许有一种“最好的方法”来处理很多不同的 SKLabelNodes!?
swift - 如何强制从字典创建的 SKTextureAtlas 不修改纹理大小?
在我的项目中,纹理是通过PaintCode ( paint-code )提供的方法程序生成的。
然后我从由这些方法生成SKTextureAtlas
的字典创建一个:UIImage
myAtlas = SKTextureAtlas(dictionary: myTextures)
最后,使用以下方法从图集检索纹理:
textureNamed
var sprite1 = SKSpriteNode(texture:myAtlas.textureNamed("texture1"))
但是在 iPhone4S 模拟器上显示的节点是双倍大小的。在 iPhone 6 Plus 模拟器上三倍大小。
似乎在初始化时,atlas 以设备分辨率计算图像。但是生成的图像已经具有正确的大小,不需要更改。请参阅下面的绘图方法。
以下是生成图像的说明:
<UIImage: 0x7f86cae56cd0>, {52, 52}
以及atlas中对应纹理的描述:
<SKTexture> 'image1' (156 x 156)
这适用于 iPhone 6 Plus,使用 @3x 图像,这就是大小为 x3 的原因。
对于 iPhone 4S,使用 @2x 图像,如预期的那样:
<UIImage: 0x7d55dde0>, {52, 52}
<SKTexture> 'image1' (156 x 156)
最后,将scale
生成的属性UIImage
设置为正确的设备分辨率:@2x (iPhone 4S) 为 2.0,@3x (iPhone 6 Plus) 为 3.0。
问题
那么我能做些什么来避免图集调整图片大小呢?
绘图方法
PaintCode 生成绘图方法如下:
更新 1
比较两种生成方法SKTextureAtlas
似乎问题SKTextureAtlas
出在字典上,因为SKSpriteNode
初始化不使用scale属性UIImage
来正确调整节点的大小。
以下是控制台上的描述: - texture1: '' (84 x 84) - texture2: 'texture1' (84 x 84)
texture2
想念一些data
!这可以解释缺乏比例信息来正确调整节点大小:
节点的大小 = 纹理的大小除以纹理的比例。
更新 2
当 的 scale 属性UIImage
不同于 1 时,就会出现问题。
所以可以使用下面的方法来生成图片:
ios - 从内存中释放 SKTextureAtlas
我在获取免费的纹理图集时遇到问题。目前我有一个 SpriteKit 游戏,玩家可以在其中改变他的角色。现在我在一个全局共享实例中有地图集,就像这样。
您可以更改为的每个角色都有自己的纹理图集。我使用如下方法从角色图集中获取玩家移动、空闲和跳跃动画:
这存储在玩家精灵节点类的数组实例变量中。所以每次更改字符时,这些帧都会被新帧替换,所以旧的应该被释放对吗?
此外,当玩家切换角色时,我使用它来预加载纹理图集:
为什么 SpriteKit 永远不会从之前的角色动画中释放内存?如果玩家切换到新角色,内存会不断增加并导致应用程序崩溃。如果再次选择该会话中已经选择的角色,则内存不会增加。这显示了内存泄漏。角色动画没有被释放。为什么?
我知道 SpriteKit 应该自己处理这些东西,所以这就是它令人困惑的原因。绝对没有办法自己手动释放纹理图集吗?
谢谢!
sprite-kit - SKSpriteNode 照明不适用于 SKTextureAtlas 中的纹理
我遇到了 SpriteKit 的问题(在 OS X 10.11 beta 上尝试了 Xcode 7 beta 和 Xcode 6.4),如果我从单独使用时工作的图像和正常文件创建 SKTextureAtlas,则正常映射光照会发生故障。看这个例子:
从左到右:
- 带有纹理 + 法线 + 光照的精灵(来自地图集的纹理)
- 具有纹理 + 法线的精灵(来自图集的纹理)
- 带有纹理的精灵(来自地图集的纹理)
- 具有正常纹理的精灵(来自图集的纹理)
- 带有纹理 + 法线 + 光照的精灵(通过 imageNamed 从单个文件创建的纹理:)
该图集是在运行时使用 SKTextureAtlas atlasWithDictionary: 创建的,它包含以下纹理:
注意:如果我在 Xcode 中创建 Atlas 并通过 atlasNamed 加载它,我会遇到完全相同的问题: - 所以问题绝对不在于创建地图集的方式或时间,而是因为纹理是从第一个地图集中获得的地方。
如果我使用单个文件创建精灵,则照明工作(最右边的图像):
我对图集文件做了完全相同的事情,上面的屏幕截图证明我确实获得了精灵纹理的正确图像(左起第 3 和第 4 个),并且正常作为图集中的纹理。然而,结果是左起第一张图像,一个没有法线贴图的光照精灵。
我想知道,普通纹理是否需要一种 SKTextureAtlas 不适用的后处理形式?或者其他人在地图集中有正常纹理的问题吗?
或者这可能是一个错误?
更新:我在一个新的 SpriteKit 应用程序(OS X,在这里下载并自己尝试)中重现了这种行为,代码如下:
swift - Atlas 未加载 @3x 图像
使用 iphone6 plus 的模拟器时,从图集加载的图像会在 @2x~iphone 处加载,而不是在 @3x~iphone 处加载。当我加载图像(不使用图集)时,@3x~iphone 工作。
我正在使用一个图集,其中包含@2x~iphone 和@3x~iphone 图像(仅加载@2x~iphone 图像)。我在线阅读以将 atlas 文件夹名称更改为 @2x.atlas 和 @3x.atlas,但随后出现错误,提示找不到该文件夹。我还将文件名更改为@2x~iphone.atlas 和@3x~iphone.atlas,但得到了同样的错误。
这就是我用来将图像加载到数组中的方法。
我的图像名称是“图像名称”@2x~iphone.png 和“图像名称”@3x~iphone.png。文件夹名称是 Segments.atlas。
谁能告诉我为什么@3x~iphone 图像没有加载?