Просмотр полной версии : Тормоза при прокрутке больших таблиц
win95cih
28.05.2013, 08:49
Доброго времени суток.
Вопрос мой касается прокрутки контента на мобильных устройствах (в частности, планшетах).
При формировании таблиц, состоящих только из текстовых полей (TextField), количеством столбцов около 10-12, содержимое более-менее нормально прокручивается при количестве строк около 200-300, а при 500 и выше тормозит. Глядя на то, как огромное количество контента в нормальных приложениях, разработанных нормальными программистами, прокручивается со скоростью ураганного ветра и не подвисает ни ни миллисекунду, делаю заключение о том, что косяк у меня. Но вот вопрос - в чем заключается этот косяк?
Вкратце об особенностях кода. Таблица представляет из себя Sprite, каждая строка это так же Sprite, состоящий из TextField'ов. Прокрутка осуществляется событиями TouchEvent через изменение координат scrollRect. И эта конструкция тормозит.
Сталкивался ли кто-нибудь с такими проблемами? Есть советы в этой области?
caseyryan
28.05.2013, 11:24
Но вот вопрос - в чем заключается этот косяк?
В этом и заключается. Сложно устройству считать векторную графику, тем более в таком количестве.
А выход достаточно прост. Создать таблицу длиной всего раза в 2 больше высоты экрана. И менять текст в полях на тот, который должен быть при определенном проценте прокрутки.
И использовать аппаратное ускорение (http://gamua.com/starling/) графики
Можно поставить scrollRect на ширину-высоту стейджа, а контент cacheAsBitmap. На телефонах не проверял, но в браузере с овер9000 элементов проблему решило
win95cih
28.05.2013, 13:56
Можно поставить scrollRect на ширину-высоту стейджа, а контент cacheAsBitmap. На телефонах не проверял, но в браузере с овер9000 элементов проблему решило
cacheAsBitmap уже использован, тормозит даже с ним
Тогда да, пробуйте Starling и Feathers
win95cih
28.05.2013, 14:00
В этом и заключается. Сложно устройству считать векторную графику, тем более в таком количестве.
А выход достаточно прост. Создать таблицу длиной всего раза в 2 больше высоты экрана. И менять текст в полях на тот, который должен быть при определенном проценте прокрутки.
И использовать аппаратное ускорение (http://gamua.com/starling/) графики
Последний вариант мне не подходит по некоторым причинам. А вот смена текста в ячейках - отличная идея, попробую. Спасибо.
Добавлено через 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
Честно говоря, сейчас сравнил скорость прокрутки с cacheAsBitmap = true и = false. Разницы никакой. Может она не влияет? Или может я как-то неправильно объявляю значение этого свойства?Добрый день. Возможно, я что-то неправильно написал, но я только что провел эксперимент и у меня производительность от cacheAsBitmap = true увеличивается в три раза. При cacheAsBitmap = false число кадров при прокрутке падает до шести, а при cacheAsBitmap = true становится целых восемнадцать в среднем. Я делал вот так, как ниже написано.
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;
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.