【问题标题】:Confusion: SKSpriteNode & SKTexture difference.困惑:SKSpriteNode 和 SKTexture 的区别。
【发布时间】:2013-10-04 12:29:27
【问题描述】:

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

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

混乱存在,两者之间有什么区别。

【问题讨论】:

    标签: iphone ios ipad ios7 sprite-kit


    【解决方案1】:

    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 级别,它是将原始纹理按一定比例缩小,以便使用相同纹理的较低分辨率版本绘制更远的多边形,从而减少锯齿并加快渲染速度。

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

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

    【讨论】:

    • 这是一个很好的答案。清除了我的困惑,但为什么他们称之为纹理。什么是纹理,什么是图像?在 SpriteKit 中,图像是否被称为纹理。如果是,那么为什么我们直接在 Sprite Node 中将图像指定为 [SKSpriteNode SpriteNodeWithImageName: "etcImage"];而不是在 SKTexture 中指定图像并使用 SKSpriteNode 访问它。如果我们使用 SKSpriteNode 访问它,图像仍然会被称为纹理吗?很抱歉问更多问题,但我需要更多说明。如果你也让我澄清一下,我将不胜感激。因为也和那个有关。
    • @LearnCocos2D,你说it will load the image, convert it to a texture, and store it with the image name as key for future reference这是否意味着我每次想要创建新精灵时(例如触摸屏时)都可以初始化具有相同名称的新纹理,并且它将被缓存或者我需要将纹理创建为属性,然后在创建新的精灵节点时从该属性获取纹理?
    • 很好的答案!谢谢,我觉得不那么无知了
    • @flinth 你可以两者都做,或者如果你有一个现有的精灵,只需用 sprite.texture 初始化一个新的精灵,这样你就不需要那个额外的属性。按名称获取纹理有一些开销,因此如果您已经有纹理引用,则使用它会更快,尽管通常这仅在您每帧创建多个精灵并使用纹理名称时才起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 2014-08-30
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2013-09-22
    相关资源
    最近更新 更多