Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TextureAtlas的优势以及如何正确使用它_Java_Opengl_Textures_Libgdx_Texture Atlas - Fatal编程技术网

Java TextureAtlas的优势以及如何正确使用它

Java TextureAtlas的优势以及如何正确使用它,java,opengl,textures,libgdx,texture-atlas,Java,Opengl,Textures,Libgdx,Texture Atlas,我正在重构我在libgdx中开发的小型rpg 我有一个关于如何正确使用纹理图集的一般性问题。我有大约100名演员和大约10种精灵。当前我不使用atlas,但我想提高渲染性能,因为如果我的游戏循环中有100个绑定和15个渲染调用,这是唯一需要花费很长时间的事情 因此,它查看了TextureAtlas类,并想知道如何从中获得更高的性能。如果我得到一个具有正确纹理的精灵,我会得到一个副本,这样我仍然会切换OpenGL绑定,对吗?所以如果我有100个演员都有自己的精灵,那么这不是一个更好的解决方案,一个

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

我有一个关于如何正确使用纹理图集的一般性问题。我有大约100名演员和大约10种精灵。当前我不使用atlas,但我想提高渲染性能,因为如果我的游戏循环中有100个绑定和15个渲染调用,这是唯一需要花费很长时间的事情

因此,它查看了TextureAtlas类,并想知道如何从中获得更高的性能。如果我得到一个具有正确纹理的精灵,我会得到一个副本,这样我仍然会切换OpenGL绑定,对吗?所以如果我有100个演员都有自己的精灵,那么这不是一个更好的解决方案,一个特别的解决方案,还是我错了,只是我没有弄对

Atlas本身并不建议多次调用getsprite,但我需要这样做,以便每个参与者都有自己的具有自己状态的sprite


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

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


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

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


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

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

不,你得到了最好的结果。雪碧是一个更专业的纹理区域

因此,当您绘制所有精灵时,如果它们来自同一纹理,则只需绘制一次

如何获得具有相同纹理区域的多个精灵 在渲染时,是否在没有新绑定的情况下创建图集

只需使用:

当您绘制它们时,例如:

batch.begin();
sprite.draw(batch)
sprite2.draw(batch);
sprite3.draw(batch);
batch.end();
如果3个精灵来自同一个TextureAtlas,它们将只刷新批次一次

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

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

不,你得到了最好的结果。雪碧是一个更专业的纹理区域

因此,当您绘制所有精灵时,如果它们来自同一纹理,则只需绘制一次

如何获得具有相同纹理区域的多个精灵 在渲染时,是否在没有新绑定的情况下创建图集

只需使用:

当您绘制它们时,例如:

batch.begin();
sprite.draw(batch)
sprite2.draw(batch);
sprite3.draw(batch);
batch.end();
如果3个精灵来自同一个TextureAtlas,它们将只刷新批次一次

编辑
TextureRegion只是参考TextureAtlas的矩形的坐标和大小。别担心,纹理没有被复制。它是唯一的一个,与您从中创建多少精灵无关:

是的,但我如何实现这一点,以便在渲染时获得具有相同纹理区域的多个精灵,而无需新绑定。get sprite似乎复制了纹理,或者我完全错了。对不起,我完全感到困惑抱歉,我熟悉纹理地图集,但不熟悉您正在使用的库,因此我无法更具体地说明。@Bennx只需根据纹理上的多个精灵计算所有UV坐标。无需将纹理重新发送到图形卡,这无论如何都不会发生。纹理不需要重新发送,但纹理上下文切换仍然很昂贵。是的,但如何实现这一点,以在渲染时获得具有相同纹理区域的多个精灵,而无需新绑定。get sprite似乎复制了纹理,或者我完全错了。对不起,我完全感到困惑抱歉,我熟悉纹理地图集,但不熟悉您正在使用的库,因此我无法更具体地说明。@Bennx只需根据纹理上的多个精灵计算所有UV坐标。无需将纹理重新发送到图形卡,这无论如何都不会发生。纹理不需要重新设置
但是纹理上下文切换仍然很昂贵。所以精灵的纹理区域的纹理应该是地图册的参考?我真的没有看到创建精灵方法的内部。是的,Atlas就是纹理。是的,TextureRegion只是一个参考它的矩形的坐标和大小。别担心,纹理没有被复制。这是唯一的一个,不管你用它创造了多少精灵:非常感谢。我真的很困惑,即使在我看了代码之后。谢谢你的解决方案。也许也可以把它加到你的答案中。那么雪碧的纹理区域应该是地图册的参考?我真的没有看到创建精灵方法的内部。是的,Atlas就是纹理。是的,TextureRegion只是一个参考它的矩形的坐标和大小。别担心,纹理没有被复制。这是唯一的一个,不管你用它创造了多少精灵:非常感谢。我真的很困惑,即使在我看了代码之后。谢谢你的解决方案。也许把它也加到你的答案里。