陈巧倩

Unity 使用 TexturePacker 优化渲染

· 241 words · 2 minutes to read
Categories: Unity
Tags: TexturePacker

TexturePacker 是一款用于游戏和应用程序开发的软件工具,用于创建和管理图片精灵表。精灵表是包含多个较小图形或精灵的单个图像文件。

TexturePacker优势 🔗

性能方面: 🔗

通过优化Sprite网格提高性能,打包算法Polygon中使用Tracer Tolerance影响网格的质量,从而降低顶点数量和面数,降低CPU和GPU的计算渲染压力。 SpriteMeshes

内存方面: 🔗

Sprite打包通过Polygon Packing算法,是不规则的图片打包成紧凑的图集,从而降低纹理内存大小。 PolygonAtlas

PNG优化: 🔗

PNG优化的意义在于在不影响图形品质的情况下实现降低文件大小,从而改善游戏的下载和启动时间。 常用的PNG文件优化方法:

  • 无损压缩:此方法使用高级压缩算法并从文件中删除不必要的元数据以减小其大小而不降低图像质量。
  • 有损压缩:此方法涉及减少图像中的颜色数量。如果图像具有大量相似的颜色,这会特别有效。通过减少颜色数量,PNG 文件可以作为索引文件写入,占用的空间明显减少。 TexturePacker 中对PNG的优化:
  • TextureFormat:PNG-32 和 PNG-8(索引)。PNG-32 (无损模式)提供更高的质量,但尺寸也更大,而 PNG-8(降低颜色数量)提供更小的文件尺寸,但可能会牺牲一些图像质量。
  • Dithering (PNG-8 only):此设置确定在减少图像中的颜色数量时如何近似颜色。选项有PngQuantLow、PngQuantMedium和PngQuantHigh,它们代表不同级别的颜色准确度。PngQuantLow 生成最小的文件大小,但可能会导致可见的颜色伪影,而 PngQuantHigh 提供最佳的颜色精度,但可能会导致较大的文件大小。
  • PngOptLevel:此设置控制应用于 PNG 文件的优化级别。选项范围从 0(无优化)到 7(最大优化),级别越高,压缩效果越好。 TexturePacker和TinyPNG 的比较:
  • 使用PngQuantHigh和PngOptLevel4时,TexturePacker 和 TinyPNG 都提供相似的图像质量和大小。
  • 使用PngQuantLow和PngQuantMedium时,TexturePacker 通常会生成质量稍差的较小图像。

TexturePacker在Unity中使用 🔗

插件导入 🔗

  • Unity 资产商店下载 TexturePacker Importer。
  • Unity 2021以后版本需要从PackageManger中导入。

资源导入 🔗

需要将导出后的 .tpsheet 文件与 .png 文件同时放入工程中使用。

程序调用 🔗

在Resource中的调用

Sprite[] sprites = Resources.LoadAll<Sprite>("spritesheet");
...

在AssetBundle中的调用

AssetBundle bundle = AssetBundle.LoadFromFile("Assets/AssetBundles/MyBundle");
if (bundle != null)
{
    Sprite[] sprites = bundle.LoadAssetWithSubAssets<Sprite>("spritesheet");
    ...
}

TexturePacker参数详解 🔗

OutPut 🔗

  • Png Opt Level(Png优化选项):减少png文件大小,所有优化都是无损的。
    • 0 总是写 32 位 png 文件
    • 1 如果可能,写入索引(8 位)png 文件(默认)
    • 2……7 激活额外的文件大小优化步骤
  • Premultiplied Alpha:带透明度图片纹理可以正常的进行线性插值
  • DPI(Dots Per Inch):每英寸打印的像素点,值越大图片越清晰,默认27
  • Dithering:抖动算法,用于对减色格式提高画质指令(RGBA8888之外)
    • NearestNeighbour 颜色误差最小,但颜色分布导致的对比度低于线性。
    • Linear 创建具有一些颜色误差但比 NearestNeighbour 更好的对比度的线性颜色分布。
    • FloydSteinberg 使用 Floyd-Steinberg 抖动算法。
    • FloydSteinbergAlpha 使用具有 alpha 值的 Floyd-Steinberg 抖动算法。
    • Atkinson 使用阿特金森抖动算法。
    • AtkinsonAlpha 使用具有 alpha 值的阿特金森抖动算法。
    • PngQuantLow 仅限 PNG-8:最小抖动。
    • PngQuantMedium 仅限 PNG-8:中等抖动。
    • PngQuantHigh 仅限 PNG-8:强烈抖动。

