混乱:SKSpriteNode和SKTexture的区别。

我对SKSpriteNode&SKTexture节点感到困惑。 我已经在教程中看到SKSpriteNode可以用来添加像[SKSpriteNode spritenodewithimagename:@“someimag”]; 和SKTexture一样,SKTexture也是如此[SKTexture texturewithimge / file];

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

有混乱,两者有什么不同。

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

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

分裂两者的一个原因是,你通常想要多个精灵使用相同的SKTexture或从相同的SKTextureAtlas绘制。 这样可以避免为每个独立的精灵保留相同图像的副本,这很容易变得不可思议。 例如,100个Sprites使用的4 MB纹理仍然使用4 MB的内存,而不是400 MB。

更新回答评论:

“纹理”一词可以追溯到70年代 。

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

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

这只是表面而已。 要记住的重点是没有渲染引擎直接处理图像,它们总是被转换成纹理。 这主要与渲染过程的效率有关。

无论何时你直接在一个API(比如Sprite Kit)中指定一个图像,例如spriteWithImageNamed:那么内部会发生的是,渲染器首先检查是否存在具有给定图像名称的现有纹理,如果是,则使用该纹理。 如果没有加载这样的图像,它将加载图像,将其转换为纹理,并将图像名称存储为将来参考的关键(这称为纹理caching)。