Libgdx 将位图字体渲染为像素图纹理会导致渲染速度极慢

Libgdx Rendering Bitmap font to pixmap texture causes extremely slow rendering

我正在使用 libgdx scene2d 渲染二维演员。其中一些 actors 最初包括用于渲染静态文本的 scene2d 标签 actors。标签工作正常,但一次在屏幕上绘制约 20 个标签会使帧速率降低 10-15 帧,导致拖动时渲染效果明显不佳。

我试图通过将文本预先绘制到纹理并将纹理渲染为 scene2d 图像演员来避免标签。我正在使用以下代码创建纹理:

    BitmapFont font =  manager.get(baseNameFont,BitmapFont.class);
    GlyphLayout gl = new GlyphLayout(font,"Test Text");

    int textWidth = (int)gl.width;
    int textHeight = (int)gl.height;
    LOGGER.info("textHeight: {}",textHeight);
    //int width = Gdx.graphics.getWidth();
    int width = textWidth;
    //int height = 500;
    int height = textHeight;

    SpriteBatch spriteBatch = new SpriteBatch();

    FrameBuffer m_fbo = new FrameBuffer(Pixmap.Format.RGB565, width,height, false);
    m_fbo.begin();
    Gdx.gl.glClearColor(1f,1f,1f,0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    Matrix4 normalProjection = new Matrix4()

            .setToOrtho2D(0, 0, width,  height);
    spriteBatch.setProjectionMatrix(normalProjection);

    spriteBatch.begin();

    font.draw(spriteBatch,gl,0,height);


    spriteBatch.end();//finish write to buffer

    Pixmap pm = ScreenUtils.getFrameBufferPixmap(0, 0, (int) width, (int) height);//write frame buffer to Pixmap

    m_fbo.end();

    m_fbo.dispose();
    m_fbo = null;
    spriteBatch.dispose();

    Texture texture = new Texture(pm);
    textTexture = new TextureRegion(texture);
    textTexture.flip(false,true);
    manager.add(texture);

我假设并阅读过,纹理通常更快。然而,当我用纹理替换标签时,它对帧速率有相同的影响,如果不是更糟的话。奇怪的是,我在从文件中添加纹理时没有遇到这种情况,这让我觉得我的代码做错了什么。我应该以不同的方式预渲染这些文本片段吗?

我没有对此进行测试,但我认为您可以通过将其根视图设置为使用与视口的世界宽度和高度匹配的 cullingArea 来为整个舞台启用剔除。我会在 resize 更新舞台视口后执行此操作,以防更新影响视口的世界宽度和高度。

@Override
public void resize(int width, int height) {
    //...
    stage.getViewport().update(width, height, true);
    stage.getRoot().setCullingArea(
        new Rectangle(0f, 0f, stage.getViewport().getWorldWidth(), stage.getViewport().getWorldHeight())
    );
}

它只能剔除 x、y、宽度和高度设置正确的 Actors。这是真的我想到了 scene2d UI 包中的任何东西,但是对于您自己的自定义 Actors,您需要自己做。

如果您的根视图的 child 是一个组,它包含的不仅仅是屏幕和许多演员,您可能还想剔除它的 children,这样即使组作为一个整体没有被根视图剔除,该组仍然可以剔除自己的一部分children。为了找出为此的剔除矩形,我认为您可以将组大小的矩形与视口的世界大小矩形相交,偏移量为组位置的 -x 和 -y(因为剔除矩形是相对于组位置的已开启)。