【问题标题】:Render nodes in single drawing pass with spritekit?使用 spritekit 在单个绘图过程中渲染节点?
【发布时间】:2014-04-04 01:35:41
【问题描述】:

当我四处寻找有关 spritekit 纹理的信息时,我偶然发现了这句话:

如果一个节点的所有子节点都使用相同的混合模式和纹理图集,那么 Sprite Kit 通常可以在一次绘制过程中绘制这些精灵。另一方面,如果子元素的组织方式使得每个新精灵的绘图模式都发生变化,那么 Sprite Kit 可能会作为每个精灵一个绘图通道执行,这是非常低效的。

但是看看这个:

具有相同纹理的瓷砖(我向你保证这是一种纹理,而不仅仅是一种颜色)

具有自己纹理的瓷砖

虽然使用的所有纹理都来自同一个图集,但绘制次数相差 40。

我对“atlas”这个词的解释有误吗?

这是我存储图像的地方:

我的示例是“纹理图集”,还是此处的“图集”定义是一个包含所有所需图像的单个 .png,并从中切出单个图块?

或者问题可能在于我如何加载/其他东西?

谢谢!

【问题讨论】:

    标签: drawing sprite-kit sktextureatlas


    【解决方案1】:

    这里的问题很可能是由于节点图本身。假设您有 100 个精灵作为场景的子节点,没有它们自己的子子节点,并且它们都使用来自相同图集和默认混合模式的纹理,然后 Sprite Kit 将在一次绘制调用中批量绘制这 100 个精灵。

    但是,如果这些瓦片精灵有自己的子节点,可能是用于调试的形状或标签节点,那么这将“中断”批量绘制操作。

    检查您的节点图。确保所有平铺精灵都是同一父级的子级,并且没有自己的子级,使用来自同一图集的相同混合模式和纹理。那么批量绘图肯定会起作用。

    如果这不起作用,请验证tiles.atlas 文件夹是否已正确转换为捆绑包中的纹理图集。如果您打开已编译的应用程序包,您应该会找到一个名为“tiles.atlasc”的文件夹,其中包含一个 plist 和一个或多个 png 文件,其中包含该文件夹的所有单独图像。此外,这些单独的图像都不应该出现在包中 - 如果它们作为单独的文件添加到包中,使用与图集中相同的名称,那么 Sprite Kit 将默认加载单独的图像文件,而不是从纹理图集中获取它们.

    【讨论】:

    • 嗯,这仍然不起作用。精灵节点是节点的子节点,而不是场景的子节点,这是问题吗?他们都没有孩子。编辑:我是个白痴。我的一种瓷砖类型是指图像文件夹中的一张图像......而那个瓷砖把它搞砸了。它恰好是我的坚实地砖......
    • 嗯...帮我做一件事。以这种方式加载纹理似乎非常低效。初始化精灵现在对我来说需要更长的时间,因为瓦片地图需要不断循环并随着它的进行而生成。初始化这样一个精灵的最快方法是什么?
    • 好吧,如果你经常运行 ..imageNamed: 方法(对于 sprite 和纹理/textureatlas),可能会产生大量开销。对于我的 tilemap,我将图集保存在一个强引用中,并将纹理保存在一个数组中(由 GID 索引)以便快速访问。看看 kobold kit 中的 tilemap 渲染器。
    • 谢谢!该系统在所有系统中表现最好。你是一个巨大的帮助。
    • @LearnCocos2D 我有一个问题,如果我将所有节点的 blendFactor 保持为任何特定数字 1.00,它仍然会影响批量绘图吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-02-22
    • 2017-10-06
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多