Geometry 🔗

  • Size constraints:纹理强制限制
    • POT 强制纹理具有 2 的幂大小(2、4、8、16、32、64、128、256 …)。
    • WordAligned 字对齐纹理确保纹理中的每一行都使用完整的内存字。
    • AnySize 允许纹理具有任何大小。TexturePacker 尝试找到最小尺寸。
    • Force squared:强制纹理平方大小
  • Scale:纹理缩放比
  • ScaleMode:缩放模式
    • Smooth 通过混合像素进行缩放 - 最适合缩小。放大时留下模糊的结果。
    • Fast 最近邻缩放 - 可以缩小。放大时提供像素化图像。
    • Scale2x 固定尺寸放大 2 倍。尝试优化像素边缘。
    • Scale3x 固定尺寸放大 3 倍。尝试优化像素边缘。
    • Scale4x 固定尺寸放大 4 倍。尝试优化像素边缘。
    • Eagle 固定尺寸放大 2 倍。尝试优化像素边缘。
    • Hq2x 固定尺寸放大 2 倍。尝试优化像素边缘。

Layout 🔗

  • Algorithm:打包算法
    • Polygon 非矩形精灵的最佳打包算法。尝试为多边形精灵轮廓找到紧凑的包装。由于 sprite 边界框可能会重叠,因此只能在您的框架支持导入网格顶点时使用此打包算法。
    • MaxRects 目前最好的矩形打包算法。尝试通过在放置精灵时应用不同的启发式方法来使用最少的纹理空间。
    • Basic 通过从左到右填充精灵直到达到纹理的最大宽度来进行简单布局。适用于固定大小的精灵。
  • Sort By:图片在列表中排序
  • Order:排序规则
    • Ascending 将值从小到大排序
    • Descending 将值从大到小排序
  • Multipack:创建多个导出文件
  • Trim mode:透明像素处理
    • 没有任何 None 保持精灵原样。不要删除透明像素。
    • 修剪 Trim 移除精灵周围的透明度。精灵在使用时似乎具有其原始大小。此选项可能并非在所有框架中都可用。
    • 裁剪,保持位置 CropKeepPos 移除精灵周围的透明度。精灵在使用时看起来尺寸较小。存储原始精灵中的位置。此选项可能并非在所有框架中都可用。
    • 裁剪,丢失位置 Crop 移除精灵周围的透明度。精灵在使用时看起来尺寸较小。原始精灵中的位置设置为 0/0。精灵出现在工作表中,就好像它从来没有任何透明度一样。
    • 多边形 Polygon 使用多边形路径近似精灵的轮廓。使用这种修剪模式,多边形打包器可以比任何基于矩形的打包算法更紧密地打包精灵。基于多边形轮廓可以导出三角形网格,您的框架可以使用它来显着减少需要处理的透明像素的数量。
  • Tracer Tolerance:仅Polygon可用,确定多边形Sprite轮廓的精确度,值越小多边形密度越高。
  • Enable Rotation:是否允许纹理旋转
  • Border padding:纹理之间空间

官方推荐设置 🔗

  • 无损压缩
    • TextureFormat PNG-32
    • PngOptLevel 2
  • 有损压缩
    • TextureFormat PNG-8
    • Dithering PngQuantHigh
    • PngOptLevel 1 or 4

结论 🔗

搬砖愉快!