【问题标题】:does the spritebatch draws multiple stages with a single batch? Libgdxspritebatch 是否用一个批次绘制多个阶段? Libgdx
【发布时间】:2015-05-05 06:04:58
【问题描述】:

标题说明了一切。

使用相同的SpriteBatcher 对象调用多个Stages draw() 方法只发生在一个批次中还是一个Stage = 一个批次?

我有一种情况,我不想在游戏背景中使用演员,我只是直接绘制它。但算法看起来像这样。

  1. 开始批处理
  2. 绘制背景
  3. 结束批次
  4. 调用所有舞台抽奖

如果你的答案是:spritebatch 会在一批中绘制多个stage,那么我可以说将每个sprite 作为一个成员放入一个Actor 对象,然后将所有Actor 对象添加到Stage 对象中,这样效率更高,那么叫舞台抽奖。这样,我可以最大限度地减少开始批处理和结束批处理的调用,据我所知,这可以提高性能。

【问题讨论】:

  • 现代低端手机可以在帧速率降至 60 FPS 以下之前进行大约 50 次绘制调用。当然,还有其他因素会影响这一点,但几乎可以肯定的是,为了节省一次绘图调用而使代码复杂化是不值得的。
  • 附加信息。伟大的。谢谢。
  • 另一件事。默认情况下,libgdx 中的按钮和表格也会导致批量刷新,因此除非您调用 setTransform(false);在它们上,只要您不打算缩放或旋转它们就可以了。如果你使用很多按钮,这些真的可以加起来。

标签: libgdx


【解决方案1】:

Stages code,好像调用了batch.begin()batch.end()

public void draw () {
    Camera camera = viewport.getCamera();
    camera.update();

    if (!root.isVisible()) return;

    Batch batch = this.batch;
    if (batch != null) {
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        root.draw(batch, 1);
        batch.end();
    }

    if (debug) drawDebug();
}

因此,将您的 Actors 添加到 Stage 可能会减少绘制调用。
但请记住,如果Batch 已满,则无论如何都会是flush()ed,这会导致抽签。
所以它不一定会减少绘图调用的数量。也不要过多考虑性能,只要你没有性能问题。如果其他解决方案接缝“更干净”,我想它不值得改变。
需要记住的一件重要事情是,在与多个Batch 合作时,先调用end(),然后再调用begin()。你不应该同时有 2 个 Batches “运行”。

【讨论】:

  • 谢谢。我不知道那批能不能满。
  • 使用默认构造函数,SpriteBatch在调用flush()之前可以包含1000个Sprites。您可以通过使用带有int size 的构造函数来增加该大小,这里最大为5460。您可以阅读此here
  • 谢谢您的回答。我不明白为什么Stage 类的rootviewport 成员是private 而不是protected。我们可以通过扩展Stage 类来覆盖draw 方法。
  • 我测试了它,将整个scene2d导入到我的项目中,并删除了Stage类的draw方法中的batch.begin()batch.end(),这样我就只有一个batch.begin()和@ 987654351@。帧率甚至没有改变 1FPS。所以不用担心。
  • @EnesBatta 我猜,一些drawcallse或多或少不会对性能产生太大影响。但只是一个问题:您是在手机上还是在台式机上进行了测试?我猜在低端安卓手机上你会更早地注意到性能损失,然后在具有更多硬件资源的桌面上。
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多