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

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

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

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
По умолчанию Движение больших слоев фона

Все нет сил было бы все супер, если бы не унылая оптимизация Перерыл интернет превратив браузер и рабочий стол в мусорку.
Ситуация такая:
Входные данные: контейнеры размером примерно 3000х1000 с векторной графикой.
Инициализация: создаю новые контейнеры с предыдущих но уже с растерезированным вектором и добавляю их на сцену. Старые контейнеры с их начинкой сравниваем с null.
Итерация: контейнеры стоят на своих местах, с помощью clear(), Matrix() и beginBitmapFill() перерисовываю сохраненную битмапку в свой контейнер.

При таком раскладе фпс падает до 16, если контейнеры убрать - получаю необходимые 28-31.
Если при итерации ничего не перерисовывать и даже не двигать сцену - те же 16 (и область перерисовки - весь экран).
Пробовал ограничить drawRect() размерами флешки, получил в ответ 14 фпс (((
Помогите, буду признателен.


Последний раз редактировалось FieryWall; 03.01.2012 в 22:39.
Старый 03.01.2012, 22:49
carrotoff вне форума Посмотреть профиль Отправить личное сообщение для carrotoff Найти все сообщения от carrotoff
  № 2  
Ответить с цитированием
carrotoff
 
Аватар для carrotoff

Регистрация: May 2010
Сообщений: 543
Цитата:
Итерация: контейнеры стоят на своих местах, с помощью clear(), Matrix() и beginBitmapFill() перерисовываю сохраненную битмапку в свой контейнер.
А вот про это можно подробней
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с)

Старый 03.01.2012, 23:04
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 3  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
если нужен только скроллинг без изменения фона, рекомендую копать в сторону scrollRect, мега быстрая фича.

Старый 03.01.2012, 23:09
FieryWall вне форума Посмотреть профиль Отправить личное сообщение для FieryWall Найти все сообщения от FieryWall
  № 4  
Ответить с цитированием
FieryWall
 
Аватар для FieryWall

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
Код AS3:
//fonMtx - матрица, определяю для сдвига картинки
fonMtx.tx = fon.x - par.x / speed;
fonMtx.ty = fon.y - par.y / speed;
//чищу предыдущую
graphics.clear();
//рисую новую
graphics.beginBitmapFill(fonDat, fonMtx, false, true);
//прямоугольник, обязательно
graphics.drawRect(fon.x - par.x / speed, fon.y - par.y / speed, temp.x, temp.y);
graphics.endFill();
//собственно вся итерация

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

Регистрация: May 2010
Сообщений: 543
Я поддержу, попробуйте scrollRect
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с)

Старый 03.01.2012, 23:32
crazyone вне форума Посмотреть профиль Отправить личное сообщение для crazyone Найти все сообщения от crazyone
  № 6  
Ответить с цитированием
crazyone
 
Аватар для crazyone

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Не уверен, но мне кажется, что bitmapData.draw будет быстрее, чем beginBitmapFill.

Причем если есть возможность отрисовывать содержимое контейнеров в одну битмапдату, то скорость должна сильно повыситься, т.к. плееру не прийдется обрабатывать наложение сложных дисплейобджектов.
__________________
aka doctorstal

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
по поводу
Цитата:
Не уверен, но мне кажется, что bitmapData.draw будет быстрее, чем beginBitmapFill.
BitmapData.draw x Graphics.beginBitmapFill
__________________
местонахождение

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

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
Всем большущее спасибо!!! Пошел пробовать

Старый 04.01.2012, 01:19
crazyone вне форума Посмотреть профиль Отправить личное сообщение для crazyone Найти все сообщения от crazyone
  № 9  
Ответить с цитированием
crazyone
 
Аватар для crazyone

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
Это конечно интересно, но его бенчмарки ни о чем не говорят. Он не рендерит контейнеры, в которые рисует, так что по сути все что происходит при beginBitmapFill() + drawRect() - разметка территории - где и что нарисовать. А сама отрисовка будет происходить только если добавить контейнеры на стейдж.

Либо попытаться отрисовать дисплейобджекты в какую-нибудь битмапу:

Код AS3:
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.utils.getTimer;
 
	/**
	 * ...
	 * @author DoctorSTaL
	 */
	public class Main extends Sprite {
		private var arr:Array;
		private var phase:int;
		private var _testMethods:Array;
		private var container:Sprite;
 
		public function Main():void {
			super.addEventListener(Event.ADDED_TO_STAGE, this.addedToStage);
		}
 
		private function addedToStage(event:Event = null):void {
			super.removeEventListener(Event.ADDED_TO_STAGE, this.addedToStage);
 
			// entry point
 
			_testMethods = new Array();
			_testMethods.push(testDraw);
			_testMethods.push(testBitmapFill);
 
			arr = new Array();
 
			container = new Sprite();
			for (var i:int = 0; i < 3000; i++) {
				var s:Shape = new Shape();
				s.graphics.beginFill(0xffffff * Math.random(), 1);
				s.graphics.drawEllipse(0, 0, 200, 100);
				s.graphics.endFill();
				var bdata:BitmapData = new BitmapData(200, 100, true, 0);
				bdata.draw(s);
				arr.push([s, bdata]);
 
				s.graphics.clear();
				container.addChild(s);
			}
			stage.addEventListener(MouseEvent.CLICK, this_clickHandler);
		}
		private function testDraw():void {
			var bdata:BitmapData = new BitmapData(200, 100);
			for (var i:int = 0; i < arr.length; i++) {
				bdata.draw(arr[i][1]);
			}
		}
 
		private function testBitmapFill():void {
			var s:Shape;
 
			for (var i:int = 0; i < arr.length; i++) {
				s = arr[i][0];
				s.graphics.clear();
				s.graphics.beginBitmapFill(arr[i][1]);
				s.graphics.drawRect(0,0,200, 100);
				s.graphics.endFill();
			}
 
			new BitmapData(200, 100, true, 0).draw(container);
		}
 
 
		private function this_clickHandler(event:MouseEvent):void {
			var time:uint = getTimer();
 
			_testMethods[phase]();
			trace("phase "+phase+":"+(getTimer() - time));
			phase = (phase + 1) % _testMethods.length;
		}
	}
}

Цитата:
phase 0:146
phase 1:3142
__________________
aka doctorstal

Старый 04.01.2012, 01:43
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 10  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
если фон не масштабируется, не поворачивается, и сдвигается на целые пиксели, то bitmapData.copyPixels даст наилучшую производительность
__________________
Хороший отдых - половина работы.


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

Теги
большая перерисовка , большие изображения , большой фон , движение фона , много фонов
Опции темы
Опции просмотра

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

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


 


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


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