libgdx中的Texture,TextureRegion,TextureAtlas,Sprite和Image之间有什么区别?


12

我到处搜索了教程。我见过人们使用上述类来加载图像。

根据我的理解,所有类都无法读取两个图像的幂次,因此TextureRegion / TextureAtlas通常用于加载Sprite工作表,其中工作表包含多个图像。而对于Texture / Sprite / Image,它们用于加载带有单个图像的Sprite工作表。

但是,我不确定在哪种情况下应该使用Texture / Sprite / Image,在哪种情况下应该使用TextureRegion / TextureAtals。

如果我写错了,请纠正我,因为在看了各种教程后,我对API中的术语有些困惑。

Answers:


18

首先,Texture vs TextureRegion:当您执行Texture t = new Texture(path)之类的操作时,您正在将其加载到GPU中。另外,您应该加载2个纹理的幂。您可以使用其他分辨率(Texture.setEnforcePotImages = false),但建议使用2的pow。

现在,TextureRegion从纹理中获取一个“片段”,而不管其尺寸如何。具有一个Texture和该Texture的多个TextureRegion的优点是,您无需将每个区域都加载到GPU中。

正如您可能在想的那样,当您想使用SpriteBatch进行绘制时,使用TextureRegion而不是多个Textures效率更高,很抱歉,我的英语还不够好。这是一个很好的解释:Textures TextureRegion和SpriteBatch


现在,您要对所有子画面和图像使用TextureRegion和一幅分辨率为2的单幅图像。是否必须创建具有所有坐标和尺寸的TextureRegions?您需要打开油漆来计算像素吗?不,你不知道。您可以使用诸如TexturePacker之类的东西。它将所有纹理打包到一个图像中,并创建一个具有所有尺寸和坐标的.pack文件。

TexturePacker

结果将是这样的:

包

代替创建Texture,而是创建TextureAtlas,如下所示:

创建TextureAtlas

现在,创建您的TextureRegions将非常简单:

findRegion

(请注意,区域名称是不带扩展名的原始图像的名称)。


Sprite保留使用Batch绘制2D Sprite的几何,颜色和纹理信息。这意味着,您可以轻松地旋转它们并移动它们。我已经创建了自己的Entity类,并且不需要Sprite类。您可能会做同样的事情。我觉得这节课不是真的有用。


图像类继承自Actor。这意味着您可以将其添加到舞台中。它是Scene2D软件包的一部分。如果您是libgdx的新手,并且您不了解此软件包,那么对于您而言,这是关于该类的足够信息。这是一个非常有趣的话题,但不能回答这个问题。

希望能帮助到你 :)


谢谢!现在更清楚了。:)那么从Texture创建TextureRegion和从TextureAtlas创建TextureRegion的性能如何?
user15783 2013年

4
@ user15783提出新问题。
David J. Liszewski 2013年

很多有用的信息,但是这部分不准确/具有误导性:“您没有将每个区域都加载到GPU中”实际上,您是在将每个区域都加载到GPU中。只是多个TextureRegion可以引用纹理的不同(或重叠)部分,而Texture始终引用整个图像。由于切换纹理很昂贵,所以这很好。您的描述听起来像是TextureRegion处理稀疏纹理(la。GL_ARB_sparse_texture),但libGDX及其运行的大多数硬件都不支持该扩展。
bcrist 2015年

另外,与代码的屏幕截图相比,请使用SE的markdown代码块。这样,如果人们愿意,就可以轻松地复制和粘贴内容。只需在代码块的每一行以四个空格开头。内联代码跨度可以通过使用带有重音符(反引号)的字符包围文本来创建:`
bcrist
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.