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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.11.2008, 19:14
gen4 вне форума Посмотреть профиль Отправить личное сообщение для gen4 Найти все сообщения от gen4
  № 1  
Ответить с цитированием
gen4
[+4 18.09.08]

Регистрация: May 2006
Сообщений: 79
Question Оптимизация. на примере таблоида.

делаю визуальный эфект напоминающий таблоид - массив "пикселей"-объектов, меняющих цвет или форму по какому-нибудь заданному алгоритму.

Стоило мне расставить около 3000 таких объектов и заставить их менять размер, фпс уже не поднимется выше 15.

Не думаю, что расчетов тут больше, чем, скажем, в 3д-движке, или 2д-физике.


Вывод: я делаю что-то координально неправильно)

Вопрос: Что именно? Какие подходы использовали бы Вы?

код 2х классов.

Код:
public class Main extends Sprite 
	{
		
		private var radius:uint = 10;
		private var tArray:Array = new Array();
		private var table:Sprite = new Sprite();
		private var bmd:BitmapData = new BitmapData(800, 400, true, 0x00FF33bb);//
		private var bm:Bitmap = new Bitmap(bmd);
		private var nullRect:Rectangle = bmd.rect;
		private var frame:uint = 0 ;
		private var field:Boolean = false ;
		
		public function Main() {
			fillTabloid();
			addChild(table);
			addChild( new Stats() )
			addEventListener(Event.ENTER_FRAME, render);
		}
		
		
		private function render(ev = null) {
			for (var i = 0; i < tArray.length;i++ ) {
					tArray[i].anim(frame);
				}
			frame++;
		}
		
		private function fillTabloid() {
			for (var i = 0; i < 80; i++) {
				for (var j = 0; j < 40; j++) {
					var t = new Tabl(i*radius*2, j*radius*2, radius);
					table.addChild(t);
					tArray.push(t);
				}
			}
		}
	}

Код:
	import flash.display.Shape;
	import flash.events.*;
	
	/**
	 * ...
	 * @author DefaultUser (Tools -> Custom Arguments...)
	 */
	public class Tabl extends Shape 
	{
		private var radius:uint;
		private var brightness:Number;
		private var offless:Number;
		private var frame:uint  = Math.round(Math.random() * 1000);
		private var tmp:uint = 0 ;
		private var color:Number = 0xFFFFFF * Math.random();
		
		public function Tabl(xx,yy,rr) {
			x = xx;
			y = yy;
			radius = rr;
		}
		
		
		public  function  anim(f:uint) {
			var n = 	this.graphics;
			n.clear();
			var aa = (1 + Math.sin((frame + f) * 0.1)) * 0.5;
			n.beginFill(color, aa);
			n.drawCircle(0, 0, radius * aa);
			n.endFill();
			
		}

	}
Вложения
Тип файла: rar Tabloid.rar (7.9 Кб, 286 просмотров)

Старый 26.11.2008, 00:36
BoUnd вне форума Посмотреть профиль Отправить личное сообщение для BoUnd Посетить домашнюю страницу BoUnd Найти все сообщения от BoUnd
  № 2  
Ответить с цитированием
BoUnd

Регистрация: Nov 2004
Адрес: Россия, Орел
Сообщений: 17
Отправить сообщение для BoUnd с помощью ICQ
Вся оптимизация в рамках данной задачи - полная реорганизация алгоритма. Обновлять 3000 объектов в каждом кадре, нельзя отнести к удачной затее. На практике, в рамках одной задачи, даже простые внешние изменения с количеством графических объектов порядка 500 могли приводить к значительной потере производительности.

Старый 26.11.2008, 03:01
ZlPredator вне форума Посмотреть профиль Отправить личное сообщение для ZlPredator Найти все сообщения от ZlPredator
  № 3  
Ответить с цитированием
ZlPredator

Регистрация: Nov 2008
Сообщений: 65
Во первых, не помешает объявлять тип локальных переменных (особенно важно для объектов). Иначе плеер будет при каждом вашем обращении к свойству или методу искать по таблице методов нужный (вместо быстрого вызова).

Во вторых, векторная графика требует много ресурсов (учитывая antialias краев и возможность сложных заполнителей). Необходимо избегать большого количества векторной графики и особенно ее постоянного изменения. Лучше было использовать свойства alpha и scale, чем постоянно перерисовывать. Еще можно попробовать создавать битмап по вектору и уже работать с ним:

Код AS3:
public class Tabl extends Sprite 
{
	private var radius:uint;
	private var frame:uint  = Math.round(Math.random() * 1000);
	private var color:Number = 0xFFFFFF * Math.random();
 
	public function Tabl(xx,yy,rr) {
		x = xx;
		y = yy;
		radius = rr;
		var n:Graphics = this.graphics;
		n.clear();
		n.beginFill(color);
		n.drawCircle(0, 0, radius);
		n.endFill();
		var b:BitmapData = new BitmapData(radius*2,radius*2);
		var m:Matrix = new Matrix();
		m.translate(radius,radius);
		b.draw(this,m);
		n.clear();
		var bmp:Bitmap = new Bitmap(b,"auto",true);
		bmp.x = bmp.y = -radius;
		addChild(bmp);
	}
 
	public  function  anim(f:uint):void
	{
		var aa:Number = (1 + Math.sin((frame + f) * 0.1)) * 0.5;
		alpha = aa;
		width = height = radius * aa;
	}
 
}
Если известно что фон фиксированного цвета, можно убрать альфа канал в изображении (будет быстрее).

Если и это не помогает, то необходимо уменьшать количество элементов (или площади перерисовки) или уменьшать качество отрисовки.

Старый 26.11.2008, 14:36
gen4 вне форума Посмотреть профиль Отправить личное сообщение для gen4 Найти все сообщения от gen4
  № 4  
Ответить с цитированием
gen4
[+4 18.09.08]

Регистрация: May 2006
Сообщений: 79
ZlPredator: да, битмап в этом виде - хорошая затея, попробую.

BoUnd: Намекните, в пользу чего реорганизовывать?

Добавлено через 25 минут
ZlPredator: битмап в предложнном виде прироста производительности не дал, вопреки ожиданиям (

Старый 26.11.2008, 17:04
ZlPredator вне форума Посмотреть профиль Отправить личное сообщение для ZlPredator Найти все сообщения от ZlPredator
  № 5  
Ответить с цитированием
ZlPredator

Регистрация: Nov 2008
Сообщений: 65
Можно еще попробовать альфа канал не использовать.

В теории от количества объектов не должно сильно зависеть (скорее от площади перерисовки). Если такая зависимость все таки есть, то можно попробовать разбить на небольшие блоки. Например, создать спрайты для каждой строки, добавить их на экран, а Tabl добавлять в спрайт конкретной строки (такая оптимизация ускоряет прорисовку при добавлении/удалении объектов, поможет ли она для этого случая - не знаю, необходимо пробовать).

Если нету наложений объектов друг на друга (наш случай), то в теории скорость можно довести до fps отрисовки битмапы на весь экран с включенным сглаживанием (кстати, сделал бы тест у себя - заодно узнал эту скорость).

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

Теги
графика , оптимизация

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

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


 


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


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