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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.03.2011, 13:55
RaVeN-Nikma вне форума Посмотреть профиль Отправить личное сообщение для RaVeN-Nikma Посетить домашнюю страницу RaVeN-Nikma Найти все сообщения от RaVeN-Nikma
  № 1  
Ответить с цитированием
RaVeN-Nikma

Регистрация: Jan 2003
Адрес: Latvia, Riga
Сообщений: 161
По умолчанию Рисование большого количества линий

Руководство поставила в принципе тривиальную задачу, необходимо рисовать простой линейный график. Но есть одно "но", об которое я споткнулся. Необходимо рисовать огромное количество линий (100к и более), плюс при определенных событиях нужно перерисовывать все нарисованные линии (если изменилась ценовая шкала например).

Обычный метод lineTo, без всяких перерисовак, почему-то начинает через время все медленнее работать, загружает процессор сильнее с каждай новой линией, хотя выполняется команда lineTo с таким же интервалом как и ранее. Делать bitmap тоже не подходит т.к. это не решает проблемы перерисовки, при изменении шкалы.

Вообщем я пришел к выводу что нужна какая-то хитрость, чтобы не рисовать огромное количество линий, но визуально картинка бы не менялась. Рисовать каждую 10 или 20 точку не подходит, т.к. можно пропустить скачек на графике и просто не отобразить его.

Может у кого есть соображения по данной проблеме? (Перепробовал уже множество методов)

Старый 16.03.2011, 14:03
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Обычный метод lineTo, без всяких перерисовак, почему-то начинает через время все медленнее работать, загружает процессор сильнее с каждай новой линией, хотя выполняется команда lineTo с таким же интервалом как и ранее. Делать bitmap тоже не подходит т.к. это не решает проблемы перерисовки, при изменении шкалы.
Это как так битмап не решит? Пускай у вас там в коде - не визуально идут операции, потом перерисовка в битмап и добавление на сцену. Тормазов сильный не ьудет замечано. Я например тестировал на слабых компах - брал битмап 1200 * 1200 и прогонял его через таймер каждые 20 мск изменяя его графику - делал Noise как на телевизоре.

Старый 16.03.2011, 14:13
RaVeN-Nikma вне форума Посмотреть профиль Отправить личное сообщение для RaVeN-Nikma Посетить домашнюю страницу RaVeN-Nikma Найти все сообщения от RaVeN-Nikma
  № 3  
Ответить с цитированием
RaVeN-Nikma

Регистрация: Jan 2003
Адрес: Latvia, Riga
Сообщений: 161
Проблему с рисованием решит, но не решит, когда потребуется перерисовать под новую Y шкалу. Дабы внести ясность: идут данные (цена Y, время X), когда цена достигает потолка, то шкала расширяется до нового лимита, и сталобыть предыдущие данные нужно отображать уже исходя что шкала Y уже не от 0 до 100$, а от 0 до 500$. Раздвигаться шкала Y может в зависимости от поступаемых данных. Да и при сильном resize, bitmap линии делает чуть ли не прозрачными


Последний раз редактировалось RaVeN-Nikma; 16.03.2011 в 14:15.
Старый 16.03.2011, 14:16
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Да и при сильном resize, bitmap линии делает чуть ли не прозрачными
Битмап создается из вектора. никаких ресайзов для битмапа у вас не будет...

Старый 16.03.2011, 14:27
RaVeN-Nikma вне форума Посмотреть профиль Отправить личное сообщение для RaVeN-Nikma Посетить домашнюю страницу RaVeN-Nikma Найти все сообщения от RaVeN-Nikma
  № 5  
Ответить с цитированием
RaVeN-Nikma

Регистрация: Jan 2003
Адрес: Latvia, Riga
Сообщений: 161
Тоесть Вы предлагаете, при resize прорисовать 100к линий в Sprite из которого потом сделать bitmap и только bitmap отобразить? (если не делать ресайз bitmapa)

Старый 16.03.2011, 14:30
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Да именно так. потому что не добавляя на сцену рантаймом - память так не жрется, тем более на сцене нет векторной перерисовки

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
рисуйте линии себе спокойно порционно. нарисовали , допустим 100 линий, загнали в битмапу, стерли и т.д.
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 16.03.2011, 14:54
RaVeN-Nikma вне форума Посмотреть профиль Отправить личное сообщение для RaVeN-Nikma Посетить домашнюю страницу RaVeN-Nikma Найти все сообщения от RaVeN-Nikma
  № 8  
