Sprite kit SKView textureFromNode导致图像模糊?

Sprite kit SKView textureFromNode导致图像模糊?,sprite-kit,Sprite Kit,我观察到,当拍摄相对清晰的SKSpriteNode时,使用SKView的textureFromNode拍摄快照时,结果图像模糊。这甚至考虑了纹理过滤(默认设置为线性)。我想知道这是否符合预期,或者SKView是否还有更多的功能?如果您想要当前SKView和SKScene内容的“快照”图像,您最好看看新方法drawViewHierarchyInRect:AfterScreenuUpdate:。这在我的测试中效果很好,尽管比预期的要慢一点。我认为您看到的问题是,从textureFromNode:返回

我观察到,当拍摄相对清晰的SKSpriteNode时,使用SKView的textureFromNode拍摄快照时,结果图像模糊。这甚至考虑了纹理过滤(默认设置为线性)。我想知道这是否符合预期,或者SKView是否还有更多的功能?如果您想要当前
SKView
SKScene
内容的“快照”图像,您最好看看新方法
drawViewHierarchyInRect:AfterScreenuUpdate:
。这在我的测试中效果很好,尽管比预期的要慢一点。我认为您看到的问题是,从
textureFromNode:
返回的结果
SKTexture
的大小基于节点的
CalculateAccumeratedFrame
,它可能是您想要/期望的大小,也可能不是。它也可能只是正确地渲染纹理,而您只是看到已经渲染的精灵的重新渲染形式(基本上,每次再次渲染时都会有更多的损耗,这在逻辑上是有意义的)

试试这个:

texture.filteringMode = SKTextureFilteringNearest;
在这种模式下,你会得到更少的模糊,更多的像素化。如
SKTexture
参考中所述:

SKTextureFilteringNearest

使用纹理中最近的点绘制每个像素。此模式速度更快,但结果通常是像素化的

我将此代码用于使用
SKShapeNode
进行线条绘制。在设置
filteringMode
属性之前,随着时间的推移,我的行变得越来越模糊。使用此设置,即使将
SKShapeNode
抗锯齿
属性设置为
YES
,它仍然清晰,一点也不模糊

不确定您当前的实现,但这可能会对您有所帮助

texture.filteringMode = SKTextureFilteringNearest;
这对我的情况没有帮助。我必须在我的SKShapeNode上关闭抗锯齿。然后,textureFromNode(grid->SKShapeNode)产生了尖锐的纹理/SKSpriteNode

grid.antialiased = false

我发现了另一种提高ShapeNodes创建的纹理逼真度的方法

以其大小和宽度创建形状。 以相同的超大比例创建所有字体和其他形状。 确保您的定位相对于此总体尺寸(例如,不要使用绝对尺寸,使用容器的相对尺寸)

当你将纹理创建为精灵时,它将是巨大的,但随后应用

sprite.scale = 0.5; // if you were using 2x
(注意,如果您有子元素,缩放可能不是最佳解决方案-设置大小会更好)

我发现这使它看起来更高的分辨率,没有颗粒,字体上没有模糊,锐角

我还使用了
tex.filteringMode=SKTextureFilteringLinear

[编辑-我以前将其作为SKTextureFilteringNearest使用-但这会在直线上生成人工制品-线性现在生成良好的直线]

texture.filteringMode = .nearest
这可能会导致像素化,您也可以尝试

texture.filteringMode = .linear

此解决方案的问题在于它不是SpriteKit本机,这很好,只是许多人正在使用textureFromNode绘制尚未添加到场景中的大型精灵层次(粒子系统等)的纹理,以便在一次绘制中显示数千个精灵。使用drawViewHierarchyInRect需要在创建纹理之前绘制精灵。这种模糊是一个真正的问题。我认为您关于帧大小的问题是对的,或者类似的问题。正如我在其他地方写的,您应该使用
SKView textureFromNode:crop:
来避免伪影。Brilliant-对我来说很有魅力-也不必更改形状节点的反别名。如果我不这样做,我会得到一个模糊的纹理。