【问题标题】:cocos2d-x 3 batch drawing explainedcocos2d-x 3 批量绘图讲解
【发布时间】:2014-07-02 23:05:24
【问题描述】:

我已阅读this page 了解批量绘图详细信息,但我仍有疑问。我知道为了减少绘图调用次数,我们需要使用批量绘图。我是这样使用的:

auto spritebatch = SpriteBatchNode::create("ingame.png");
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ingame.plist");

现在我需要创建一个 Sprite 我必须这样做:

auto backgroundSprite = Sprite::createWithSpriteFrameName("back_gradient.png");
spritebatch->addChild(backgroundSprite);

但我不明白以下几点:

  1. 如果我的游戏有多个精灵表怎么办。例如,我有 HUD spritesheet 和 ingame spritesheet。现在如果我想用HUD显示游戏画面那么我需要创建2个SpriteBatchNode?并将它们添加到游戏层?
  2. 如果在不同的场景中使用相同的 spritesheet 会怎样。我应该再次执行以下操作吗?

    auto spritebatch = SpriteBatchNode::create("ingame.png"); SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ingame.plist");

  3. 如果我使用带有ButtonTextEditLabel 和其他 UI 元素的精灵会怎样。

    • 首先,我可以从 spritesheet 初始化 Button 状态图像吗?
    • 据我所知,我无法将 UI 元素作为子元素添加到 SpriteBatchNode。在这种情况下,如何在同一视图/场景中组合 UI 元素和精灵?

很抱歉有很多问题。但事实是我找不到任何包含对这个问题的解释的资源。虽然它们都是相关的。如果你不知道这些问题的答案,你就不知道如何使用SpriteBatchNode

【问题讨论】:

  • cocos2d-x 3+版本不需要使用SpriteBatchNode
  • @GameDeveloper 但是有!你减少了draw call。如果你有 7 个不同的图像,在屏幕上作为 sprite,那么你有 7 个绘制调用,而如果你使用 spritsheet,你只有一个绘制调用用于 7 个不同的图像。仅当您多次绘制同一图像时才需要,因为在第一次之后它已经在缓存中。

标签: c++ cocos2d-x cocos2d-x-3.0 batch-drawing


【解决方案1】:

在 cocos2d-x v3 中不要使用 CCSpriteBatchNode。批处理是自动的,最好留给渲染器通过批处理绘制来优化绘制调用。它在您链接的文章中说得对:

渲染图与场景图分离。这意味着最终支持自动批处理 :-) 而且新渲染器非常快,我们不再鼓励使用 SpriteBatchNode。

【讨论】:

  • 我对此的结论如下:我应该使用 spritsheet 来缓存整组图像,也用于创建动画,但我不需要使用批处理节点。批处理正在自动完成。对吗?
【解决方案2】:

我不同意,这取决于我们希望尽可能快地获得大部分新渲染。

纳瑞克,你是对的。 在渲染期间,几何图形将被排序以减少 GL 调用的数量。但不要指望它将不同父母的孩子排成一行。示例:你有

节点 A 和子节点 abac

具有子节点 bdbe 的节点 B

如果 b 和 d 使用相同图集的纹理,则不能保证您将获得使用图集的任何性能提升。

但我可以确认,目前它真的很快,而且在我的情况下,GL 调用根本不是瓶颈 :)

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多