Ответить с цитированием
RaVeN-Nikma

Регистрация: Jan 2003
Адрес: Latvia, Riga
Сообщений: 161
Написал на быструю руку класс, исходя из ваших слов. Либо, я что-то не так делаю, либо это не подходит, ибо с каждой новой линией скорость падает.

Устанавливаем fps 100 и смотрим
Код AS3:
package 
{
 
	import flash.display.Graphics;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
 
	public class test extends MovieClip
	{
 
		private var bitMAP:Bitmap = new Bitmap();
		private var bitMapDATA:BitmapData;
		private var graf:Sprite = new Sprite();
		private var count:uint = 0;
		private var step:Number = 0;
		private var equityArr:Vector.<Object> = new Vector.<Object>();
 
		public function test():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			loadGrafik();
		}
 
		public function loadGrafik():void
		{
 
			for (var i:int = 0; i < 10000; i++ ) {
				equityArr.push( { day:"2011.03.23", time:"13:26", money:randomRange(40, 60) } );
			}
 
			step = (300 / 10000);
 
			graf.graphics.lineStyle(2, 0x008cd2);
			bitMapDATA = new BitmapData( 300, 200 );
			addChild(bitMAP);
			this.addEventListener(Event.ENTER_FRAME, createPoint);
		}
 
		private function randomRange(max:Number, min:Number = 0):Number
		{
			 return Math.random() * (max - min) + min;
		}
 
		private function createPoint(e:Event):void
		{
			var vectorStartTime:Number = getTime();
 
			graf.graphics.lineTo( (step*count) , equityArr[count].money);
			bitMapDATA.draw( graf );
			bitMAP.bitmapData = bitMapDATA;
			count++;
 
			var vectorTime:Number = (getTime() - vectorStartTime);
			trace(vectorTime);
		}
 
		private function getTime():Number
		{
			return (new Date()).getTime();
		}
 
	}
}
Добавлено через 19 минут
Кажется понял в чем проблема. Надо изменить функцию createPoint на

Код AS3:
private function createPoint(e:Event):void
		{
			var vectorStartTime:Number = getTime();
 
			var gr:Graphics = graf.graphics;
 
			var st:Number = (step * count);
			gr.lineTo( st , equityArr[count].money);
			var rect:Rectangle = new Rectangle(st, 0, (300 - st), 200);
			bitMapDATA.draw( graf, null, null, null, rect, false );
			bitMAP.bitmapData = bitMapDATA;
 
			gr.clear();
			gr.lineStyle(2, 0x008cd2);
			gr.moveTo( st , equityArr[count].money);
 
			count++;
 
			var vectorTime:Number = (getTime() - vectorStartTime);
			trace(vectorTime);
		}

Старый 16.03.2011, 15:54
incoob вне форума Посмотреть профиль Отправить личное сообщение для incoob Найти все сообщения от incoob
  № 9  
Ответить с цитированием
incoob

Регистрация: Mar 2008
Сообщений: 215
Возможно, что, рисуя линию напрямую в bitmap, вы получите больший выигрыш в производительности. Тут рассказано о библиотеке, которая умеет такое делать.

Старый 16.03.2011, 18:20
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 10  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
100К линий в графике, для просмотра человеком? Можно посмотреть, что за график в результате получается?

Добавлено через 13 минут
Не знаю, у меня моментом, правда я малек переписал.

Код AS3:
package 
{
 
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Graphics;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class GRTest extends MovieClip
	{
 
		private var count:uint = 0;
		private var step:Number = 0;
		private var equityArr:Array;//Vector.<Object> = new Vector.<Object>();
 
		public function GRTest():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			loadGrafik();
		}
 
		public function loadGrafik():void
		{
			equityArr = [];
			for (var i:int = 0; i < 10000; i++ ) {
				equityArr.push( { day:"2011.03.23", time:"13:26", money:randomRange(40, 60) } );
			}
 
			step = (300 / 10000);
			drawGraph(equityArr);
		}
 
		private function drawGraph(arr:Array):void
		{
			var g:Graphics = graphics;
			g.clear();
			g.lineStyle(2, 0x008cd2);
			var len:int = arr.length;
			for(var i:int = 0; i<len; i++)
			{
				g.lineTo(step*i, equityArr[i].money);
			}
		}
 
		private function randomRange(max:Number, min:Number = 0):Number
		{
			return Math.random() * (max - min) + min;
		}
	}
}
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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