我对SKSpriteNode& SKTexture节点。我在教程中看到SKSpriteNode可以用来添加像[SKSpriteNode spritenodewithimagename:@“someimag”]这样的图像;同样的事情发生在SKTexture中[SKTexture texturewithimge / file];
纹理和图像之间有什么区别。如果我们使用SKSpriteNode添加图像,那么使用SKTexture的原因是什么,或者如果我们使用SKTexture和Texture Atlases,那么我们为什么要在SKSpriteNode中添加要添加的图像。
存在困惑,两者之间有什么区别。
答案 0 :(得分:34)
SKSpriteNode是一个节点,它在给定位置的屏幕上显示(渲染)SKTexture,并可选择缩放和拉伸。
SKTexture是一个存储类,包含适合渲染的格式的图像文件,以及纹理仅引用图像/纹理图集的较小部分时的框架矩形等附加信息。
分裂两者的一个原因是你通常想要使用相同的SKTexture或同一个SKTextureAtlas绘制多个精灵。这避免了必须在每个精灵的内存中保留相同图像的副本,这很容易变得过高。例如,100 Sprite使用的4 MB纹理仍然使用4 MB内存,而不是400 MB。
更新回复评论:
术语'纹理'dates back to the 70s。
纹理是专门用于渲染的图像的内存中表示。常见的图像格式(PNG,JPG,GIF等)不适合图形芯片渲染。纹理是一种“图像格式”,图形硬件和渲染器(如OpenGL)可以理解并标准化。
如果将PNG或JPG加载到纹理中,则图像的格式会发生变化。它的颜色深度,alpha通道,方向,内存布局,压缩方法可能会发生变化。可能会引入其他数据,例如mip-map level,这是缩小一定百分比的原始纹理,以便使用相同纹理的较低分辨率版本绘制更远的多边形,从而减少锯齿并加快渲染速度。 / p>
但这只是表面上的问题。重要的是要记住,没有渲染引擎直接处理图像,它们总是被转换为纹理。这主要与渲染过程的效率有关。
无论何时直接在Sprite Kit等API中指定图像,例如spriteWithImageNamed:
,内部会发生的事情是渲染器首先检查是否存在具有给定图像名称的现有纹理,如果是,则使用那。如果还没有加载这样的图像,它将加载图像,将其转换为纹理,并将图像名称存储为关键以供将来参考(这称为纹理缓存)。