【技术分享之三】cocos实现对ETC2的支持

大老牛逼

可以全部用etc2了,可以放心使用,这个方案 总体没大碍,只是没有实现etc2的软解码,我花了点时间撸了一个,稳定运行,etc2 的包体会大幅减小,各种好处,如果不支持etc2,那就软解即可,没啥问题, 需要etc2软解的,email 我即可
494294315@qq.com

模拟器啥的,完全OK
对了,三星的机器对etc2支持不是很完美友好,不过只是很少很少的图片,只要对CCSprite 纹理创建失败的地方做一个容错,给一个透明图即可,稳定运行的 OK啦

3赞

mark一下

ect2打包图片后还是包体有点大 这个该怎么解决一下拿

gzip

为什么2.3.3还是没看见PVRTC2

我贴一下关键函数

bool Image::initWithETC2Data(const unsigned char * data, ssize_t dataLen)
{
const unsigned char* header = data;

//check the data
if (!etc2_pkm_is_valid(header))
{
return  false;
}

_width = etc2_pkm_get_width(header);
_height = etc2_pkm_get_height(header);

if (0 == _width || 0 == _height)
{
return false;
}

uint32_t format = etc2_pkm_get_format(header);
if (format == ETC2_RGB_NO_MIPMAPS)
_renderFormat = Texture2D::PixelFormat::ETC2_RGB;
else
_renderFormat = Texture2D::PixelFormat::ETC2_RGBA;
_hasPremultipliedAlpha = false;

if (Configuration::getInstance()->supportsETC2())
{
_dataLen = dataLen - ETC2_PKM_HEADER_SIZE;
_data = static_cast<unsigned char*>(malloc(_dataLen * sizeof(unsigned char)));
memcpy(_data, static_cast<const unsigned char*>(data)+ETC2_PKM_HEADER_SIZE, _dataLen);
return true;
}
else {

CCLOG("cocos2d: Hardware ETC2 decoder not support,use software decoder");
etc2dec etc2 = etc2dec();
int datalen = 0;
bool ret = etc2.decode_mem((unsigned char *)data, dataLen, _data, datalen);
_dataLen = datalen;

if (ret) {
_renderFormat = Texture2D::PixelFormat::RGBA8888;
premultipliedAlpha();
}

return ret;
}
}

etc2sdec.zip (20.3 KB)

6赞

大佬,请教一下。使用creator编辑器自带的etc2纹理压缩,有透明通道的图片会显示异常,感觉更透明了,可能是压缩后,透明通道值改变了。这个问题要怎么解决?听过3.4版本会修复这个问题,你知道大概什么时候出正式版吗?

我也出现你这种情况。使用编辑器自带的etc2纹理压缩,有透明通道的图片会显示异常,感觉更透明了,可能是压缩后,透明通道值改变了。

PC机打出来的PKM半透明正常,MAC机打出来会变得更透,有点恶心的,MAC机打出来的半透明开根号后好像就是正确的值

好技术文章

我也遇到这个问题,请问解决了吗?

mark xia

有个明显的内存泄漏

能具体说下吗

image
这里申请的内存没有释放

:heartbeat::heartbeat::heartbeat::heartbeat::heartbeat::heartbeat::heartbeat:


6H{RD%FY@49CXL~S@()EP(6
2.1.4版本改造后,iOS的打印的是0,是什么原因?

1赞

哥,这个内存泄漏解决了吗?最近在弄etc2软解析,感觉您这个挺厉害

跪求怎么具体在creator里面使用