守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 4063|回复: 0

[基础入门] FlasCC 使用C++ zlib库解压缩

[复制链接]

该用户从未签到

1

主题

1

帖子

55

积分

列兵

Rank: 2

威望
0
贡献
0
金币
25
钢镚
1
发表于 2015-2-6 17:06:55 | 显示全部楼层 |阅读模式
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数据共享开销比较大,效率比较低。

评分

参与人数 1金币 +20 收起 理由
破晓 + 20 很给力!

查看全部评分

守望者AIR技术交流社区(www.airmyth.com)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

站长推荐上一条 /4 下一条

QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

GMT+8, 2024-3-29 21:05 , Processed in 0.204204 second(s), 34 queries .

守望者AIR

守望者AIR技术交流社区

本站成立于 2014年12月31日

快速回复 返回顶部 返回列表