精华内容
下载资源
问答
  • 压缩算法
    千次阅读
    2022-01-08 23:59:07

    游戏开发中,经常在玩家进入游戏的时候进行必要的信息初始化,往往这个初始化信息数据包是相对来说还是比较大的,一般在30-40kb左右,还是有必要进行压缩一下再发送消息,刚好前段时间看过,里面列举了一些常用的压缩算法,如下图所示:
    在这里插入图片描述
    是否可切分表示是否可以搜索数据流的任意位置并进一步往下读取数据,这项功能在Hadoop的MapReduce中尤其适合。
    下面对这几种压缩格式进行简单的介绍,并进行压力测试,进行性能比较

    一、算法

    1.1 DEFLATE

    DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法,jdk中对zlib压缩库提供了支持,压缩类Deflater和解压类Inflater,Deflater和Inflater都提供了相应的native方法。

    public static byte[] compress(byte input[]) {
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         Deflater compressor = new Deflater(1);
         try {
             compressor.setInput(input);
             compressor.finish();
             final byte[] buf = new byte[2048];
             while (!compressor.finished()) {
                 int count = compressor.deflate(buf);
                 bos.write(buf, 0, count);
             }
         } finally {
             compressor.end();
         }
         return bos.toByteArray();
     }
    
    public static byte[] uncompress(byte[] input) throws DataFormatException {
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         Inflater decompressor = new Inflater();
         try {
             decompressor.setInput(input);
             final byte[] buf = new byte[2048];
             while (!decompressor.finished()) {
                 int count = decompressor.inflate(buf);
                 bos.write(buf, 0, count);
             }
         } finally {
             decompressor.end();
         }
         return bos.toByteArray();
     }
    

    可以指定算法的压缩级别,这样你可以在压缩时间和输出文件大小上进行平衡。
    可选的级别有0(不压缩),以及1(快速压缩)到9(慢速压缩),这里使用的是以速度为优先。

    1.2 gzip

    gzip的实现算法还是deflate,只是在deflate格式上增加了文件头和文件尾,同样jdk也对gzip提供了支持,分别是GZIPOutputStream和GZIPInputStream类,同样可以发现GZIPOutputStream是继承于DeflaterOutputStream的,GZIPInputStream继承于InflaterInputStream,并且可以在源码中发现writeHeader和writeTrailer方法。

    public static byte[] compress(byte srcBytes[]) {
       ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(srcBytes);
            gzip.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }
    
    public static byte[] uncompress(byte[] bytes) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        try {
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[2048];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        return out.toByteArray();
    }
    

    1.3 bzip2

    bzip2是Julian Seward开发并按照自由软件/开源软件协议发布的数据压缩算法及程序。Seward在1996年7月第一次公开发布了bzip2 0.15版,在随后几年中这个压缩工具稳定性得到改善并且日渐流行,Seward在2000年晚些时候发布了1.0版。bzip2比传统的gzip的压缩效率更高,但是它的压缩速度较慢。jdk中没有对bzip2实现,但是在commons-compress中进行了实现。

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>1.12</version>
    </dependency>
    

    代码实现如下:

    public static byte[] compress(byte srcBytes[]) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        BZip2CompressorOutputStream bcos = new BZip2CompressorOutputStream(out);
        bcos.write(srcBytes);
        bcos.close();
        return out.toByteArray();
    }
    
    public static byte[] uncompress(byte[] bytes) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        try {
            BZip2CompressorInputStream ungzip = new BZip2CompressorInputStream(
                    in);
            byte[] buffer = new byte[2048];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        return out.toByteArray();
    }
    

    1.4 lzo

    LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,需要引入第三方库。

    <dependency>
        <groupId>org.anarres.lzo</groupId>
        <artifactId>lzo-core</artifactId>
        <version>1.0.5</version>
    </dependency>
    

    实现代码:

    public static byte[] compress(byte srcBytes[]) throws IOException {
            LzoCompressor compressor = LzoLibrary.getInstance().newCompressor(
                    LzoAlgorithm.LZO1X, null);
    
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            LzoOutputStream cs = new LzoOutputStream(os, compressor);
            cs.write(srcBytes);
            cs.close();
    
            return os.toByteArray();
        }
    
        public static byte[] uncompress(byte[] bytes) throws IOException {
            LzoDecompressor decompressor = LzoLibrary.getInstance()
                    .newDecompressor(LzoAlgorithm.LZO1X, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ByteArrayInputStream is = new ByteArrayInputStream(bytes);
            LzoInputStream us = new LzoInputStream(is, decompressor);
            int count;
            byte[] buffer = new byte[2048];
            while ((count = us.read(buffer)) != -1) {
                baos.write(buffer, 0, count);
            }
            return baos.toByteArray();
        }
    

    1.5 lz4

    LZ4是一种无损数据压缩算法,着重于压缩和解压缩速度,需要依赖三方库。

    <dependency>
        <groupId>net.jpountz.lz4</groupId>
        <artifactId>lz4</artifactId>
        <version>1.2.0</version>
    </dependency>
    

    实现代码:

    public static byte[] compress(byte srcBytes[]) throws IOException {
            LZ4Factory factory = LZ4Factory.fastestInstance();
            ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
            LZ4Compressor compressor = factory.fastCompressor();
            LZ4BlockOutputStream compressedOutput = new LZ4BlockOutputStream(
                    byteOutput, 2048, compressor);
            compressedOutput.write(srcBytes);
            compressedOutput.close();
            return byteOutput.toByteArray();
        }
    
        public static byte[] uncompress(byte[] bytes) throws IOException {
            LZ4Factory factory = LZ4Factory.fastestInstance();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            LZ4FastDecompressor decompresser = factory.fastDecompressor();
            LZ4BlockInputStream lzis = new LZ4BlockInputStream(
                    new ByteArrayInputStream(bytes), decompresser);
            int count;
            byte[] buffer = new byte[2048];
            while ((count = lzis.read(buffer)) != -1) {
                baos.write(buffer, 0, count);
            }
            lzis.close();
            return baos.toByteArray();
        }
    

    1.6 Snappy

    Snappy(以前称Zippy)是Google基于LZ77的思路用C++语言编写的快速数据压缩与解压程序库,并在2011年开源。它的目标并非最大压缩率或与其他压缩程序库的兼容性,而是非常高的速度和合理的压缩率。

    <dependency>
        <groupId>org.xerial.snappy</groupId>
        <artifactId>snappy-java</artifactId>
        <version>1.1.2.6</version>
    </dependency>
    

    实现代码:

    public static byte[] compress(byte srcBytes[]) throws IOException {
          return  Snappy.compress(srcBytes);
      }
    
    public static byte[] uncompress(byte[] bytes) throws IOException {
        return Snappy.uncompress(bytes);
    }
    

    二、压力测试

    以下对35kb玩家数据进行压缩和解压测试,相对来说35kb数据还是很小量的数据,所有以下测试结果只是针对指定的数据量区间进行测试的结果,并不能说明哪种压缩算法好与不好。

    测试环境:

    • jdk:1.7.0_79
    • cpu:i5-4570@3.20GHz 4 Core
    • memory:4G

    对35kb数据进行2000次压缩和解压缩测试,测试代码如下:

    public static void main(String[] args) throws Exception {
            FileInputStream fis = new FileInputStream(new File("player.dat"));
            FileChannel channel = fis.getChannel();
            ByteBuffer bb = ByteBuffer.allocate((int) channel.size());
            channel.read(bb);
            byte[] beforeBytes = bb.array();
    
            int times = 2000;
            System.out.println("压缩前大小:" + beforeBytes.length + " bytes");
            long startTime1 = System.currentTimeMillis();
            byte[] afterBytes = null;
            for (int i = 0; i < times; i++) {
                afterBytes = GZIPUtil.compress(beforeBytes);
            }
            long endTime1 = System.currentTimeMillis();
            System.out.println("压缩后大小:" + afterBytes.length + " bytes");
            System.out.println("压缩次数:" + times + ",时间:" + (endTime1 - startTime1)
                    + "ms");
    
            byte[] resultBytes = null;
            long startTime2 = System.currentTimeMillis();
            for (int i = 0; i < times; i++) {
                resultBytes = GZIPUtil.uncompress(afterBytes);
            }
            System.out.println("解压缩后大小:" + resultBytes.length + " bytes");
            long endTime2 = System.currentTimeMillis();
            System.out.println("解压缩次数:" + times + ",时间:" + (endTime2 - startTime2)
                    + "ms");
        }
    

    代码中的GZIPUtil根据不同的算法进行替换,测试结果如下图所示:
    在这里插入图片描述
    分别对压缩前大小、压缩后大小、压缩时间、解压缩时间、cpu高峰进行了统计。

    三、总结

    从结果来看,deflate、gzip和bzip2更关注压缩率,压缩和解压缩时间会更长;lzo,lz4以及snappy这3中压缩算法,均已压缩速度为优先,压缩率会稍逊一筹;lzo,lz4以及snappy在cpu高峰更低一点。

    更多相关内容
  • STM32移植 MINI LZO2.09压缩算法 编译通过 可以直接烧录运行 使用STM32F103VET6 STM32移植 MINI LZO2.09压缩算法 编译通过 可以直接烧录运行 使用STM32F103VET6
  • 介绍了一种基于等间隔时间变化的空间数据有损压缩算法,该算法是在“道格拉斯算法”之上,进行了一系列的改进。这种算法在满足一定欧式距离的情况下,很好地保留了空间数据的特征点,大大F减少了在压缩过程中的计算...
  • 本人收集的基于matlab的各种压缩算法程序,包括lzw,huffman,dpcm,diffcoding,jpeg等 (Based on a variety of compression algorithms matlab program I collected, including lzw, huffman, dpcm, diffcoding, ...
  • 随心压缩算法 介绍 Xpress 压缩算法具有三种变体,均专为提高速度而设计。最快的变体 Plain LZ77 实现了 LZ77 算法 ( UASDC )。较慢的变体 LZ77+Huffman 在 LZ77 数据上添加了 Huffman 编码通道。第三个变体 LZNT1 ...
  • DP算法是一种常用的轨迹压缩算法,它压缩大量冗余图形点,提取出所需的点。本程序中采用DP算法将原17个点压缩到7个点。
  • LZW算法逻辑简单,实现速度快,擅长于压缩重复出现的字符串;无需事先统计各字符的出现概率,一次扫描即可;...本文利用FPGA实现了改进的LZW压缩算法,仿真证明其算法具有很高压缩率,适合工程的实际应用。
  • 纯VB实现的文件压缩算法 如果电脑上没有装rar的话,可以用这个编译成功工具使用哦。学习之用。
  • c++实现多种压缩算法 源程序 /* fp8文件是应用世界上压缩率最高的paq压缩算法的FastPAQ压缩软件的专有格式,你可在CSDN上下载【FastPAQ--世界最强压缩软件下载】以解压fp8文件*/
  • 用C++实现的压缩、解压缩算法,只有几个cpp、h文件,非常小巧,方便学习算法用。
  • 探讨二进制Edwards 曲线上的点压缩算法。分别给出了二进制Edwards 曲线的单点压缩算法和两点压缩算法。平均压缩点带宽为nbit 和1. 5n - 1 bit,平均恢复点开销为I + 0. 5M + S和1. 5I + M + S. 通过与对其他类型...
  • 基于小波变换的基础上对图像进行压缩处理,压缩比高、压缩速度快,压缩后能保持信号与图像的特征基本不变。
  • 本文利用压缩感知算法对心电数据信号进行压缩,从而实现心电数据的高压缩率与高精度...本文通过实验在MIT-BIH数据库上进行验证,对比了传统的压缩算法,证明本文提出的算法在均方根误差和压缩率上都能取得较好的效果。
  • 易语言lzss压缩算法

    2020-07-21 16:41:01
    易语言lzss压缩算法源码,lzss压缩算法,lzss压缩,lzss解压,int,del
  •  A:行程编码、Huffman压缩算法压缩率太低;  B:JPEG压缩算法需要太多位运算,且运算量大(有专门MMX优化算法),不利于VB实现;  C:GIF-LZW压缩算法压缩率较好,且已有VB语法下高效GIF-LZW压缩/解压算法,最后...
  • lzss压缩算法.rar

    2020-04-05 04:39:51
    lzss压缩算法.rar
  • 针对语音信号振幅较大时传统压缩算法的跟踪性较差的情况,提出了一种新型的改进型自适应ADDPCM语音压缩算法.同时,根据语音信号不连续的特点,压缩算法具有静音识别功能,进一步提高了语音信号的压缩率.压缩算法在8kHz的...
  • 数据压缩是利用各种算法将数据冗余压缩到最小,并尽可能地减少失真,从而提高传输效率和节约存储空间。  数据压缩技术一般分为有损压缩和无损压缩。无损压缩是指重构压缩数据(还原,解压缩),而重构数据与原来数据...
  • 内容索引:VC/C++源码,算法相关,压缩,算法,LZARI 一个基于LZARI算法的数据压缩类——lzari.c,它提供了lzari压缩算法的核心实现,本算法是在1989年7月4日用C语言实现,但是一些全局或静态的变量在MFC环境下使用很不...
  • JPEG-LS算法是公认的灰度图像有效的压缩算法。然而,对于计算机绘制的灰度图像(如CAD、SOLIDWORK等),其压缩效率低,限制了JPEG-LS的广泛应用。提出一种基于两步编码法的图像有效压缩算法,即建模和编码,算法与...
  • 本文研究了图像压缩算法性能的评价方法,提出了图像压缩算法性能的测试算法,包括横向比较测试和纵向分解测试,并在此基础上设计并实现了压缩算法性能的测试与分析工具。该工具能够测试和分析压缩算法的性能,并自动...
  • 摘 要:针对无线传感器网络采集数据存在的时空冗余,提出了一种自适应最优消零压缩算法(AOZS, adaptive optimal zero suppression compression algorithm)。AOZS是一种无损的数据压缩算法,能够自适应地寻找最优位数...
  • 传统图像识别算法识别模型单一且易受外部光照条件干扰,深度卷积网络模型虽然识别率高,但计算量大,设备成本高,因此提出基于深度同或卷积网络的改进型压缩算法。首先介绍了焊缝识别系统的组成和经典卷积神经网络...
  • 基于行程长度编码压缩算法在选取不同的最大行程长度时获取的压缩比不同的特点,提出一种自适应最大行程长度编码压缩算法,并基于自适应最大行程长度编码提出一种有损自适应最大行程长度编码压缩算法。试验证明该算法...
  • 空间数据系统咨询委员会针对空间数据的特点和环境要求,提出了针对空间数据的压缩算法CCSDS122.0-B-1?本文对CCSDS图像压缩算法进行了原理分析?用c语言对其进行了实现,并进行性能分析,与JPEG2000和SPIHT进行性能...
  • 几种压缩算法详解

    2017-12-21 20:14:10
    几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩算法详解几种压缩...
  • 易语言源码易语言lzss压缩算法源码.rar
  • 本仿真对脉冲压缩进行改进,提出去斜处理。与脉冲压缩技术不同,此算法可用于带宽极大的雷达定位:穿墙雷达,探地雷达等。定位效果极佳,还可为后续压缩感知及后投影BP算法提供研究思路。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 403,390
精华内容 161,356
关键字:

压缩算法