spritebatch是否使用单个批次绘制多个阶段?Libgdx

spritebatch是否使用单个批次绘制多个阶段?Libgdx,libgdx,Libgdx,标题说明了一切 使用相同的SpriteBatcher对象调用多个Stages draw()方法是只在一个批中发生,还是一个Stage=一个批 我不想用演员作为游戏的背景,我只是直接画出来。但是算法看起来是这样的 开始批量 画背景 终批 全场抽签 如果您的答案是:spritebatch将在一批中绘制多个舞台,那么我可以说,将每个精灵作为演员对象的成员,然后将所有演员对象添加到舞台对象,然后调用舞台绘制更有效。通过这种方式,我可以最小化对begin batch和end batch的调用,据我所知,这

标题说明了一切

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

我不想用演员作为游戏的背景,我只是直接画出来。但是算法看起来是这样的

  • 开始批量
  • 画背景
  • 终批
  • 全场抽签
  • 如果您的答案是:spritebatch将在一批中绘制多个舞台,那么我可以说,将每个精灵作为演员对象的成员,然后将所有演员对象添加到舞台对象,然后调用舞台绘制更有效。通过这种方式,我可以最小化对begin batch和end batch的调用,据我所知,这可以提高性能。

    查看,它似乎调用了
    batch.begin()
    batch.end()

    因此,将您的
    Actor
    s添加到
    Stage
    可能会减少抽签调用。
    但是请记住,如果批处理
    已满,它将被
    flush()
    ed,这将导致一个draw调用。
    因此,它不一定会减少draw调用的数量。另外,只要没有性能问题,就不要过分考虑性能。如果其他解决方案“更干净”,我想不值得改变它。

    在处理多个
    批处理时,需要记住的一件重要事情是,在调用另一个
    begin()
    之前,先调用一个
    end()
    。您不应该让2个批处理同时运行。

    谢谢。我不知道批处理是否已满。在调用
    flush()
    之前,使用默认构造函数,
    SpriteBatch
    可以包含1000个
    Sprite
    s。您可以使用带有
    int size
    的构造函数来增加该大小,这里的最大值是5460。你可以看这个谢谢。你太棒了。我感谢你的回答。我不明白为什么
    root
    viewport
    类的
    Stage
    成员是
    private
    而不是
    protected
    。我们可以通过扩展
    Stage
    类来覆盖
    draw
    方法。我测试了它,将整个scene2d导入到我的项目中,并删除了
    Stage
    类的
    draw
    方法中的
    batch.begin()
    batch.end()中的
    batch.end()
    。帧率甚至1FPS也没有改变。所以别担心,在帧速率降至60 FPS以下之前,现代低端手机可以打大约50个抽奖电话。当然,还有其他因素会影响到这一点,但几乎可以肯定的是,保存一个draw调用不值得让代码复杂化。伟大的谢谢,还有一件事。默认情况下,libgdx中的按钮和表也会导致批处理刷新,因此,除非调用setTransform(false),否则每个按钮和表都会得到一个额外的draw调用;在它们上,只要不打算缩放或旋转它们,就可以了。如果你用了很多按钮,这些真的可以加起来。
    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();
    }