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数据共享开销比较大,效率比较低。
|