8

我对 SKSpriteNode 和 SKTexture 节点感到困惑。我在教程中看到 SKSpriteNode 可用于添加图像,如 [SKSpriteNode spritenodewithimagename:@"someimag"]; 在 SKTexture 中也发生了与 [SKTexture texturewithimge/file] 相同的事情;

纹理和图像有什么区别。如果我们使用 SKSpriteNode 添加图像,那么使用 SKTexture 的原因是什么,或者如果我们使用 SKTexture 和 Texture Atlases,那么为什么我们在 SKSpriteNode 中添加要添加的图像。

混乱就在那里,两者之间有什么区别。

4

1 回答 1

36

SKSpriteNode 是一个节点,它在屏幕上的给定位置显示(渲染)一个 SKTexture,具有可选的缩放和拉伸。

SKTexture 是一个存储类,其中包含适合渲染的格式的图像文件,如果纹理仅引用图像/纹理图集的较小部分,则还包含框架矩形等附加信息。

将两者分开的一个原因是您通常希望多个精灵使用相同的 SKTexture 或来自相同的 SKTextureAtlas 进行绘制。这避免了必须为每个单独的精灵在内存中保留相同图像的副本,这很容易变得令人望而却步。例如,100 个 Sprite 使用的 4 MB 纹理仍然使用 4 MB 内存,而不是 400 MB。

更新以回答评论:

“质地”一词可以追溯到 70 年代

纹理是专门用于渲染的图像在内存中的表示。常见的图像格式(PNG、JPG、GIF 等)不适合由图形芯片进行渲染。纹理是图形硬件和渲染器(如 OpenGL)理解并标准化的“图像格式”。

如果将 PNG 或 JPG 加载到纹理中,图像的格式会发生变化。它的颜色深度、alpha 通道、方向、内存布局、压缩方法可能会发生变化。可能会引入其他数据,例如 mip-map 级别,这是将原始纹理按一定比例缩小,以便使用相同纹理的较低分辨率版本绘制更远的多边形,从而减少锯齿并加快渲染速度。

不过,这只是表面上的问题。需要记住的重要一点是,没有渲染引擎直接处理图像,它们总是被转换为纹理。这主要与渲染过程的效率有关。

每当您直接在诸如 Sprite Kit 之类的 API 中指定图像时,例如,在spriteWithImageNamed:内部发生的事情是渲染器首先检查是否存在具有给定图像名称的现有纹理,如果有,则使用它。如果还没有加载这样的图像,它将加载图像,将其转换为纹理,并将图像名称作为密钥存储以供将来参考(这称为纹理缓存)。

于 2013-09-28T13:08:17.110 回答