当前位置: 首页 > ds >正文

游戏开发常见数据压缩

  1. 无损压缩

原理:通过消除数据中的冗余信息(如重复模式、统计冗余),实现数据完全还原。
适用场景:需要精确还原的数据(如代码、配置、网络协议)。

  1. 有损压缩

原理:通过丢弃人眼/人耳不敏感的细节信息(高频信号、颜色微小差异),牺牲部分质量以大幅减少数据量。
适用场景:音视频、纹理、动画等非关键精度数据。


常见通用编码

  • 霍夫曼编码(Huffman Coding)

    • 原理:根据符号出现频率构建变长编码表,高频符号用短码,低频符号用长码。

    • 比如压缩:we will we will r u

    在这里插入图片描述

  • 算术编码(Arithmetic Coding)

    • https://zhuanlan.zhihu.com/p/390684936

    • 原理:将整个输入流映射为一个[0,1)区间的小数,通过概率模型动态调整区间。

    • 优势:比霍夫曼编码更接近熵极限。

    • 游戏应用

      • 高压缩率需求场景(如离线资源包)。

图片压缩

DXT1

在这里插入图片描述

ETC1/ETC2

在这里插入图片描述

原理:

  1. 分块:纹理划分为4x4像素块。
  2. 划分子块:尝试水平(4x2)或垂直(2x4)分割,选择误差更小(比如颜色差)的方向(由flip bit标记)。
  3. 基色编码:每个子块存储两个基色(类似平均颜色)(BaseColor1和BaseColor2),格式为RGB444或RGB555。
  4. 调制表选择:每个子块选择一张预定义的4级调制表(如{-8, -2, +2, +8})。
  5. 像素颜色生成:对每个像素,根据基色和调制值计算最终颜色:Color=BaseColorextended+ModValue×ScaleColor=BaseColorextended+ModValue×Scale
  • 示例:
    • 基色为RGB444(12, 3, 8) → 扩展到RGB888(12×17, 3×17, 8×17) = (204, 51, 136)。
    • 调制值为+8 → 最终颜色为(204+8, 51+8, 136+8) = (212, 59, 144)。
      在这里插入图片描述

ASTC

在这里插入图片描述

  • 分块里面还分区域,区域中可以根据颜色差异动态调整,比如颜色相近的要的数据少。

  • 目前游戏主要用这种。

PVRTC

在这里插入图片描述

  • 主要用于iOS,压缩率比ASTC好一点,但表现上ASTC更好。

  • 高频低频(颜色变化剧烈程度)区分不同格式,再插值混合。


音频

  • 人耳听不到的过滤之类的。哈夫曼编码。

模型

  • 将法线向量编码为八面体映射(2个值代替3个)

在这里插入图片描述

  • 网格简化LOD,顶点合并。
    在这里插入图片描述

  • 网格合并,比如场景模型很多细节多个对象,合并成一个大的网格。

  • 动画的关键帧量化,用插值代替。

  • 动画数据浮动值限制,比如去掉小数点后4位。


数据协议

  • 常用数据格式:json、bson、msgpack

  • Protobuf:字段key用数字ID代替

  • MessagePack、BSON:用二进制json格式代替。


资源包

  • LZ77、LZ4、LZMA

  • 通过滑动窗口哈希表加速查找重复字符串,用长度-距离对(Length-Distance Pair)替代重复内容。

在这里插入图片描述

  • unity打AB包支持这两格式,目前用的LZ4。

其他

  • 网络同步:仅发送变化的数据,如玩家位置同步(+5, -1, 0),而不是完整坐标。

  • 代码编译:去掉注释,变量名简化。

  • 降低数据精度:浮点数坐标转为16位整数。

  • 配置表:

    • 转表lua时,用元表,把重复项用短ID替换。

    • 翻译表:繁体台湾有时一样,只保留一个,代码查找不到查另外一个。

  • 流式加载的数据:差分压缩,如前面玩家坐标同步,只记录和前一个或某个标准值的差值,省去记录完整值得占用空间。

  • 将长文件路径字符串,计算成短hash替换。

  • 数字+大小字母实现(10+26*2)进制组合。

http://www.xdnf.cn/news/10972.html

相关文章:

  • [蓝桥杯]上三角方阵
  • Termux下如何使用MATLAB
  • Kdump 介绍与使用方式
  • PyTorch 入门学习笔记(数字识别实战)
  • SoloSpeech - 高质量语音处理模型,一键提取指定说话人音频并提升提取音频清晰度和质量 本地一键整合包下载
  • java-springboot文件上传校验之只允许上传excel文件,且检查不能是脚本或者有害文件或可行性文件
  • 【氮化镓】钝化层对p-GaN HEMT阈值电压的影响
  • DrissionPage 异常处理实战指南:构建稳健的网页自动化防线
  • 第二章 2.TCP IP Protocol Suite(CCNA)
  • Flask 应用的生产环境部署指南
  • Java基础 Day28 完结篇
  • Python Day42
  • 定时通知群内值班人功能
  • POJO,DTO,VO和Model
  • 深入解读 MCP(Model Context Protocol):大模型时代的“操作系统协议”
  • js-day7
  • 快速了解GO+ElasticSearch
  • Impromptu VLA:用于驾驶视觉-语言-动作模型的开放权重和开放数据
  • Mac 芯片系列 安装cocoapod 教程
  • 机器学习——SVM
  • 前端基础之《Vue(18)—路由知识点》
  • 【操作系统原理08】文件管理
  • git管理github上的repository
  • 深入解析ReactJS中JSX的底层工作原理
  • OpenCV CUDA模块特征检测------角点检测的接口createMinEigenValCorner()
  • React 项目初始化与搭建指南
  • 算法/机理模型演示平台搭建(二)——算法接口部署(FastApi)
  • 算法训练第七天
  • Web后端快速入门(Maven)
  • TDengine 的 AI 应用实战——运维异常检测