守望者--AIR技术交流

标题: FlasCC 使用C++ zlib库解压缩 [打印本页]

作者: wenguoqing    时间: 2015-2-6 17:06
标题: FlasCC 使用C++ zlib库解压缩
FlasCC 使用C++ zlib库解压缩,C++,AS3数据ByteArray共享
ZlibCompress.cpp:

#include <stdlib.h>
#include "AS3/AS3.h"
#include "zlib.h"
#include "time.h"

void uncompressByteArray() __attribute__((used,
        annotate("as3sig:public function uncompressByteArray(atfBuffer:int, bufferLen:uint, destBuffer:int, destLen:int):int"),
        annotate("as3package:sample.ZlibCompress")));

void uncompressByteArray()
{
    unsigned int tlen;
    uLong blen;
    char* buf = (char *) 0 ;
    char *atfStr = (char *) 0 ;  
    time_t c_start, c_end;  
    double defTime;

    AS3_GetScalarFromVar(atfStr, atfBuffer);
    AS3_GetScalarFromVar(buf, destBuffer);
    AS3_GetScalarFromVar(tlen, bufferLen);
    AS3_GetScalarFromVar(blen, destLen);
   
    c_start = clock();  
    //AS3_Trace("atfStr char length:"+bufferLen);
    /* 解压缩 */  
    int ret = uncompress((Bytef*)buf, &blen, (const Bytef*)atfStr, tlen);
    if( ret == Z_MEM_ERROR)  
    {  
        AS3_Trace("uncompress failed:Z_MEM_ERROR!\n");
        free(buf);
        free(atfStr);
        return;
    }
     if( ret == Z_BUF_ERROR)  
    {  
        AS3_Trace("uncompress failed:Z_BUF_ERROR!\n");

        free(buf);
        free(atfStr);
        return;
    }

    if( ret == Z_DATA_ERROR)  
    {  
        AS3_Trace("uncompress failed:Z_DATA_ERROR!\n");
        free(buf);
        free(atfStr);
        return;
    }
          c_end = clock();  
          defTime = difftime(c_end,c_start);
    AS3_DeclareVar(ddlen, Number);
    AS3_CopyScalarToVar(ddlen, defTime);
    AS3_Trace("C time uncompress ms:"+ddlen);
   
        AS3_Return(blen);
}

main.cpp:
#include "AS3/AS3.h"

int main()
{
    AS3_GoAsync();
}

Makefile:
T05: check
        @echo "-------- Sample  --------"

        @echo && echo "Now compile a SWC"
        "$(FLASCC)/usr/bin/g++" $(BASE_CFLAGS) -O4 ZlibCompress.cpp main.cpp -lz -emit-swc=sample.ZlibCompress -o ZlibCompress.swc
       
include ../Makefile.common

clean:
        rm -f *.swf *.swc *.bc *.exe

AS代码:
package
{
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.utils.ByteArray;
        import flash.utils.getTimer;
       
        import sample.ZlibCompress.CModule;
        import sample.ZlibCompress.uncompressByteArray;
               
       
        public class TestFlasCC extends Sprite
        {
               
                [Embed(source = "zhan.atf",mimeType = "application/octet-stream")]
                private var myClass:Class;

               
                public function TestFlasCC()
                {
                        CModule.startAsync(this);
                       
                        trace(uncompress(myClass));
                }
               
                private function uncompress(myClassByte:Class):String
                {
                        var atfBytes:ByteArray = new myClassByte() as ByteArray;
                        //trace("compress before len:",atfBytes.length);
                        atfBytes.compress();
                        atfBytes.position = 0;
                       
                        var AtfPointer:int = CModule.malloc(atfBytes.length);
                        var destPointer:int = CModule.malloc(atfBytes.length*5);
                        CModule.writeBytes(AtfPointer, atfBytes.length, atfBytes);
                        var traceStr:String = "";
                        var t:int = getTimer();
                        var unLen:int = uncompressByteArray(AtfPointer, atfBytes.length, destPointer, atfBytes.length*5);
                        var tt:int = getTimer();
                        traceStr += " C++ uncompress use time:"+(tt - t);
                        //trace("uncompress after len:"+unLen);
                       
                        atfBytes.position = 0;
                        atfBytes.uncompress();
                        t = getTimer();
                        traceStr += " AS3 uncompress use time:"+(t - tt);
                        return traceStr;
                }
        }
}


结果:
C++ uncompress use time:26 ms, AS3 uncompress use time:10 ms
C++ code time uncompress :4 ms
C解压的真正用时只有4ms  CModule数据共享开销比较大,效率比较低。






欢迎光临 守望者--AIR技术交流 (http://www.airmyth.com/)