Показать сообщение отдельно
Старый 29.12.2013, 19:04
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 1  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
По умолчанию Оптимизация эффекта "хвоста кометы"

В общем ситуация такая, есть мобильный проект на Box2D, в нем есть шар - снаряд, который управляется физикой. Решил применить к нему вот этот эффект, естественно пример приведенный там, перевел на ООП, получился такой класс:
Код AS3:
/**
 * http://www.FreeActionScript.com
 **/
package effects
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.BlurFilter;
	import flash.geom.ColorTransform;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import game.*;
 
	public class BlittTrailer extends Sprite
	{
		// canvas bitmap data var
		private var canvasBitmapData:BitmapData;
 
		// canvas bitmap - this will be added to the display list
		private var canvas:Bitmap;
 
		// canvas rectangle - used to save canvas size
		private var canvasRect:Rectangle;
 
		// circle (trailer) bitmap data
		private var circleBitmapData:BitmapData;
 
		// circle rectangle - used to save canvas size
		private var circleRect:Rectangle;
 
		// color transformer - used to make cavas transparent
		private var colorTransform:ColorTransform;
 
		private var _parent:DisplayObjectContainer;
		private var _ball:BallActor;
 
		public function BlittTrailer(parent:DisplayObjectContainer, ball:BallActor)
		{
			_parent = parent;
			_ball = ball;
			init();
		}
 
		public function init():void
		{
 
			// create main canvas bitmap data
			canvasBitmapData = new BitmapData(Main.screenX, Main.screenY, true, 0x333333);
			canvas = new Bitmap(canvasBitmapData);
			_parent.addChild(canvas);
			canvasRect = canvasBitmapData.rect;
			// create circle trailer bitmap data
			circleBitmapData = new BitmapData(10, 10, true, 0xFFFFFF);
			// draw CircleTrailer movieclip, linked from library, inside circle bitmap data
			circleBitmapData.draw(new CircleTrailer());
			// save circle rectangle size
			circleRect = canvasBitmapData.rect;
			// create ColorTransformer to modify alpha of bitmap
			colorTransform = new ColorTransform();
			// (make it 99% transparent)
			colorTransform.alphaMultiplier = .99;
		}
 
		public function removeTrailer():void
		{
			_parent.removeChild(canvas);
		}
 
		public function render():void
		{
			// lock bitmap data to prevent display from updating while we modify it
			canvasBitmapData.lock();
			// change alpha
			canvasBitmapData.colorTransform(canvasRect, colorTransform);
			// draw circle
			canvasBitmapData.copyPixels(circleBitmapData, circleRect, new Point(_ball.ball.x - 5, _ball.ball.y - 5), null, null, true);
			// apply blur filter
			canvasBitmapData.applyFilter(canvasBitmapData, canvasBitmapData.rect, new Point(0, 0), new BlurFilter(8, 8)); //3, 3
			// unlock bitmap data
			canvasBitmapData.unlock();
			if (!_ball.ball.stage)
				_parent.removeChild(canvas);
		}
 
	}
}
где _parent - контейнер где идет вся игра, _ball - шар к которому применяется спецэффект. Визуально все работает как надо, но повторяю проект мобильный и фпс при появлении на сцене такого снаряда падает в 2 раза. Как оптимизировать не знаю, буду рад любым идеям.

Добавлено через 41 секунду
И да - аппаратное ускорение пока не используется.

Добавлено через 14 минут
Сейчас попробовал включить
Код:
<renderMode>gpu</renderMode>
абсолютно ничем не помогло, только некоторые фильтры слетели(((