生成gif 性能优化

来源:互联网 发布:linux 挂载移动硬盘 编辑:程序博客网 时间:2024/06/08 02:43

因为工作原因.最近要对gif生成动画编码做优化.之前是使用的开源gif编码平均每次生成一个20帧的gif图片,平均时间大概是160ms,但因为是打规模生成,所以觉得还有提升空间,所以不断在网上找资料.于是找到octree算法.于是就拿了下来.

gif算法,其实分两大部分.

1,因为gif使用的是256色索引,所以要把16m色的图取出256个色,作为gif索引表.而octree(八叉树)取色算法是一种比较好的算法

2.把生成的256色索引值变成编码成为lzw编码.

在实际测试中,lzw算法是比较快的.所以,优化性能不大

所以就对八叉树做优化了.

一开始,参考了http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3677/这个算法.高出了一个基本编码器了.

一测,发现比原来的算法大概快了一倍.大概80ms左右,

因看到算法还有一定优化空间,于是继续进一步优化,首先,第一步就是把所有new的内存分配变成自己来分配.这里用了两种方法.一开始用了内存池.发现提高了10%,之后再一个栈分配.一次把所有内存都生成,而且中间没有del.这样,虽然占了一些内存,但是比原来提高了15%,可见在100000级的内存分配中.是比较显著的

第二步,就是做一件简单的优化,例如把一些地方改成inline,一些递归的地方改成非递归.发现没有提升多少.,郁闷中

第三布,总体编码,对所有帧统一编码,使用一个全局的colortable,这个方法的确快了20%左右,

第四步,对相邻帧同相同颜色的优化,就是如果两帧是相同颜色,那就就一次过来统计.不过发现也提升不了很多.估计是内存块之间的切换有问题

第五步,搞了一个多星期,还是没有提升多少,之后,决定自己参考重写一个octree算法,而且加入模板递归.测试了最后比较原来快了40左右,现在帧大概是50ms左右,我觉得暂时已经到了极限了.除非用汇编写了

 

 

原创粉丝点击