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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.05.2013, 08:49
win95cih вне форума Посмотреть профиль Отправить личное сообщение для win95cih Найти все сообщения от win95cih
  № 1  
Ответить с цитированием
win95cih

Регистрация: May 2013
Сообщений: 12
По умолчанию Тормоза при прокрутке больших таблиц

Доброго времени суток.

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

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

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

Старый 28.05.2013, 11:24
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

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

Старый 28.05.2013, 12:38
XoJlToH вне форума Посмотреть профиль Отправить личное сообщение для XoJlToH Найти все сообщения от XoJlToH
  № 3  
Ответить с цитированием
XoJlToH
 
Аватар для XoJlToH

Регистрация: Sep 2006
Сообщений: 145
Можно поставить scrollRect на ширину-высоту стейджа, а контент cacheAsBitmap. На телефонах не проверял, но в браузере с овер9000 элементов проблему решило

Старый 28.05.2013, 13:56
win95cih вне форума Посмотреть профиль Отправить личное сообщение для win95cih Найти все сообщения от win95cih
  № 4  
Ответить с цитированием
win95cih

Регистрация: May 2013
Сообщений: 12
Цитата:
Сообщение от XoJlToH Посмотреть сообщение
Можно поставить scrollRect на ширину-высоту стейджа, а контент cacheAsBitmap. На телефонах не проверял, но в браузере с овер9000 элементов проблему решило
cacheAsBitmap уже использован, тормозит даже с ним

Старый 28.05.2013, 13:59
XoJlToH вне форума Посмотреть профиль Отправить личное сообщение для XoJlToH Найти все сообщения от XoJlToH
  № 5  
Ответить с цитированием
XoJlToH
 
Аватар для XoJlToH

Регистрация: Sep 2006
Сообщений: 145
Тогда да, пробуйте Starling и Feathers

Старый 28.05.2013, 14:00
win95cih вне форума Посмотреть профиль Отправить личное сообщение для win95cih Найти все сообщения от win95cih
  № 6  
Ответить с цитированием
win95cih

Регистрация: May 2013
Сообщений: 12
Цитата:
Сообщение от caseyryan Посмотреть сообщение
В этом и заключается. Сложно устройству считать векторную графику, тем более в таком количестве.
А выход достаточно прост. Создать таблицу длиной всего раза в 2 больше высоты экрана. И менять текст в полях на тот, который должен быть при определенном проценте прокрутки.
И использовать аппаратное ускорение графики
Последний вариант мне не подходит по некоторым причинам. А вот смена текста в ячейках - отличная идея, попробую. Спасибо.

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

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

Старый 28.05.2013, 16:06
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Разницы никакой. Может она не влияет?
Я вот тоже особой разницы никогда не замечал. Был какой-то косяк с масками при выключенном cacheAsBitmap в какой-то версии плеера, но вроде как вылечили. В остальном хрень все это.
Цитата:
Присвоение свойству cacheAsBitmap экранного объекта значения true приводит к тому, что объект кэширует собственное растровое представление. Проигрыватель Flash Player и среда AIR создают для экземпляра объект подложки, который представляет собой кэшированное растровое изображение, а не векторные данные. При изменении границ экранного объекта выполняется воссоздание подложки вместо изменения размера. Подложки могут быть вложены в другие подложки. Дочерняя подложка копирует свое растровое изображение на родительскую подложку. Дополнительные сведения см. в разделе Включение кэширования растрового изображения.
эта операция тоже довольно затратная, судя по всему
Цитата:
А вот смена текста в ячейках - отличная идея, попробую. Спасибо.
Я бы первым делом так сделал. Даже исходя из того, что потребуется меньше текстфилдов создавать, не говоря уже о просчетах всего этого

Старый 28.05.2013, 16:47
Final Hope вне форума Посмотреть профиль Найти все сообщения от Final Hope
  № 8  
Ответить с цитированием
Final Hope
Banned
[+5 04.06.13]
[+1 08.06.13]

Регистрация: May 2013
Сообщений: 52
Цитата:
Сообщение от win95cih Посмотреть сообщение
Честно говоря, сейчас сравнил скорость прокрутки с 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;
		}
	}
}


Последний раз редактировалось Final Hope; 28.05.2013 в 19:25. Причина: Не то процитировал
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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