1.纹理压缩
1.纹理压缩
a.硬盘中: 存储压缩后的纹理文件(如.unity3d里的ETC2纹理)
- 状态: 压缩态(ETC2/ASTC格式), 文件体积小
- 目的: 减少硬盘存储和加载时的IO带宽
b.加载到内存(RAM): 依然是压缩态, 未解压
- 状态: 压缩态(和硬盘中格式一致)
- 关键: Unity通过DMA加载时, 直接把硬盘的压缩数据拷贝到内存, CPU不做任何解压, 内存占用 = 压缩后的大小
- 对比: 如果是未压缩纹理(RGBA32), 内存占用 = 4MB, 压缩后内存占用直接减少87.5%
c.上传到显存(VRAM): 还是压缩态, 未解压
- 状态: 压缩态(和内存中格式一致)
- 关键: CPU通过PCIe总线把内存中的压缩数据拷贝到显存, 依然不解压, 显存占用 = 压缩后的大小(0.5MB)
"减少拷贝压力": 指拷贝0.5MB压缩数据, 比拷贝4MB未压缩数据, 占用的PCIe总线带宽减少87.5%, 传输更快、更省资源
d.GPU渲染时: 实时局部解压, 不落地
- 状态: 仅在GPU的"纹理采样器"中临时解压"当前需要的像素块"
- 核心逻辑: 游戏渲染时, GPU只需要读取纹理中"当前帧要显示的部分"(比如屏幕上能看到的角色纹理区域), GPU的专用硬
件(纹理采样器)会把显存中"压缩的像素块"(比如: ETC2的4×4 块)实时解压成原始像素, 供顶点着色器/像素着色器使用
解压后的像素只在GPU的计算单元中临时存在, 渲染完成后立即丢弃, 不会存储到显存中 —— 显存里始终只保留压缩后的纹理
数据, 不会因为解压而增大占用