【问题标题】:Advantage of the TextureAtlas and how to use it rightTextureAtlas 的优势以及如何正确使用它
【发布时间】:2014-01-16 09:48:45
【问题描述】:

我正在重构我在 libgdx 中开发的小型 RPG。

我遇到了一个一般性的问题,即如何正确使用纹理图集。我有大约 100 个演员和大约 10 种 Sprite。目前我不使用图集,但我想提高渲染性能,因为如果我的游戏循环,这是唯一需要很长时间的事情。(大约有 100 个绑定和 15 个渲染调用..)

所以它查看了TextureAtlaslink to git 并想知道如何从中获得更多性能。如果我得到一个具有正确纹理的精灵,我会得到一个副本,所以我仍然会切换 OpenGL 绑定吗?因此,如果我有 100 个演员都拥有自己的精灵,那将不是一个更好的解决方案,或者我错了,我只是没有做对?

Atlas 本身不建议多次调用 getsprite,但我需要这样做,以便每个演员都有自己的 sprite 和自己的状态。

也许你可以给我一个小例子,我如何在不切换 OpenGL 绑定的情况下使用一个图集中的多个精灵。这应该是使用图集的原因,但我现在不明白。

【问题讨论】:

    标签: java opengl textures libgdx texture-atlas


    【解决方案1】:

    如果我得到一个具有正确纹理的精灵,我会得到一个副本,所以我仍然会切换 OpenGL 绑定吗?

    不,你会得到它的TextureRegion。 (Sprite 是一个更专业的 TextureRegion)。

    所以当你绘制所有精灵时,如果它们来自同一个 TextureAtlas,它们只需要一次绘制。

    我如何实现它来获得具有相同纹理区域的多个精灵 渲染时没有 New 绑定的图集?

    只需使用TextureAtlas#createSprite:

    sprite = textureatlas.createSprite("example");
    

    当你绘制它们时,例如这样:

    batch.begin();
    sprite.draw(batch)
    sprite2.draw(batch);
    sprite3.draw(batch);
    batch.end();
    

    如果 3 个精灵来自同一个 TextureAtlas,它们只会刷新一次批次。

    编辑
    TextureRegion 只是引用 Texture(Atlas) 的坐标和大小(矩形)。别担心,纹理没有被复制。它只有一个,不管你用它创建了多少精灵 :)

    【讨论】:

    • 那么精灵的textureregion的纹理应该是参考图集吧?在 create sprite 方法中,我并没有真正看到这一点。
    • 是的,Atlas 就是纹理。是的,TextureRegion 只是引用它的坐标和大小(一个矩形)。别担心,纹理没有被复制。它只有一个,不管你用它创建了多少精灵 :)
    • 非常感谢。即使在我查看了代码之后,我也真的对此感到困惑。感谢您的解决方案。也许也将其添加到您的答案中。
    【解决方案2】:

    您更改对象顶点上的纹理坐标以移动它们在纹理图集中指向的位置。通过正确设置对象,您可以在许多对象之间共享一个大纹理,而不是在许多小对象和许多小纹理之间共享。

    当事情发生变化时,无需将纹理重新发送到显卡等,您只需移动对象的纹理坐标以指向您希望它们指向的图集的新部分。

    【讨论】:

    • 是的,但我如何实现这一点要在渲染时获得多个具有相同纹理区域的图集,而无需新绑定。 get sprite 似乎复制了纹理,或者我完全错了。对不起,我完全不解
    • 抱歉,我对纹理图集很熟悉,但对您使用的库不熟悉,所以我不能更具体。
    • @Bennx 只是根据纹理上的多个精灵计算所有的 UV 坐标。
    • "没有必要将纹理重新发送到显卡" 反正不会发生。纹理不需要重新发送,但纹理上下文切换仍然代价高昂。
    猜你喜欢
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-11-17
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多