守望者--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/) |
|