Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > The way of improve

Буду выкладывать наработки в народ
Оценить эту запись

Хранение Graphics

Запись от Genzo размещена 05.08.2011 в 19:03

Столкнулся с проблемой хранения графиков , если хранить данные для отображения то получался дичайщий размер , решил посмотреть в сторону хранения данных отрисовки graphics. Т.к. передача и хранение должны были быть в текстовом виде , сначала выбор пал на JSON , но объемы данных все еще были велики , выход нашел в ByteArray который потом кодируется в base64.

Код AS3:
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;
}


Код AS3:
        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]) ); 
            }
        }
Тут выбор пал на writeObject , ибо он все равно разберется ,что ты пишешь Number или uint , и выделит необходимое кол-во байт


Далее идут представления функций graphics
Код AS3:
//Graphics Functions :
        //--------------------------------------------------------------------------------------------
        //
        //Implementation of graphics.lineStyle
        //
        public function lineStyle(tickness:uint , color:uint):void
        {
            writeCommand(BinaryGraphics.FUNCTION_lineStyle , 2 , {1:tickness,2:color});
        }
И т.п.

И сама отрисовка :
Код AS3:
//--------------------------------------------------------------------------------------------
        //
        //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 alatar вне форума
alatar
 
Аватар для alatar
Проще было бы через drawPath реализовать.
Старый 16.08.2011 15:45 Genzo вне форума
Genzo
 
Аватар для Genzo
в drawPath маловато методов , мне нужны еще drawRect , circle и т.п.
 

 


Часовой пояс GMT +4, время: 20:27.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.