https://en.wikipedia.org/wiki/Texture_atlas

在计算机图形学中,纹理图集 (texture atlas),在 2D 游戏开发中也称为精灵表 (spritesheet) 或图像精灵 (image sprite),是包含多个较小图像的大图,通常将它们打包在一起以减小整体尺寸。图集可以由大小均匀的图像或尺寸各异的图像组成。渲染时通过 UV 坐标 从图集中挑选出子图像来绘制。

为什么要使用纹理图集

在 GPU 渲染中,切换纹理(texture binding)是一项开销较大的操作。如果每个精灵或 UI 元素都使用独立的纹理,频繁的纹理切换会导致大量的 draw call,严重影响渲染性能。将多个小纹理合并到一张大图上,就可以在一次 draw call 中绘制多个不同的图元,显著减少 GPU 状态切换。

工作原理

纹理图集的使用流程大致如下:

  1. 打包阶段:使用工具(如 TexturePacker、Godot 自带的 AtlasTexture)将多张小图按照特定算法排列到一张大图上,同时生成一份元数据文件,记录每张子图在图集中的 UV 偏移和尺寸
  2. 运行时加载:引擎加载这张大图到 GPU 显存,并解析元数据
  3. 渲染阶段:绘制某个精灵时,根据元数据计算出它在图集中的 UV 区域,只采样该区域的像素

常见问题与注意事项

  • 纹理溢出 (bleeding):相邻子图的像素可能因为线性过滤而相互渗透,通常通过在子图之间留出 1-2 像素的间距 (padding) 来解决
  • 图集尺寸限制:GPU 对纹理尺寸有上限(常见为 4096x4096 或 8192x8192),超大项目可能需要多张图集
  • 动态更新:如果子图需要频繁变更,重新打包图集的开销需要考虑。有些引擎支持运行时动态图集

纹理图集在 2D 游戏、UI 渲染、粒子系统等场景中几乎是标配优化手段。