6

我在 OS X 版本的 Sprite Kit 上测试一个游戏,发现一些纹理错误地报告了它们的大小。我想知道是否有其他人看到这个问题以及是否有解释?

只是为了在我将此报告为错误之前排除任何其他问题。如果这是一个已知的错误,请说出来。

我正在加载这个纹理,它的大小是 256x256 像素:

在此处输入图像描述

当我记录从此图像创建的 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 模拟器和设备上使用相同的代码加载完全相同的纹理 - 大小属性始终正确:256x256。

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

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

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

4

3 回答 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,正好少了 20%。我认为 Sprite Kit 假设 PNG 为 72 ppi,得到 90 ppi 的图像,因此错误地(或正确地?)计算出 PNG 的大小比实际大小小 20%。

于 2015-04-20T19:19:30.607 回答
0

您是使用常规方法创建纹理还是将其实际显示在屏幕上?今天我对动画也有类似的问题,我认为这与纹理的延迟加载有关。直到您必须使用它们时,它们才会真正加载。尝试使用它并检查大小:

    [tempTexture preloadWithCompletionHandler:^{}];

这也可以解释为什么矩形是 0,0,1,1

于 2013-11-02T19:45:22.240 回答
0

在 Finder 图像预览中,您可以看到图像的DimensionsResolution。解析来自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 上测试)。

于 2020-12-25T12:54:54.983 回答