# 纹理打包

Spine可以将图片打包到纹理图集或网格(精灵表单)中，以便在运行时更高效地渲染。Spine的纹理打包器是一个通用工具。虽然它可以用于你的Spine骨架，但也可以单独运行以打包你的应用程序的所有图片。

在大多数图形API(例如，OpenGL)中，绑定一个纹理会完成一些绘图，绑定另一个纹理会完成更多绘图，以此类推。绑定纹理的成本相对较高，因此理想的做法是在较大的图片上存储许多较小的图片，绑定较大的纹理一次，然后多次绘制其各个部分。Spine可以有效地将许多较小的图片打包成较大的图片，从而形成所谓的“纹理图集”。

Spine使用多种高级打包算法。打包是用许多各种大小的试探法完成的，并选择最有效的结果。

<img src="/img/spine-user-guide/texture-packer/raptor-atlas.png" class="no-borders">!!

# 纹理图集文件

纹理图集由一个文件扩展名为“.atlas”的文本文件和一个或多个称为图集“页面图片”的图片文件组成。图集文件[描述](/spine-atlas-format)每个打包的较小图片在页面图片中的位置，称为图集“区域”。这些区域在图集文件中按名称引用。

一个纹理图集可以包含多个页面图片，从而可将应用程序的所有图片打包到单个图集中。使用多个图集的唯一原因是某些图片不需要同时加载。

# 打包

<callout>也可以使用[命令行界面](/spine-command-line-interface)进行纹理打包。</callout>

纹理打包器可以通过两种方式运行：

## 导出数据时打包

