我对SKSpriteNode和SKTexture节点感到困惑。我在教程中看到,可以使用SKSpriteNode添加图像,例如[SKSpriteNode spritenodewithimagename:@“someimag”];并且在SKTexture中发生的事情与[SKTexture texturewithimge/file]相同;

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

困惑在那里,两者之间有什么区别。

最佳答案

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

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

将两者分开的原因之一是,您通常希望使用相同的SKTexture或从相同的SKTextureAtlas绘制多个 Sprite 。这样避免了必须为每个单独的sprite将同一图像的副本保存在内存中,而这很容易成为限制。例如,由100个Sprite使用的4 MB纹理仍然使用4 MB内存,而不是400 MB。

更新以回答评论:

术语“纹理” dates back to the 70s

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

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

不过,这只是表面上的划痕。要记住的重要一点是,没有渲染引擎直接与图像一起使用,它们始终会转换为纹理。这主要与渲染过程的效率有关。

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

10-07 18:14