尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Draco 压缩的 Unity 集成指南:把一个 4.7 MB 网格压到约 94 KiB

Draco 压缩的 Unity 集成指南:把一个 4.7 MB 网格压到约 94 KiB Draco 压缩的 Unity 集成指南把一个 4.7 MB 网格压到约 94 KiB【免费下载链接】dracoDraco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.项目地址: https://gitcode.com/gh_mirrors/draco1/draco一个 4.7 MB 的 OBJ 网格进游戏包前往往只剩几百 KiB 的预算加载阶段多出来的每一百毫秒都直接拉长玩家的开局等待。Draco 压缩是 Google 开源的 3D 几何压缩库能显著缩小网格与点云文件仓库unity/Plugin/下附带各平台预编译插件可在 Unity 中解码还原。本文走一遍在 Unity 项目里集成 Draco 压缩的完整路径。Draco 压缩的原理量化加拓扑编码Draco 压缩不是对原始字节做通用有损压缩而是按几何结构重新编码。它先取包围盒把每个顶点坐标量化成盒内的小整数取代原本的 32 位浮点再记录三角形如何通过顶点索引相连的拓扑信息用边破edgebreaker这类拓扑编码器存储而不是一长串索引数组最后在这些整数上再做熵编码。结果就是每个顶点从几十到几百字节降到几字节。一个类比是画城市地图与其给每栋楼都写满 40 位经纬度不如先框定城市边界再给每栋楼一个网格上的小整数编号与其列出所有街道连接不如记下每条路在哪个路口转弯。解码器就能用这张小网格加转弯信息还原整张地图。网格划得越细量化位数越高还原越接近原模型文件也越大。Draco 压缩因此是有损的量化会丢弃亚网格精度解码出的顶点与源模型不逐位相同。调整量化位数就是在体积和还原精度之间取舍。在 Unity 中落地 Draco 插件的三步阶段一压缩源模型得到 .drc 文件克隆仓库各平台预编译插件包都在 unity/Plugin/git clone https://gitcode.com/gh_mirrors/draco1/draco用命令行工具把源模型压成 .drc。各参数与默认值见 src/draco/tools/draco_encoder.cc默认-qp 11 -qt 10 -qn 8 -cl 7这里对 testdata/bunny_norm.obj 用 14 位位置量化、压缩等级 7./draco_encoder -i testdata/bunny_norm.obj -o bunny.drc -qp 14 -cl 7交付物一个体积远小于源 OBJ 的bunny.drc。阶段二导入预编译插件库并配置工程新建一个 Unity 3D 工程。解压对应平台的插件包把动态库放进Assets/Plugins/对应目录。各平台产物不同Windows 得dracodec_unity.dllmacOS 得dracodec_unity.bundleAndroid 得libdracodec_unity.soiOS 为静态库。例如 Windows 平台tar xjf unity/Plugin/libdracodec_unity_windows.tar.bz把两个核心脚本拷进Assets/unity/DracoMeshLoader.cs解码与 unity/DracoDecodingObject.cs加载示例。把bunny.drc改名成bunny.drc.bytes放进Assets/Resources/。Unity 只按已知扩展名导入文件.drc会被忽略加.bytes才会作为二进制资产读入运行时仍用原名bunny.drc加载。在 Player Settings 勾选 Allow unsafe code因为 DracoMeshLoader 使用了指针。交付物工程编译通过插件按当前平台就位。阶段三挂脚本解码并渲染网格创建一个空 GameObject把DracoDecodingObject.cs拖上去。给该对象添加MeshFilter和MeshRenderer组件。脚本里调用解码接口LoadMeshFromAsset从 Resources 读入压缩数据并还原成 Unity Mesh返回值是面数。void Start() { ListMesh mesh new ListMesh(); var loader new DracoMeshLoader(); int n loader.LoadMeshFromAsset(bunny.drc, ref mesh); if (n 0) GetComponentMeshFilter().mesh mesh[0]; }点 Play。交付物场景里出现解码还原的网格。用数据对比 Draco 压缩效果对比分两块文件体积可直接量解码耗时需自测。文件体积。仓库自带这对文件直接ls -l实测文件大小测试条件testdata/bunny_norm.obj4.71 MB4,930,097 B源模型未压缩javascript/example/models/bunny.drc93.8 KiB96,018 B仓库自带 Draco 压缩样例两者之比约 51 倍。该比值是这对特定文件的实测值会随模型复杂度与量化参数变化不能当作通用承诺。解码耗时。DracoMeshLoader.cs在解码各阶段用Debug.Log打印decodeTimeMilli、copyDecodedDataTimeMilli、convertTimeMilli。实际项目中在目标平台跑同一模型从 Console 记录这三个值再跨格式对比即可耗时随 CPU 变化不宜引用某个固定毫秒数。Draco 压缩的坑与边界⚠️ 以下是落地时容易踩的点。量化有损解码顶点与源不逐位一致。若需要逐位精确坐标CAD 级精度、碰撞精确匹配Draco 压缩不适用。插件按平台分发漏放或放错平台的库DllImport会直接报错而非静默失败预编译包只测过 unity/README.md 列出的环境。必须开 Allow unsafe code脚本用了UnsafeUtility未开启时 Unity 编译失败纯托管、禁 unsafe 的管线用不了这套脚本。不减少面数与 DrawCallDraco 只压存储和传输体积不合并批次。若包体瓶颈是纹理或材质而非几何压缩几何收益有限。运行时解码是同步 P/Invoke大批量模型在主线程解码会卡顿需移出主线程或做缓存。适用场景适合几何体量大、需要控制包体与下载体积、且能接受量化级视觉近似的运行时加载与资源分发场景。【免费下载链接】dracoDraco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.项目地址: https://gitcode.com/gh_mirrors/draco1/draco创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表