Буду выкладывать наработки в народ
Хранение Graphics
Запись от Genzo размещена 05.08.2011 в 19:03
Столкнулся с проблемой хранения графиков , если хранить данные для отображения то получался дичайщий размер , решил посмотреть в сторону хранения данных отрисовки graphics. Т.к. передача и хранение должны были быть в текстовом виде , сначала выбор пал на JSON , но объемы данных все еще были велики , выход нашел в ByteArray который потом кодируется в base64.
public class BinaryGraphics{ public static const FUNCTION_lineStyle:uint = 1; public static const FUNCTION_drawRect:uint = 2; public static const FUNCTION_moveTo:uint = 3; public static const FUNCTION_lineTo:uint = 4; public static const FUNCTION_drawCircle:uint = 5; ............... private var _data:ByteArray; }
private function writeCommand(commandByte:uint , paramsCountByte:uint , params:Object):void { this._data.writeByte(commandByte); this._data.writeByte(paramsCountByte); for(var i in params) { this._data.writeObject( Number(params[i]) ); } }
Далее идут представления функций graphics
//Graphics Functions : //-------------------------------------------------------------------------------------------- // //Implementation of graphics.lineStyle // public function lineStyle(tickness:uint , color:uint):void { writeCommand(BinaryGraphics.FUNCTION_lineStyle , 2 , {1:tickness,2:color}); }
И сама отрисовка :
//-------------------------------------------------------------------------------------------- // //Static function to Draw From String // public static function draw(graphic:Graphics , commandData:ByteArray):void { graphic.clear(); var hash:String = SHA256.computeDigest(commandData); var needToUncompress:Boolean = true; for(var i:uint = 0 ; i < BinaryGraphics.UNCOMPRESSED.length ; i++) { if(BinaryGraphics.UNCOMPRESSED[i] === hash) { needToUncompress = false; break; } } if(needToUncompress == true) { commandData.uncompress(); hash = SHA256.computeDigest(commandData); BinaryGraphics.UNCOMPRESSED.push(hash); } while(commandData.bytesAvailable > 0) { var commandByte:uint = commandData.readByte(); var paramsCountByte:uint = commandData.readByte(); var params:Object = new Object(); for(var i:uint = 0;i<paramsCountByte;i++) { params[i] = commandData.readObject(); } switch(commandByte) { case BinaryGraphics.FUNCTION_lineStyle: graphic.lineStyle(params[0] , params[1]); break; case BinaryGraphics.FUNCTION_drawRect: graphic.drawRect(params[0] , params[1], params[2] , params[3]); break; case BinaryGraphics.FUNCTION_moveTo: graphic.moveTo(params[0] , params[1]); break; case BinaryGraphics.FUNCTION_lineTo: graphic.lineTo(params[0] , params[1]); break; case BinaryGraphics.FUNCTION_drawCircle: graphic.drawCircle(params[0] , params[1] ,params[2]); break; } } commandData.position = 0; }
Объем исходных данных : 150мб
Объем в JSON виде отрисовки graphics : 18мб
Объем в base64 BA данных : 2мб
Все еще очень сыро ,ибо делалось на скорую руку , но результат был достигнут
Всего комментариев 2
Комментарии
07.08.2011 18:26 | |
Проще было бы через drawPath реализовать.
|
16.08.2011 15:45 | |
в drawPath маловато методов , мне нужны еще drawRect , circle и т.п.
|
Последние записи от Genzo
- Поиск файлов в системе.[AIR] (23.12.2011)
- Соревнование на быстроту алгоритмов (20.10.2011)
- Хранение Graphics (05.08.2011)