Unity中使用OpenCTM

OpenCTM文件格式是用于存储3D三角形网格的开放格式。与其他类似的文件格式相比,它的主要优势在于它的无损性。将三角形几何压缩为相应原始数据大小的一小部分。它主要是为C/C++用户编写的,对于其他编程语言也是如此,因为概念和函数调用几乎完全相同,不考虑编程语言。

OpenCTM Mesh包括顶点索引、顶点坐标、UV坐标、法线坐标等。

OpenCTM文件格式支持几种不同的压缩方法,每种方法有自己的优点和缺点。API可以选择创建OpenCTM文件时使用的方法(默认方法是MG1)。

1、Raw

Raw压缩方法并不是真正的压缩方法,因为它只是一种压缩方法以未压缩的原始形式存储数据。结果是一个大小相同的文件并将数据格式作为内存网格数据结构。

2、MG1

MG1压缩方法有效地减小了网格数据的大小将网格的连通性信息重新编码为易于压缩的格式。然后使用LZMA对数据进行压缩。浮点数据,如顶点坐标和法线,被完全保存在MG1方法中,只需对其应用无损LZMA压缩。

在典型条件下,连通性信息被压缩为约每个三角形两个字节(原始大小的17%),顶点数据被压缩为大约是原来尺寸的75%。虽然创建MG1文件可能是一个相对较慢的过程(与原始文件相比)。

3、MG2

MG2压缩方法提供了其中最高级别的压缩不同的OpenCTM方法。它使用相同的压缩方法连接信息作为MG1方法,但在压缩方面做得更好。顶点数据被转换成一个定点表示法,这使得效率更高,基于无损、预测的数据压缩算法。总之,MG2方法将网格划分为小的子空间,对数据进行排序并对数据进行三角预测,有效地降低了误差熵的数据。然后用LZMA对重新编码的顶点数据进行压缩。

 

在Github上下载的C#版本的OpenCTM插件有些问题,自己做了一部分更新。

1、其在解析多个OpenCTM网格时,生成了大量的GC,并且当解析的网格越大时,其产生的GC越多。这就导致了系统需要用更多的时间来进行垃圾回收,造成非常长的卡顿时间,简直无法忍受。改进后的代码,产生的GC明显减少,加载速度提高了一倍。

原插件,产生大量的GC

                                                                             原插件解析时生成大量GC

 

2、由于Unity中的Mesh不支持大于65000个顶点,否则Mesh将不会加载和显示出来。以前的OpenCTM 插件也没有考虑这个问题,后来在项目中发现了这个Bug,自己写了一个分割Mesh的算法,当顶点小于65000时不做处理,而当顶点大于65000时,则将一个Mesh分割成每个都大于65000个顶点的多个Mesh,并进行分别加载。

分割Mesh

                                                                               分割Mesh的算法

最后贴上GitHub上的项目地址(https://github.com/BarryWangYang/OpenCTM-Optimizing-GC-),希望和大家多多交流,

欢迎加本人QQ:1909546349,一起讨论!

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值