几行脚本搞定压缩纹理缓存,打包速度快到起飞,Mac OS 10.15 & Windows10 均测试成功

项目最近升级到了 creator 2.2.2 版本, 虽然支持了压缩纹理,但是没有缓存,每次打包都会浪费很多时间
所以就要想个办法把这问题解决了,此解决方案在 Mac OS 下测试开发,windows 参照此思路,应该也是可行的

目前只弄了 etc 格式的缓存,此贴目的只是在官方推出解决方案前提供一个思路

主要思路就是使用 python 脚本,代替引擎内部的 etcpack 工具,原始目录如下图

然后我们使用 Python 脚本替代 etcpack 文件,将原本的 etcpack 改个名字,比如 etcpacktool
修改后如下

打包后生成的缓存文件,根据原图 md5 命名

现在 etcpack 文件已经是我们替换后的 python 脚本, 脚本内容如下

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import sys
import os
import hashlib
import subprocess

cachePath = "/Volumes/WorkSpace/compressedTexturesCache/"

textureTypes = ["etc1","etc2"]
# 创建缓存目录
for textureType in textureTypes:
    if not os.path.exists(cachePath + textureType):
        os.makedirs(cachePath + textureType)

fromPath = sys.argv[1]
targetPath = sys.argv[2]
cacheDir = cachePath + sys.argv[4]
fileDir,fileName = os.path.split(fromPath)

md5 = hashlib.md5(open(fromPath, "rb").read()).hexdigest()
if not os.path.exists(cacheDir + "/" + md5 + ".pkm"):
    print("开始压缩",fileName, md5)
    # 缓存文件不存在, 压缩此图片
    res = subprocess.call(["./etcpacktool", fromPath, cacheDir] + sys.argv[3:])
    if res == 0:
        # 压缩成功, 根据 MD5 重命名
        os.rename(cacheDir + "/" + fileName.split(".")[0] + ".pkm", cacheDir + "/" + md5 + ".pkm")
else:
    print("文件存在")
# 拷贝文件
status = subprocess.call("cp" + " " + cacheDir + "/" + md5 + ".pkm" + " " + targetPath + "/" + fileName.split(".")[0] + ".pkm", shell=True)
if status != 0:
    if status < 0:
        print("Killed by signal", status)
    else:
        print("Command failed with return code - ", status)
else:
    print("拷贝成功")

#windows10 下的解决方案
先上代码,和前面的基本差不多, 主要多了一步,把 python 文件转成 exe
脚本稍微有点区别,不可混用

// 安装 pyinstaller
pip install pyinstaller
// 将 etcpack.py 转成 etcpaack.exe
pyinstaller -F etcpack.py
//会自动生成一个 dist 目录,里面生成了 etcpack.exe
//把原引擎目录下的 etcpack.exe 改名为 etcpacktool.exe ,把生成的 etcpack.exe  拷贝过去
#coding=utf-8

import sys
import os
import hashlib
import subprocess

cachePath = "C:\\Users\\alpha\\Desktop\\compressedTexturesCache\\"

textureTypes = ["etc1","etc2"]
# 创建缓存目录
for textureType in textureTypes:
    if not os.path.exists(cachePath + textureType):
        os.makedirs(cachePath + textureType)

fromPath = sys.argv[1]
targetPath = sys.argv[2]
cacheDir = cachePath + sys.argv[4]
fileDir,fileName = os.path.split(fromPath)

md5 = hashlib.md5(open(fromPath, "rb").read()).hexdigest()
if not os.path.exists(cacheDir + "\\" + md5 + ".pkm"):
    print("开始压缩",fileName, md5)
    # 缓存文件不存在, 压缩此图片
    res = subprocess.call([".\\etcpacktool.exe", fromPath, cacheDir] + sys.argv[3:])
    if res == 0:
        # 压缩成功, 根据 MD5 重命名
        os.rename(cacheDir + "\\" + fileName.split(".")[0] + ".pkm", cacheDir + "\\" + md5 + ".pkm")
else:
    print("文件存在")
# 拷贝文件
status = subprocess.call("copy" + " " + cacheDir + "\\" + md5 + ".pkm" + " " + targetPath + "\\" + fileName.split(".")[0] + ".pkm", shell=True)
if status != 0:
    if status < 0:
        print("Killed by signal", status)
    else:
        print("Command failed with return code - ", status)
else:
    print("拷贝成功")

29赞

厉害了,狸猫换太子可还行,感谢分享
这个问题老早就跟引擎组提了,现在都还没动静,已经困扰我好几个月了,我试试看

1赞

我就是看你好几个地方给引擎组提,今天在家办公,特地实践一下,写给你的,你信吗?

信,感谢大佬;

角度很刁钻,为了改这个的流程我还去翻了他们的命令行脚本,破解源码之类的,看样子我跑偏了,没想到替换压缩工具,加个中间层就可以了

非常感谢~ 我要是个女的,免费给你睡一个月

2赞

一次就好:smiling_imp:

大佬思路清奇,骨骼异于常人,定能飞黄腾达,当上CEO,迎娶白富美,走上人生巅峰

也许大佬是女的

大佬要是女的,我免费陪睡1年,不。。。我随叫随到:sunglasses:

感谢支持~


更新:引擎从 2.4 开始支持压缩纹理缓存了~

论坛里面卧虎藏龙,大神就是叼

大佬思路清奇,骨骼异于常人,定能飞黄腾达,当上CEO,迎娶白富美,走上人生巅峰

给力的优化。

建议不要用多线程,我之前帮引擎组查了一个bug,你看看会不会有这样的问题

subprocess.call 等待子进程结束才继续往下走

get~ 再次感谢大佬

大佬wind64 下报错了额 求解

windows 应该不能拿去直接用,得改, 我弄个虚拟机试下吧

这个文件 压缩的 也没法解压…

大佬 加油

win10 下面的解决方案更新了,亲测可行,你试试

方案亲测有效,全重新压缩和全读缓存的文件对比,特来感谢~