Sprite Kit OS X: SKTexture大小属性不正确。

6
我正在测试Sprite Kit的OS X版本上的游戏,发现一些材质的大小报告不正确。我想知道是否有其他人看到了这个问题,并且是否有解释?
在将此视为错误之前,只是排除其他问题。如果这是已知的问题,请告诉我。
我加载此纹理,它的尺寸为256x256像素: enter image description here 当我记录从此图像创建的SKTexture时,则SKTexture描述会给出正确的大小,但size属性却不是,它说图像的大小是204.8 x 204.8。
tex = <SKTexture> 'Tileset_GeometryB.png' (256 x 256)
tex.size = {204.80000000000001, 204.80000000000001}  // Huh? WTF?!?
tex.textureRect = {{0, 0}, {1, 1}}

我在iOS模拟器和设备上使用同样的代码加载完全相同的纹理 - size属性总是正确的:256x256。

我还尝试在任何其他操作之前加载此纹理,以避免任何可能的副作用。然而,纹理大小仍然错误。

值得注意的是,并非所有纹理都会出现这种情况,但我加载的所有256x256纹理都会出现这种情况。一个128x256的纹理会正确报告其大小。

我还进行了一次干净的构建,并在Mavericks(13A603)上使用Xcode 5.0.1(5A2053)进行测试。


我向苹果报告了这个错误。错误ID:15377856 - CodeSmile
好的,就在我这样做之后,我打开了PNG文件在Seashore中,只是为了再次保存它。之后,大小属性就正确了。 - CodeSmile
3个回答

3
显然,这个问题是由于不兼容的图像程序引起的,在我的情况下,Inkscape总是罪魁祸首。由Inkscape创建的PNG文件似乎可以正常工作,但会导致Sprite Kit报告大小不正确。在我遇到的每种情况中,解决方法就是简单地在Seashore中打开PNG文件,然后在相同的文件名下“另存为”,以强制程序重新保存PNG文件。我认为使用其他图像程序打开和保存也可能有效,也许甚至可以使用Preview来修复此问题或者类似PNGCrush的命令行工具。

此外,Inkscape纹理大小报告为实际大小的20%较小,即256像素纹理的大小为204.8,1像素纹理的大小为0.8。问题似乎出在Inkscape的ppi(每英寸像素数)设置上,它不允许低于90 ppi的值。但是Photoshop的默认值为72 ppi,正好比Inkscape少了20%。我认为Sprite Kit假定PNG文件为72 ppi,获取到一个90 ppi的图像,因此错误(或正确?)地将PNG文件的大小计算为实际大小的20%较小。


不错的发现。显然SVG(如inkscape)是90 dpi,而大多数其他程序使用72 dpi。我认为根本罪魁祸首是NSImage与UIImage的行为,非常令人沮丧。 - bw1024

0
你是用常规方法创建纹理还是直接在屏幕上显示?我今天遇到了类似的动画问题,我认为这可能与纹理的懒加载有关。它们实际上只有在使用时才会加载。尝试使用以下代码并检查大小:
    [tempTexture preloadWithCompletionHandler:^{}];

这也可能解释了为什么矩形是0,0,1,1。

不,结果还是一样的。纹理矩形没问题,它是以因子表示的,其中宽度/高度为1表示整个纹理的宽度/高度。 - CodeSmile

0
在Finder图像预览中,您可以看到图像的尺寸分辨率。分辨率来自EXIF信息。简单的解决方案是删除该EXIF信息。
您可以使用ImageMagick轻松实现这一点:
convert image.png -strip image-with-no-exif.png

或者您可以原地修改图像:

convert -strip image.png

如果您现在在Finder中查看,Resolution字段应该已经消失了。

您还可以使用以下方式检查详细的EXIF信息:

identify -verbose image.png

一旦去除了EXIF信息,SpriteKit报告的大小就是像素大小(在Xcode 12.2上测试过)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接