Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Тормоза при прокрутке больших таблиц (http://www.flasher.ru/forum/showthread.php?t=199971)

win95cih 28.05.2013 08:49

Тормоза при прокрутке больших таблиц
 
Доброго времени суток.

Вопрос мой касается прокрутки контента на мобильных устройствах (в частности, планшетах).
При формировании таблиц, состоящих только из текстовых полей (TextField), количеством столбцов около 10-12, содержимое более-менее нормально прокручивается при количестве строк около 200-300, а при 500 и выше тормозит. Глядя на то, как огромное количество контента в нормальных приложениях, разработанных нормальными программистами, прокручивается со скоростью ураганного ветра и не подвисает ни ни миллисекунду, делаю заключение о том, что косяк у меня. Но вот вопрос - в чем заключается этот косяк?

Вкратце об особенностях кода. Таблица представляет из себя Sprite, каждая строка это так же Sprite, состоящий из TextField'ов. Прокрутка осуществляется событиями TouchEvent через изменение координат scrollRect. И эта конструкция тормозит.

Сталкивался ли кто-нибудь с такими проблемами? Есть советы в этой области?

caseyryan 28.05.2013 11:24

Цитата:

Но вот вопрос - в чем заключается этот косяк?
В этом и заключается. Сложно устройству считать векторную графику, тем более в таком количестве.
А выход достаточно прост. Создать таблицу длиной всего раза в 2 больше высоты экрана. И менять текст в полях на тот, который должен быть при определенном проценте прокрутки.
И использовать аппаратное ускорение графики

XoJlToH 28.05.2013 12:38

Можно поставить scrollRect на ширину-высоту стейджа, а контент cacheAsBitmap. На телефонах не проверял, но в браузере с овер9000 элементов проблему решило

win95cih 28.05.2013 13:56

Цитата:

Сообщение от XoJlToH (Сообщение 1135208)
Можно поставить scrollRect на ширину-высоту стейджа, а контент cacheAsBitmap. На телефонах не проверял, но в браузере с овер9000 элементов проблему решило

cacheAsBitmap уже использован, тормозит даже с ним

XoJlToH 28.05.2013 13:59

Тогда да, пробуйте Starling и Feathers

win95cih 28.05.2013 14:00

Цитата:

Сообщение от caseyryan (Сообщение 1135201)
В этом и заключается. Сложно устройству считать векторную графику, тем более в таком количестве.
А выход достаточно прост. Создать таблицу длиной всего раза в 2 больше высоты экрана. И менять текст в полях на тот, который должен быть при определенном проценте прокрутки.
И использовать аппаратное ускорение графики

Последний вариант мне не подходит по некоторым причинам. А вот смена текста в ячейках - отличная идея, попробую. Спасибо.

Добавлено через 21 минуту
Честно говоря, сейчас сравнил скорость прокрутки с cacheAsBitmap = true и = false. Разницы никакой. Может она не влияет? Или может я как-то неправильно объявляю значение этого свойства?

Грубо говоря, у меня есть stage, есть переменная content типа Sprite. После формирования таблицы она лепится на content, а он свою очередь лепится на stage. Перед тем как content приклеить к stage, я объявляю у него cacheAsBitmap = true

caseyryan 28.05.2013 16:06

Цитата:

Разницы никакой. Может она не влияет?
Я вот тоже особой разницы никогда не замечал. Был какой-то косяк с масками при выключенном cacheAsBitmap в какой-то версии плеера, но вроде как вылечили. В остальном хрень все это.
Цитата:

Присвоение свойству cacheAsBitmap экранного объекта значения true приводит к тому, что объект кэширует собственное растровое представление. Проигрыватель Flash Player и среда AIR создают для экземпляра объект подложки, который представляет собой кэшированное растровое изображение, а не векторные данные. При изменении границ экранного объекта выполняется воссоздание подложки вместо изменения размера. Подложки могут быть вложены в другие подложки. Дочерняя подложка копирует свое растровое изображение на родительскую подложку. Дополнительные сведения см. в разделе Включение кэширования растрового изображения.
эта операция тоже довольно затратная, судя по всему
Цитата:

А вот смена текста в ячейках - отличная идея, попробую. Спасибо.
Я бы первым делом так сделал. Даже исходя из того, что потребуется меньше текстфилдов создавать, не говоря уже о просчетах всего этого

Final Hope 28.05.2013 16:47

Цитата:

Сообщение от win95cih (Сообщение 1135226)
Честно говоря, сейчас сравнил скорость прокрутки с cacheAsBitmap = true и = false. Разницы никакой. Может она не влияет? Или может я как-то неправильно объявляю значение этого свойства?

Добрый день. Возможно, я что-то неправильно написал, но я только что провел эксперимент и у меня производительность от cacheAsBitmap = true увеличивается в три раза. При cacheAsBitmap = false число кадров при прокрутке падает до шести, а при cacheAsBitmap = true становится целых восемнадцать в среднем. Я делал вот так, как ниже написано.
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.utils.getTimer;
 
        public class Main extends Sprite
        {
                private var _tableSprite:Sprite;
                private var _fpsTextField:TextField;
                private var _lastTime:Number;
                private var _currentTime:Number;
 
                public static const SECOND:Number = 1000;
 
                public function Main()
                {
                        _lastTime = getTimer();
                        _currentTime = _lastTime;
                        _tableSprite = new Sprite();
                        _tableSprite.mouseChildren = false;
                        var tf:TextField;
                        for (var i:int = 0; i < 15; i++)
                        {
                                for (var j:int = 0; j < 500; j++)
                                {
                                        tf = new TextField();
                                        tf.text = "text";
                                        tf.x = i * tf.textWidth;
                                        tf.y = j * tf.textHeight;
                                        _tableSprite.addChild(tf);
                                }
                        }
                        _tableSprite.cacheAsBitmap = true;
                        this.addChild(_tableSprite);
                        _fpsTextField = new TextField();
                        _fpsTextField.defaultTextFormat = new TextFormat( null, null, 0xff0000 );
                        _fpsTextField.background = true;
                        _fpsTextField.backgroundColor = 0xffffff;
                        _fpsTextField.width = 100;
                        _fpsTextField.height = 30;
                        this.addChild(_fpsTextField);
                        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                        stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHandler);
                        stage.addEventListener(MouseEvent.CLICK, clickHandler);
                }
                //----------------------------------------------------------------------
                //
                //  Event handlers
                //
                //----------------------------------------------------------------------
                private function enterFrameHandler(event:Event):void
                {
                        _currentTime = getTimer();
                        var fpsCount:Number = SECOND / (_currentTime - _lastTime);
                        var fpsString:String = fpsCount.toString();
                        _fpsTextField.text = _tableSprite.cacheAsBitmap.toString() + " | " + fpsString.substr(0, 5);
                        _lastTime = _currentTime;
                }
                private function mouseWheelHandler(event:MouseEvent):void
                {
                        _tableSprite.y += event.delta;
                }
                private function clickHandler(event:MouseEvent):void
                {
                        _tableSprite.cacheAsBitmap = !_tableSprite.cacheAsBitmap;
                }
        }
}



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

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