大佬。。。
昨天想了一下,同一张图如果项目同时存在 RGB 和 RGBA 这两种压缩选择,缓存会有点问题, 不过我暂时没想到项目会不会有这种使用场景
这种应该很少人会这么用吧,一般JPG就用RGB,PNG就用RGBA
老哥们 2.2 的版本 etc2 纹理有出现丢失现象嘛
我没在项目中使用,不清楚, 你给脚本多加点日志,看看,是不是哪里出错了,或者看看丢失的纹理原图的 MD5,是不是在缓存文件夹生成了 ,手动调用 etcpack 看看能不能转成功
文件 是生成的就是无法显示…只有 部分图片是这样
如果不用缓存会有这个问题吗?Mali_Texture_Compression_Tool 你下载官方工具,里面有查看工具,看看不显示的纹理能正常打开吗
大神有没有试过这种方案:
在项目中仍旧用的png,打包后再用工具etcpack将png转为压缩纹理pkm。
如果直接用pkm覆盖png运行是会报错,说找不到png图片。
如果修改pkm的后缀为png,再覆盖原png,可以运行,但是解析的图片有问题。我新建一个helloworld,运行后是这样的:
请问知道是什么问题吗?
你看的帖子,不适合 2.2.2 或更高的版本,看我前面发的图,那个 json 文件, 用 “|” 分隔后,第一个数字 0 就是 png,6@1026 就是 pkm,你如果要自己搞,就要最后把那个 json 文件修改一下,比较麻烦
好的,明白了,谢谢
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
import hashlib
import subprocess
import gzip
def doGZip(fileSrc,fileOutPut):
f_in = open(fileSrc, 'rb')
f_in_content = f_in.read()
f_in.close()
f_out = gzip.open(fileOutPut, "wb")
f_out.write(f_in_content)
f_out.close()
cachePath = "/Volumes/Data/work/compressedTexturesCache/"
# textureTypes = ["etc1","etc2"]
# # 创建缓存目录
# for textureType in textureTypes:
# if not os.path.exists(cachePath + textureType):
# os.makedirs(cachePath + textureType)
# if not os.path.exists(cachePath + textureType + "/gzip/"):
# os.makedirs(cachePath + textureType + "/gzip/")
fromPath = sys.argv[1]
targetPath = sys.argv[2]
cacheDir = cachePath + sys.argv[4] + "/" + sys.argv[6]
cacheDirGzip = cacheDir + "/gzip/"
if not os.path.exists(cacheDir):
os.makedirs(cacheDir)
if not os.path.exists(cacheDirGzip):
os.makedirs(cacheDirGzip)
fileDir,fileName = os.path.split(fromPath)
baseName=fileName.split(".")[0]
md5 = hashlib.md5(open(fromPath, "rb").read() + fromPath).hexdigest()
pkmUrl=cacheDir + "/" + md5 + ".pkm"
pkmGzipUrl=cacheDirGzip + "/" + md5 + ".pkm"
if not os.path.exists(pkmUrl):
print("开始压缩",fileName, md5)
# 缓存文件不存在, 压缩此图片
res = subprocess.call(["./etcpacktool", fromPath, cacheDir] + sys.argv[3:])
if res == 0:
# 压缩成功, 根据 MD5 重命名
os.rename(cacheDir + "/" + baseName + ".pkm", pkmUrl)
else:
print("文件存在")
# gzip压缩
if not os.path.exists(pkmGzipUrl):
print("开始gzip压缩")
doGZip(pkmUrl,pkmGzipUrl)
# 拷贝文件
status = subprocess.call("cp" + " " + pkmGzipUrl + " " + targetPath + "/" + baseName + ".pkm", shell=True)
if status != 0:
if status < 0:
print("Killed by signal", status)
else:
print("Command failed with return code - ", status)
else:
print("拷贝成功")
分享一个修改过后的脚本,增加功能:
1.添加GZip压缩
2.额外区别压缩模式
3.额外区别资源路径
mark…
这个是替换引擎内置压缩纹理工具的,建议看一下,我前面的教程
老哥 有没有demo提供一个~
老哥 用了win10的那个方案 还是报那个错呀
老哥,有办法在打包中,使用多线程调用etcpack进行纹理压缩吗
我觉得能,只要这个脚本接到任务后,直接返回成功, 然后自己创建一个线程去压缩纹理, 引擎应该就会触发下一个图片的压缩操作,这样应该就能实现多线程了,就是管理起来要麻烦些, 不过理论上应该可以实现
我这边,尝试去使用,碰见了两个问题,第一:etcpack每次进行纹理压缩,会生成一个临时文件,如果,尝试使用多线程去转换,会导致,转出来的pkm文件缺少。第二:cocos传递参数过去的时候是一个一个传递的,等上一个图片转换完毕,才会传第二个图片,主要是cocos传递完之后,会去对应的目录下寻找转换后的pkm文件,如果没找到,会报某个js错误,问题是那个js是打在 app.asar文件里,我尝试进行反编译,发现是被加密的,导致也无法修改js,所以目前这个优化卡着了