问题标签 [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.

0 投票
1 回答
143 浏览

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 秒。

那么,单例方法比使用静态变量更好吗?预加载这种大小的图集是否明智?

0 投票
1 回答
190 浏览

ios - Sprite Kit SKTexture 动画高度意外变化

我正在使用 aSKTextureAtlas为 a 设置动画SKSpriteNode。动画有效,但看起来很奇怪,因为出于某种原因,精灵的高度在动画中发生了多次变化。这也会导致 y 位置发生变化。除了高度和 y 之外,其他一切都保持不变。我能想到的唯一一件事是每帧内有不同数量的透明像素。虽然每个图像的大小相同。即使我使用SKAction.animateWithTextures(atlasFrames, timePerFrame: 0.1, resize: true, restore: false)resize 设置为 true 和 false,问题仍然存在。

0 投票
1 回答
178 浏览

swift - 如何使用根据节点移动方式运行的 .xscale?

我正在使用 SpriteKit 制作游戏,其中我有一个节点使用此 SKAction 序列从屏幕的左侧到右侧反复来回移动:

该节点是一个 SKTexture,我正在使用一个名为 WalkRight 的图集。我想要做的是,当 SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: NSTimeInterval(4) 运行时,我想使用 .xscale 来旋转我的 walkRight 图像。我无法弄清楚如何将此代码合并到我的 SKAction 序列中。

下面是我添加地图集的代码,以防需要回答问题。

0 投票
0 回答
153 浏览

swift - 如何更改 SKAction 序列中节点的纹理图集?

SKAction我正在使用 SpriteKit 制作游戏,其中我有一个节点使用以下序列从屏幕的左侧到右侧反复来回移动:

节点是SKTexture,我使用的是名为 WalkRight 的图集。我想要做的是,当SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: NSTimeInterval(4)运行时,我想将节点的纹理更改为我称为 WalkLeft 的不同图集。我不知道如何在我的序列中运行一个动作,让我改变节点的纹理。

我用于添加纹理的代码:

0 投票
2 回答
556 浏览

ios - 我可以在运行时创建 SpriteKit 纹理图集吗

我正在开发一个 os x / iOS 填字游戏,它使用SKLabelNodeSKNode子类上将填字游戏字母显示为子类。

所以对于每个字母都有SKNode.SKLabelNode。在不使用SKLabelNode的情况下,绘制计数在 6-8 的范围内。通过使用SKLabelNode,他们可以将场景中的孩子数量增加到近 100 个。

我现在正在寻找一种方法来避免这种情况,并提出将SKLabelNode光栅化为纹理的想法,但这并不会降低绘制次数,因为仍然有很多不同的纹理。

我现在的想法是光栅化这些SKNode -子类并将纹理放入纹理图集中。

所以问题是,是否可以在运行时创建纹理图集?如果单个纹理发生变化怎么办?是否可以在地图集中交换单个纹理,或者我必须重建它?

也许有一种“最好的方法”来处理很多不同的 SKLabelNodes!?

0 投票
0 回答
64 浏览

xcode - 我如何告诉 Xcode 在打包纹理图集时不要修剪透明边缘

我如何告诉 Xcode 在打包纹理图集时不要修剪透明边缘。 在此处输入图像描述

0 投票
2 回答
673 浏览

swift - 如何强制从字典创建的 SKTextureAtlas 不修改纹理大小?

在我的项目中,纹理是通过PaintCode ( )提供的方法程序生成的。

然后我从由这些方法生成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 时,就会出现问题。

所以可以使用下面的方法来生成图片:

在此处输入图像描述

0 投票
1 回答
894 浏览

ios - 从内存中释放 SKTextureAtlas

我在获取免费的纹理图集时遇到问题。目前我有一个 SpriteKit 游戏,玩家可以在其中改变他的角色。现在我在一个全局共享实例中有地图集,就像这样。

您可以更改为的每个角色都有自己的纹理图集。我使用如下方法从角色图集中获取玩家移动、空闲和跳跃动画:

这存储在玩家精灵节点类的数组实例变量中。所以每次更改字符时,这些帧都会被新帧替换,所以旧的应该被释放对吗?

此外,当玩家切换角色时,我使用它来预加载纹理图集:

为什么 SpriteKit 永远不会从之前的角色动画中释放内存?如果玩家切换到新角色,内存会不断增加并导致应用程序崩溃。如果再次选择该会话中已经选择的角色,则内存不会增加。这显示了内存泄漏。角色动画没有被释放。为什么?

我知道 SpriteKit 应该自己处理这些东西,所以这就是它令人困惑的原因。绝对没有办法自己手动释放纹理图集吗?

谢谢!

0 投票
0 回答
638 浏览

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,在这里下载并自己尝试)中重现了这种行为,代码如下:

0 投票
0 回答
361 浏览

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 图像没有加载?