环信优化聊天列表图片过大过多问题

最近在优化聊天部分的问题,聊天目前用的是环信的体系,部分模块是基于DEMO进行的修改,现在要做统一的整理和优化。
有个反馈的BUG是:在聊天页面有大量聊天图片之后第一次进入滚动会卡顿。
在滚动视图上造成卡顿,一般都是处理了耗时的操作,找到了对应的代码进行了检查,发现在每个cell中都会进行一遍缩放的处理,代码如下:

- (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize
{
    UIGraphicsBeginImageContext(CGSizeMake(image.size.width * scaleSize, image.size.height * scaleSize));
    [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height * scaleSize)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}

虽然经过缩放的Image进行了缓存处理,但未缓存时进行滚动就会出现卡顿问题,掉帧比较严重。而且聊天页面有个很大的问题,就是视图出现时需要滚动到最底部,相当于一进来就把所有的cell全部复用一遍,在cell中进行的操作会出现成倍的放大。
其中还有一部分是imageview高度的计算部分,从代码执行的时间和真机上效果来看,还不足以成为大量耗时的部分,但也在优化范围之内,先以缓存size为主。

那么就从这里入手,刚好前两天下载了最新的DEMO,处理了一下视频问题,找了下其中更新了之后的写法,发现没有了图片压缩这部分,直接拿出了原始路径。这对于我们来说是不可行的,因为我们是可以进行原图发送,丝毫不进行压缩,长图往往有5 ~ 10M,数量过多放入缓存中明显是不可取的。

联想到对于接收方会自动生成一个远程的缩略图url,发送方是否也可以使用这个服务?但这就意味点了发送之后不能立刻显示真实的图片需要占位图,在咨询了环信之后被告知发送方的缓存逻辑只能自己去实现。

那么现在的问题是,必须要有个缩略图,这个缩略图的产生是在客户端,逻辑需要自己来搞。产生缩略图的方法必定会大量耗时,在cell中去执行肯定是不行的,那么就需要一个产生缩略图的时机,通过衡量代码的改动量和性能的优化上,决定把这个时机放在发送图片的时刻,当我调用发送图片的方法前,就去执行保存缩略图的方法(同步,为了保证能百分之百显示预览)。

具体方式如下:
1.从相册选取好图片;
2.标记此图片资源文件名,即唯一性,采取ext的方式(环信中保证唯一性的方式建议采用ext自行扩展的方式,msgId在发送前和发送后会发生变化),压缩大小在50K以下,保存至文件夹中;
3.cell赋值时,查看ext中是否有扩展字段名,如果有,进行拼接取值缓存等一系列操作;

通过优化之后已经流畅许多了,在发送时压缩大概会多消耗0.1 ~ 0.3秒,这在静止页面几乎是无感知的。

为什么没有采取优化产生缩略图的方式,只是改变流程和时机?
图片缩放无论是丢给CPU操作还是GPU操作,都会消耗一定的时间,即使再去优化也会有一个瓶颈的状态,在cell复用过程中,因为这个耗时较大,你无法采用异步回调的方式,等缩放好再赋值上去,如果这样操作,引入的新问题会更多。所以这里并未从优化产生缩略图的方式入手。

你可能感兴趣的:(环信优化聊天列表图片过大过多问题)