Unity - 通過降低精度減少動畫文件的大小


Animation是Unity中的動畫文件,主要內容由一個個關鍵幀數據構成。通過將Unity的資源序列化方式調整為Text,就可以以文本方式查看動畫文件。
通過菜單項Edit -> Project Settings -> Editor打開Editor Settings窗口,就可以設置資源序列化方式:

下圖展示了我對一個Cube制作的動畫,動畫中包含了若干個關鍵幀,調整了Cube的坐標位置和旋轉方向:

以文本方式打開動畫文件,部分內容如下:

動畫文件的序列化格式不在我們的討論范圍內,本文我們主要討論的是通過降低精度來減少動畫文件的大小。通過查看動畫文件,我們發現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')

通過降低精度調整后,動畫文件如下:

通過降低精度的調整,我們將大小為19.2KB的動畫文件降低到了18.3KB。看上去很微不足道,這是因為這個動畫文件僅僅包含了13幀動畫數據,對於真實項目中成百上千幀的動畫文件,節省量是很客觀的。以133秒的動畫文件為例,大小從8MB降低到了3MB。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM