Unity - 通过降低精度减少动画文件的大小

时间:2022-09-07 16:07:14

Animation是Unity中的动画文件,主要内容由一个个关键帧数据构成。通过将Unity的资源序列化方式调整为Text,就可以以文本方式查看动画文件。
通过菜单项Edit -> Project Settings -> Editor打开Editor Settings窗口,就可以设置资源序列化方式:

Unity - 通过降低精度减少动画文件的大小

下图展示了我对一个Cube制作的动画,动画中包含了若干个关键帧,调整了Cube的坐标位置和旋转方向:

Unity - 通过降低精度减少动画文件的大小

以文本方式打开动画文件,部分内容如下:

Unity - 通过降低精度减少动画文件的大小

动画文件的序列化格式不在我们的讨论范围内,本文我们主要讨论的是通过降低精度来减少动画文件的大小。通过查看动画文件,我们发现Unity在序列化动画文件时使用的浮点精度比较高,可以到小数点后面很多位。因此,通过降低精度我们就可以减少动画文件的大小。
这里我们使用python脚本来实现该功能,处理的逻辑如下:
1. 读取动画文件中的每一行
2. 对于读取到的每一行,去除行尾的换行符
3. 使用"空格"作为分隔符,分隔行内容
4. 对于分隔后的每一个内容,使用正则表达式查询是否包含浮点数据
5. 如果包含浮点数据,则使用四舍五入法保留小数点3位。如果不包含浮点数据,则直接写入到输出文件

下面是python代码,可以根据需要自行调整:

import re

animFile = open("Move.anim")
outputFile = open("NewMove.anim", "w", newline='\n')
for l in animFile.readlines(): # 读取文件中的每一行
line = l.rstrip() # 对于读取到的每一行,去除行尾的换行符 words = line.split(' ') # 使用"空格"作为分隔符,分隔行内容
for word in words:
match = re.match("-?\d+\.\d+", word) # 对于分隔后的每一个内容,使用正则表达式查询是否包含浮点数据 # 如果包含浮点数据,则使用四舍五入法保留小数点3位。如果不包含浮点数据,则直接写入到输出文件
if match:
value = match.group(0)
floatValue = float(value)
outputFile.write(word.replace(value, str(round(floatValue, 3))))
else:
outputFile.write(word) if word != words[-1]:
outputFile.write(' ') outputFile.write('\n')

通过降低精度调整后,动画文件如下:

Unity - 通过降低精度减少动画文件的大小

通过降低精度的调整,我们将大小为19.2KB的动画文件降低到了18.3KB。看上去很微不足道,这是因为这个动画文件仅仅包含了13帧动画数据,对于真实项目中成百上千帧的动画文件,节省量是很客观的。以133秒的动画文件为例,大小从8MB降低到了3MB。

Unity - 通过降低精度减少动画文件的大小Unity - 通过降低精度减少动画文件的大小

Unity - 通过降低精度减少动画文件的大小的更多相关文章

  1. unity从模型中抽取动画文件(animation)

    http://www.cnblogs.com/leng-yuye/archive/2013/01/11/2856144.html 由于模型是由第三方的软件制作的,用unity不能直接编辑模型里的动画文 ...

  2. 测试Animation大型动画文件拆分播放的可行性

    最近遇到一个问题,剧情动画文件大了复杂了之后,每次修改输出很麻烦,导出fbx就需要20分钟. 所以我想到了一个比较好的解决方法,在unity这边解决.把动画文件拆分成若干份,然后赋予不同的层并行播放 ...

  3. Unity游戏开发——自动为动画剪辑添加事件 之 最后几帧的事件不能被调用的问题

    最近在做一个根据配置表自动生成动画剪辑clip以及controller的功能.做法是根据配置表配置的动作以及每个动作的关键帧,自动为每个clip添加事件.这样做可以把动画的事件处理在游戏运行之前就计算 ...

  4. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  5. 在Unity中使用LitJson解析json文件

    LitJson 这个库需要找资源,找到LitJson.dll后将它放在Assets文件夹下,在脚本中使用using引入即可 测试代码 json文件: {"Archice":[{&q ...

  6. 【转】unity Animator 怎么判断一个动画播放结束

    关于unity Animator 怎么判断一个动画播放结束这里有几种方法.希望对大家有帮助.还有其他办法的可以分享一下 第一种方法:在动画结束帧后面加个动画事件,调用下含这个变量的函数接口不是可以了? ...

  7. lucene倒排索引瘦身的一些实验——merge的本质是减少cfx文件 变为pos和doc;存储term vector多了tvx和tvd文件有337M

    store NO 压缩后的原始数据 原始数据大小 索引大小 索引时间 单词搜索时间 266 791 594 176 0.2 文件组成见后 运行forceMerge(3)后 merge的本质是减少cfx ...

  8. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

  9. 置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存,会使数值非常不准确。

    使用iozone测试磁盘性能   IOzone是一个文件系统测试基准工具.可以测试不同的操作系统中文件系统的读写性能.可以通过 write, re-write, read, re-read, rand ...

随机推荐

  1. 增强学习(二)----- 马尔可夫决策过程MDP

    1. 马尔可夫模型的几类子模型 大家应该还记得马尔科夫链(Markov Chain),了解机器学习的也都知道隐马尔可夫模型(Hidden Markov Model,HMM).它们具有的一个共同性质就是 ...

  2. Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile

    GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...

  3. Rule of write code with C&num; in Unity3d

    Good Practice 普通的Public变量可以在inspect里显示,变量是可以在inspect里赋值并realtime反映在被attach到的GameObject上的.注意经典public ...

  4. X光机的原理及构造

    一.X射线的发现 1895年德国物理学家伦琴(W.C.RÖntgen)在研究阴极射线管中气体放电现象时,用年伦琴荣获物理学第一个诺贝尔奖金.科学总是在不断发展的,经伦琴及各国科学家的反复实践和研究,逐 ...

  5. Git学习笔记总结和注意事项

    一.Git简单介绍 Git是眼下世界上最先进的分布式版本号控制系统.其特点简单来说就是:高端大气上档次! 二.Windows上Git安装 最早Git是在Linux上开发的.非常长一段时间内.Git也仅 ...

  6. docker技术之安装

    由于工作原因需要使用docker完成集群的搭建,特此记录一下研究的docker技术. 首先简单的介绍一下docker: Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 L ...

  7. MarkDown常用语法表

    MarkDown常用语法表 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Title - 标题 2 H ...

  8. 穷竭搜索: POJ 2718 Smallest Difference

    题目:http://poj.org/problem?id=2718 题意: 就是输入N组数据,一组数据为,类似 [1  4  5  6  8  9]这样在0~9之间升序输入的数据,然后从这些数据中切一 ...

  9. NumPy库入门

    ndarray数组的元素类型 ndarray数组的创建 ndarray数组的操作 ndarray数组的运算

  10. appium 几点总结&lpar;转&rpar;

    1. 建立session时常用命令: DesiredCapabilities cap = new DesiredCapabilities(); cap.SetCapability("brow ...