导出[JSON](/spine-export#JSON)或[二进制](/spine-export#二进制)时，请选中`打包`：

![](/img/spine-user-guide/texture-packer/create-atlas.png)

为如何查找要打包的图片文件提供了两个选项：

* `附件` 选中后，只打包附件使用的图片文件。不使用任何[pack.json](#JSON配置)文件。
* `图片文件夹` 选中后，将打包每个骨架的[图片路径](/spine-images#图片路径)中的图片文件。允许使用[pack.json](#JSON配置)文件为每个文件夹配置打包。

为纹理图集的创建方式提供了两个选项：

* `每个骨架图集` 为每个骨架打包一个图集。每个图集都使用骨架名称命名，与相应骨架数据文件的名称一致。
* `单个图集`将所有骨架的图片打包到一个图集中。图集使用项目文件的名称命名，不带文件扩展名。

`打包设置`按钮用于配置纹理打包器设置。

这是同时导出骨架数据和纹理图集的便捷方式。但是，单独运行纹理打包器可以更灵活。

## 单独运行纹理打包器。

从主菜单中选择`纹理打包器`：

![](/img/spine-user-guide/texture-packer/menu.png)

在纹理打包器对话框中，指定包含要打包的图片的文件夹、写入图集文件的位置以及图集的名称。

![](/img/spine-user-guide/texture-packer/dialog.png)

`设置`按钮用于配置纹理打包器设置。

# 设置

纹理打包器有许多设置来控制图片的打包方式。

![](/img/spine-user-guide/texture-packer/settings.png)

此对话框起初可能会让人望而生畏，但许多设置可以保留为默认设置。如下为一些值得注意的设置：

* 最大宽度和高度。这决定单个图集页面图片可以容纳多少。
* 打包矩形或多边形。打包多边形效率更高，但速度较慢，并且需要了解项目文件的上下文。
* 预乘Alpha。此设置应与图片在运行时的渲染方式匹配。
* 去除空白。
* 比例

## 区域

!table 设置, 描述

!row 去除空白X/Y
删除输入图片边缘周围的空白像素。删除的数量存储在图集数据中，因此可以在应用程序中绘制图片，就像它们没有被去除空白一样。

!row 旋转
将一些图片旋转90度可以实现更有效的打包。应用程序必须特别注意正确绘制这些区域。

!row 别名
像素对像素相同的两张图片将只打包一次。

!row 忽略空白图片
仅为透明像素的图片将不会打包。

!row Alpha阈值
去掉空白时，低于此值的Alpha值将被视为零。

!table

## 区域填充

!table 设置, 描述

!row 填充X/Y
打包图片之间的像素数。某些纹理滤波会平均相邻像素，因此建议填充为2以避免相邻区域相互影响。

!row 边缘填充
填充还将应用于页面图片的边缘。

!row 重复填充
填充将从最近区域复制像素。如果纹理滤波选择填充像素，这可能会隐藏“接缝”瑕疵。</p><p>去除空白时，重复填充仅应用于有非空白像素的边缘。打包多边形时，重复填充仅应用于覆盖整个图片的区域附件或网格附件使用的图片。

!table

## 页面

!table 设置, 描述

!row 最小宽度/高度
任何页面图片的最小尺寸。

!row 最大宽度/高度
任何页面图片的最大尺寸。如果图片不适合这种大小的页面，则会输出多个页面图片。

!row 2的幂数
使输出页面尺寸为2的幂数。这是一些游戏工具包的要求。

!row 能被4整除
使输出页面尺寸可以被4整除。这是某些纹理压缩算法的要求。

!row 正方形
使宽度和高度相等。这是一些纹理压缩算法(如PVRT)的要求。

!table

## 运行时

这些设置是供加载数据的应用程序在运行时选择性应用的提示。

!table 设置, 描述

!row 过滤器缩小/放大
纹理缩小和放大设置。

!row 换行X/Y
纹理换行设置。

!row 格式
内存中的格式。

!table

## 输出

!table 设置, 描述

!row 格式
输出PNG或JPG页面。

!row JPG质量
JPG输出的压缩。

!row 打包
确定图片的打包方式。
* `网格` 将图片打包成统一的网格(称为精灵表单)。
* `矩形` 使用矩形对图片进行打包。
* `多边形` 使用来自Spine项目的网格外壳尽可能紧密地打包图片。

!row 预乘Alpha
将像素RGB值乘以Alpha值。在运行时渲染图片还必须使用预乘Alpha。建议使用它进行[正确的混合](/forum/viewtopic.php?p=15772)。

!row 溢出
将透明像素的RGB值设置为最接近的非透明像素的RGB值。如果在运行时不使用预乘的alpha，则在为透明像素的RGB值进行采样时有助于防止纹理[过滤伪像](/forum/viewtopic.php?p=13480#p13480)

!row 比例
对于指定的每个比例，都会输出整个图集。

!row 后缀
每个缩放图集的后缀。如果为空，则多个比例的文件将以相同的名称输出到每个比例的子文件夹中。

!row 重采样
用于缩放的算法。

!table

## 选项

!table 设置, 描述

!row 图集扩展
图集数据文件的文件扩展名。

!row 组合子目录
当前文件夹和所有子文件夹被打包到相同页面上。任何包含`pack.json`文件的子文件夹都不会被合并。

!row 展平路径
子文件夹将从区域文件名中剥离。图片文件名应该是唯一的。

!row 索引
图片名称将去掉最后一个下划线之后的所有内容。参见[图片索引](#图片索引)。

!row 旧版输出
以Spine Runtimes 4.0之前的版本可以读取的格式写入图集文件。

!row 调试
在输出页面上绘制线条以显示打包的图片边界。

!row 快速
打包效率不会那么高，但执行速度会快得多。

!row 限制内存
取消选中时，所有图片将同时加载到内存中，以提高打包速度。如果没有足够的内存可用，Spine可能会崩溃。

!row 优质打印
图集文件写上了额外的空白，以便人们更容易阅读。

!row 当前项目
选中后，当前项目中网格图片文件的网格UV将用于去除空白。

打包为数据导出的一部分时，此设置将被忽略，并且当前项目中的网格始终用于去除空白。


!table

## 其他

这些设置在设置对话框中不可用，只能在JSON配置文件中指定。

!table 设置, 描述

!row 忽略
此文件夹及其所有子文件夹中的图片将不会打包。

!row 出血迭代
应用出血的次数。默认为2。

!row 分隔符
向文件名附加数字时使用的字符串。默认为下划线(`_`)。

!table

# 文件夹结构

<callout>当选中[导出数据时打包](#导出数据时打包)和`附件`时，将不使用文件夹结构。</callout>

Spine可以一次性打包应用程序的所有图片。给定一个文件夹后，它会递归扫描图片文件。对于Spine遇到的每个图片文件夹，它都会将图片打包到一个更大的页面图片上。如果文件夹中的图片无法适应单个页面的最大尺寸，则将使用多个页面。

同一文件夹中的图片位于同一组页面上。如果所有图片都可以放在一页上，则不应使用子文件夹，因为将所有图片放在一页上是最有效的。否则，可以使用子文件夹来分隔相关图片，以最大限度地减少纹理绑定。

![](/img/spine-user-guide/texture-packer/folder-structure.png)

例如，一个应用程序可能想要将所有的“游戏”图片放在与“暂停菜单”图片不同的文件夹中，因为这两组图片是连续绘制的：绘制所有游戏图片(一个绑定)，然后在上方绘制暂停菜单(另一个绑定)。如果这些图片位于一个包含多个页面的文件夹中，则每个页面可能包含游戏和暂停菜单图片的混合。这将导致需要多个纹理绑定来渲染游戏和暂停菜单，而不是每个都只有一个纹理绑定。

子文件夹对于使用相关纹理设置对图片进行分组也很有用。运行时内存格式(RGBA、RGB等)和过滤(最近、线性等)等设置是按纹理设置的。需要不同的每个纹理设置的图片需要放在不同的页面上，所以应该放在不同的子文件夹中。

要使用子文件夹进行组织，而不是控制在页面上将哪些图片组合在一起，请参阅`组合子目录`设置。

要避免在图集文件的区域名称中使用子文件夹路径，请参阅`展平路径`设置。

![](/img/spine-user-guide/texture-packer/folder-checkboxes.png)

# JSON配置

<callout>当选择了[导出数据时打包](#导出数据时打包)和`附件`时，将不使用`pack.json`文件。</callout>

每个文件夹可以包含一个`pack.json`文件，以指定该文件夹的设置。每个子文件夹会继承其父文件夹的所有设置。在子文件夹中进行的任何设置都会覆盖父文件夹中的设置。

通过点击`纹理打包器设置`对话框底部的`保存`按钮，可以使用Spine创建一个`pack.json`文件。

![](/img/spine-user-guide/command-line-interface/save-packer-settings.png)

下面是一个包含所有可用设置的JSON示例。在大多数情况下，双引号是可选的。
```
{
stripWhitespaceX: true,
stripWhitespaceY: true,
rotation: true,
alias: true,
ignoreBlankImages: false,
alphaThreshold: 3,
minWidth: 16,
minHeight: 16,
maxWidth: 2048,
maxHeight: 2048,
pot: false,
multipleOfFour: false,
square: false,
outputFormat: png,
jpegQuality: 0.9,
premultiplyAlpha: true,
bleed: false,
bleedIterations: 2,
scale: [ 1 ],
scaleSuffix: [  ],
scaleResampling: [ bicubic ],
paddingX: 2,
paddingY: 2,
edgePadding: true,
duplicatePadding: false,
filterMin: Linear,
filterMag: Linear,
wrapX: ClampToEdge,
wrapY: ClampToEdge,
format: RGBA8888,
atlasExtension: .atlas,
combineSubdirectories: false,
flattenPaths: false,
useIndexes: false,
debug: false,
fast: false,
limitMemory: true,
currentProject: true,
packing: rectangles,
silent: false,
ignore: false
}
```

不需要指定所有设置，可以省略任何或全部设置。例如，要关闭填充和合并子文件夹，可以使用以下JSON：
```
{
paddingX: 0,
paddingY: 0,
combineSubdirectories: false
}
```

要忽略文件夹及其所有子文件夹中的所有图片：
```
{
ignore: true
}
```

## 纹理图集名称

纹理图集名称用于命名图集和PNG文件。例如，如果纹理图集名称是`skeleton`，则图集文件将被命名为`skeleton.atlas`、`skeleton.png`、`skeleton2.png`等。

# Ninepatch

Ninepatch通常不适用于Spine骨架，但可以用于其他目的。

如果图片文件名在文件扩展名前以“.9”结尾，则将其视为Ninepatch。可以手动或使用[此工具](http://developer.android.com/tools/help/draw9patch.html)创建Ninepatch图片。图片必须有1px的透明边框。上边缘和左边缘可以选择有一条连续的黑色像素行，表示分割信息，即Ninepatch的哪一部分将拉伸。下边缘和右边缘可选有一条连续的黑色像素行，表示填充信息，即应该如何插入Ninepatch上方的内容。打包此图片时，1px边框将被去除，分割和填充信息将存储在图集数据文件中。

# 图片索引

图片索引通常不适用于Spine骨架，但可用于其他目的。

如果一个图片文件名以下划线结尾，然后是一个数字(如`Animation_23.png`)，则该数字被视为“索引”，并将该区域存储在图集数据文件中。存储图片名称时不带下划线和索引。这允许检索具有相同名称的图片列表，并按索引排序，以便于逐帧打包动画，而不会丢失帧的顺序。

# 纹理解包器

Spine提供了纹理解包实用程序，该实用程序可获取纹理图集并从其中写出单独的图片。图集中的任何旋转都将被撤消，并会在各个图片中恢复所有已剥离的空白。

![](/img/spine-user-guide/texture-packer/unpacker.png)

<callout>也可以使用[命令行界面](/spine-command-line-interface#解包)进行纹理解包。</callout>

输入 `Atlas` 文件和 `Output folder` 的路径，输出文件夹是存储解压缩图像的文件夹路径。如果图集使用[预乘](#预乘Alpha)法打包，请选中 `Unpremultiply alpha`。如果地图集文件有“[pma:true](/spine-atlas-format)”，则将使用该复选框。

[下一节: 导入](/spine-import)
[上一节: 导出](/spine-export)
[Spine用户指南: 目录]